- •Анализ алгоритмов быстрого поиска в словаре
- •Часть 1. Теоретические сведения об алгоритмах…………………………….5
- •Часть 2. Экспериментальный анализ алгоритмов…………………………..14
- •Часть 1. Теоретические сведения об алгоритмах
- •1.1. Метод грубой силы.
- •1.2. Алгоритм Рабина.
- •1.3. Алгоритм Кнута - Морриса - Пратта (кмп).
- •1.4. Бинарный поиск.
- •1.5. Интерполяционный поиск.
- •1.6. 2-3-Деревья.
- •1.7. Алгоритм Хорспула.
- •1.8. В-деревья.
- •Часть 2. Экспериментальный анализ алгоритмов.
- •2.1. Суть эксперимента.
- •2.2. Результаты и анализ эксперимента.
- •Заключение.
- •Список использованной литературы:
2.2. Результаты и анализ эксперимента.
Эксперимент проводился для четырех алгоритмов – представителей классов алгоритмов. Так как все алгоритмы ставились в одинаковые условия, то можно провести их сравнительный анализ. Заметим, что данный анализ применим только для данных параметров поиска, и при иных условиях может отличаться.
Результаты эксперимента занесем в таблицу (Табл. 1).
Алгоритм |
Время выполнения | ||
Длина ≤10 |
Длина ≤100 |
Длина ≤250 | |
Послед. поиск |
15 |
93 |
234 |
Алгоритм Рабина |
15 |
63 |
93 |
КМП |
5 |
30 |
50 |
Хорспула |
31 |
31 |
32 |
Как и предполагалось, алгоритм Хорспула справился с экспериментальной задачей быстрее остальных. Следует, однако, заметить, что его эффективность растет лишь с увеличением длины строки и, соответственно, длины образца. Так при длине строки меньшей или равной 10 символов, он показал себя хуже, чем последовательный поиск. Аналогичные результаты показывает и алгоритм КМП, как для коротких, так и для длинных слов. Его можно использовать как универсальный, когда неизвестны длины строки и образца.
Алгоритм Рабина, при его схожести с последовательным работает быстрее, а его простота и малые трудозатраты на реализацию, делают его привлекательным для использования в неспециальных программах.
Наихудший результат показал алгоритм последовательного поиска. Как предполагалось лишь при небольшом увеличении длины строки, он работает в разы медленнее остальных алгоритмов.
Заключение.
Мы рассмотрели различные алгоритмы поиска подстроки в строке, сделали их анализ.
Результаты можно представить в таблице (Табл. 2).
Алгоритм |
Время на пред. обработку |
Среднее время поиска |
Худшее время поиска |
Затраты памяти |
Время работы (мс) при длине строки ≤250 |
Примечания |
Алгоритм прямого поиска |
Нет |
O((m-n+1) *n+1)/2 |
O((m-n+1)*n+1) |
Нет |
234 |
Mалые трудозатраты на программу, малая эффективность. |
Алгоритм Рабина |
Нет |
O(m+n) |
O((m-n+1)*n+1) |
Нет |
93 | |
КМП |
O(m) |
O(n+m) |
O(n+m) |
O(m) |
31 |
Универсальный алгоритм, если неизвестна длина образца |
Хорспула |
O(m+s) |
O(n+m) |
O(n*m) |
O(m+s) |
32 |
Алгоритмы этой группы наиболее эффективны в обычных ситуациях. Быстродействие повышается при увеличении образца или алфавита. |
Исходя из полученных результатов, видно, что алгоритм Хорспула является ведущим по всем параметрам, казалось бы, найден самый эффективный алгоритм. Но, как показывает эксперимент, алгоритм Кнута – Мориса - Пратта, превосходит алгоритм Хорспула на небольших длинах образца. Поэтому я не могу сделать вывод, что какой-то из алгоритмов является самым оптимальным. Каждый алгоритм позволяет эффективно действовать лишь для своего класса задач, об этом еще говорят различные узконаправленные улучшения. Алгоритм поиска слова в словаре следует выбирать только после точной постановки задачи, которые должна выполнять программа.
Сделав такой вывод, мы выполнили цель данной работы, т.к. для различных классов задач был выделен свой эффективный алгоритм.