team-work-it-jimbeez

0
5 месяцев назад
4 месяца назад
4 месяца назад
4 месяца назад
5 месяцев назад
4 месяца назад
README.md

я выполнил студент 2 в carpe1

https://gitverse.ru/urfu_itis_limits/team-work-it-Carpe1

Отчёт по проекту "Анализатор производительности алгоритмов" Привет! Хочу поделиться с тобой результатами моей работы над проектом по анализу производительности алгоритмов на C#. Это была действительно интересная задача, где мне удалось не только реализовать различные алгоритмы, но и создать целую систему для их сравнения и тестирования.

Что получилось в итоге Я создал консольное приложение, которое позволяет тестировать и сравнивать пять ключевых алгоритмов:

Линейный поиск - простой перебор элементов

Бинарный поиск - эффективный поиск в отсортированных данных

Сортировка пузырьком - классический, но медленный алгоритм

Быстрая сортировка - один из самых эффективных алгоритмов на практике

Сортировка слиянием - стабильный алгоритм с гарантированной сложностью O(n log n)

Архитектура проекта Я построил систему по принципам ООП, что позволило сделать код чистым и расширяемым. Вот как всё устроено:

Основные классы: Algorithm - базовый класс, от которого наследуются все алгоритмы. Он содержит общую логику: подсчёт сравнений, измерение времени выполнения и определение эффективности.

SearchAlgorithm и SortingAlgorithm - абстрактные классы для алгоритмов поиска и сортировки соответственно. Они определяют общий интерфейс для всех конкретных реализаций.

Конкретные реализации алгоритмов - каждый алгоритм реализован в отдельном классе (LinearSearch, BinarySearch и т.д.). Особенно интересно было работать с рекурсивными алгоритмами - QuickSort и MergeSort.

Вспомогательные компоненты: DataGenerator - отвечает за создание тестовых данных. Может генерировать как случайные массивы, так и отсортированные, что позволяет тестировать алгоритмы в разных условиях.

AlgorithmAnalyzer - "мозг" системы. Этот класс управляет всем процессом тестирования: создаёт данные, запускает алгоритмы, собирает метрики и выводит результаты.

Как это работает на практике Когда запускаешь программу, появляется меню с семью опциями. Можно выбрать любой алгоритм для тестирования или запустить сравнение всех сразу.

Пример работы: Допустим, я хочу сравнить все алгоритмы на массиве из 5000 случайных чисел. Программа:

Генерирует массив

Последовательно запускает каждый алгоритм

Для каждого измеряет время выполнения и количество сравнений

Выводит красивую таблицу с результатами

Интересно наблюдать, как отличаются результаты! Сортировка пузырьком на 5000 элементах может занимать сотни миллисекунд, а быстрая сортировка - всего несколько миллисекунд. Бинарный поиск почти мгновенный, если массив отсортирован.

Особенности реализации Подсчёт сравнений В каждый алгоритм я встроил счётчик сравнений. Это было не так просто, особенно в рекурсивных алгоритмах, где нужно было аккуратно инкрементировать счётчик на каждом шаге.

Измерение времени Использовал Stopwatch из пространства имён System.Diagnostics - самый точный способ измерения времени в .NET. Важно было минимизировать накладные расходы самой системы измерения.

Обработка граничных случаев Программа проверяет корректность ввода пользователя:

Размер массива должен быть от 100 до 100 000 элементов

Тип данных только "random" или "sorted"

Для бинарного поиска автоматически сортируется массив, если он не отсортирован

Пользовательский интерфейс Сделал интуитивно понятное консольное меню с обработкой ошибок ввода. Пользователь может вводить искомое значение для алгоритмов поиска или оставить поле пустым для случайного значения.

Что было сложного Самым интересным вызовом была реализация MergeSort. Пришлось аккуратно работать с временными массивами и слиянием, чтобы не накосячить с индексами. Также нужно было следить за тем, чтобы рекурсивные вызовы не приводили к переполнению стека на больших массивах.

Ещё одна задача - сделать так, чтобы тестирование одного алгоритма не влияло на результаты других. Для этого каждый раз создаётся копия исходного массива.

Что получилось хорошо Мне нравится, как организована архитектура. Если захочу добавить новый алгоритм (например, сортировку кучей), мне нужно просто создать новый класс-наследник SortingAlgorithm и реализовать метод Sort(). Всё остальное (измерение времени, подсчёт сравнений, вывод результатов) уже работает.

Также горжусь системой оценок эффективности. Алгоритмы автоматически получают оценку "Excellent", "High", "Medium", "Low" или "Very Low" в зависимости от времени выполнения.

Как можно улучшить В будущем можно было бы:

Добавить графическое представление результатов (графики зависимостей времени от размера массива)

Реализовать многопоточное тестирование для ускорения сравнения всех алгоритмов

Добавить сохранение результатов в файл для последующего анализа

Реализовать тестирование на уже отсортированных, обратно отсортированных и частично отсортированных данных

Вывод Этот проект стал для меня отличной практикой в ООП, алгоритмах и работе с производительностью. Я не только закрепил理论知识 об алгоритмах, но и увидел на практике, как сильно они отличаются по скорости на разных объёмах данных.

Особенно поразила разница между BubbleSort и QuickSort - теоретическое знание о сложности O(n²) vs O(n log n) стало осязаемым, когда я увидел, что на 10 000 элементах BubbleSort работает в десятки раз медленнее.

В общем, получился полезный инструмент, который действительно помогает понять эффективность разных алгоритмов!