1. РОССИЙСКАЯ АКАДЕМИЯ НАРОДНОГО ХОЗЯЙСТВА И
ГОСУДАРСТВЕННОЙ СЛУЖБЫ ПРИ ПРЕЗИДЕНТЕ
РОССИЙСКОЙ ФЕДЕРАЦИИ
Нижегородский институт управления
Кафедра информатики и информационных технологий
Введение в алгоритмы и
структуры данных
Ивина Наталья Львовна
доцент кафедры Информатики и ИТ
2. Тема 4. Алгоритмы поиска
Поиск заданного элемента в неупорядоченном массиве.
Поиск заданного элемента в упорядоченном массиве.
Дихотомический поиск.
Поиск заданной подпоследовательности в тексте (массиве).
3. Введение
Будем считать, что множество из N элементов задано в виде
массива целых чисел (int a[N]). Задача заключается в поиске
элемента a[i], равного заданному «аргументу поиска» x. Алгоритмы
поиска:
•Линейный поиск
•Линейный поиск с барьером
•Двоичный поиск (поиск делением пополам, бинарный поиск)
•Интерполяционный поиск
4. Поиск заданного элемента в
неупорядоченном массиве.
Линейный поиск
Если нет никакой дополнительной информации о разыскиваемых
данных, то очевидный подход - простой последовательный
просмотр массива. Такой метод называется линейным поиском.
Условия окончания поиска таковы:
1) элемент найден, т.е. a[i] = x;
2) весь массив просмотрен, и совпадения не обнаружено.
8. Поиск заданного элемента в
неупорядоченном массиве.
Линейный поиск.
Оценка сложности.
Длина массива - N элементов
Число сравнений:
лучший случай - 1
худший случай - N
средний случай - N/2
Временная сложность: O(N).
Если данные не отсортированы, то последовательный поиск
является единственным возможным методом поиска!!!
9. Поиск заданного элемента в
неупорядоченном массиве.
Линейный поиск.
Преимущества:
• Не требует сортировки значений множества.
• Не требует дополнительного анализа функции.
• Не требует дополнительной памяти.
Следовательно, может работать в потоковом режиме при
непосредственном получении данных из любого источника.
Недостатки:
• Малоэффективен по сравнению с другими алгоритмами
поиска.
Следовательно, используется, если множество содержит
небольшое количество элементов
10. Поиск заданного элемента в
неупорядоченном массиве.
Линейный поиск с барьером.
В конец массива поместим дополнительный элемент со значением
x. Назовем такой вспомогательный элемент «барьером» - он
ограждает нас от выхода за границу массива. В этом случае
размер массива увеличится на единицу, а сам массив будет
описываться так: int a[N+1].
13. Поиск заданного элемента в
упорядоченном массиве.
Дихотомический поиск.
Дихотомический поиск - метод быстрого поиска, при котором
упорядоченный набор данных разделяется на две части и
операция сравнения всегда выполняется для среднего элемента
списка: после сравнения одна половина списка отбрасывается и
операция выполняется для оставшейся половины и т.д.
Временная сложность: O(log2n).
14. Поиск заданного элемента в
упорядоченном массиве.
Двоичный поиск (поиск делением
пополам, бинарный поиск)
Основная идея – выбрать случайным образом некоторый
элемент a[m], и сравнить его с аргументом поиска x.
Если a[m] = x, то поиск заканчивается;
если a[m] > x, то продолжаем искать x в левой от a[m] части
массива;
если a[m] < x, то продолжаем искать x в правой от a[m] части
массива.
15. Поиск заданного элемента в
упорядоченном массиве. Двоичный
поиск (поиск делением пополам,
бинарный поиск). Алгоритм.
1. Определим L и R как левую и правую границу интервала поиска
соответственно.
2. Выберем произвольное m, лежащее между L и R, т.е. L ≤ m ≤ R.
3. Сравним x с элементом массива a[m]; если они равны, то алгоритм
завершен, иначе выполняем шаг 4.
4. Если x > a[m], то изменяем левую границу интервала: L = m+1,
иначе изменяем правую границу интервала: R = m–1.
5. Если интервал не пуст, т.е. L ≤ R, идем на шаг 2.
16. Поиск заданного элемента в
упорядоченном массиве.
Двоичный поиск (поиск делением
пополам, бинарный поиск).
Оценка эффективности.
Выбор m произволен в том смысле, что корректность алгоритма от
него не зависит.
Однако выбор m влияет на эффективность алгоритма.
Оптимальное решение - выбор среднего элемента, так как при
этом в любом случае будет исключаться половина интервала.
Число сравнений:
в лучшем случае = 1
в худшем случае = log n.
17. Поиск заданного элемента в
упорядоченном массиве.
0 1 2 3 4 5 6 7 8 9
L m R
01 05 09 11 16 17 20 24 34 48
34
Двоичный
поиск. Пример 1.
L = 0, R = 9,
m = (0 + 9) / 2 = 4
0 1 2 3 4 5 6 7 8 9
L m R
01 05 09 11 16 17 20 24 34 48
34
L = 5, R = 9,
m = (5 + 9) / 2 = 7
0 1 2 3 4 5 6 7 8 9
L=m R
01 05 09 11 16 17 20 24 34 48
34
L = 8, R = 9,
m = (8 + 9) / 2 = 8
Результат поиска положителен. Искомое число обнаружено на 9 месте.
18. Поиск заданного элемента в
упорядоченном мДваосисчинвыей.
0 1 2 3 4 5 6 7 8 9
L m R
01 05 09 11 16 17 20 24 34 48
02
0 1 2 3 4 5 6 7 8 9
L m R
01 05 09 11 16 17 20 24 34 48
02
0 1 2 3 4 5 6 7 8 9
L=m=R
01 05 09 11 16 17 20 24 34 48
02
поиск.
Пример 2.
L = 0, R = 9,
m = (0+9)/2= 4
L = 0, R = 3,
m = (0+3)/2= 1
L = 0, R = 0,
m = (0+0)/2= 0
Здесь L стало равно единице, R осталось равным нулю, т.е. L > R,
следовательно, искомого числа нет в данном массиве.
21. Поиск заданного элемента в
упорядоченном массиве. Двоичный
поиск. Пример к блок-схеме 2.
0 1 2 3 4 5 6 7 8 9
L m R
01 05 09 11 16 17 20 24 34 48
34
0 1 2 3 4 5 6 7 8 9
L m R
01 05 09 11 16 17 20 24 34 48
34
0 1 2 3 4 5 6 7 8 9
L=m R
01 05 09 11 16 17 20 24 34 48
34
0 1 2 3 4 5 6 7 8 9
L=m=R
01 05 09 11 16 17 20 24 34 48
34
L = 0, R = 9,
m = (0 + 9) / 2 = 4
L = 5, R = 9,
m = (5 + 9) / 2 = 7
L = 8, R = 9,
m = (8 + 9) / 2 = 8
L = 8, R = 8,
m = (8 + 8) / 2 = 8
22. Поиск заданного элемента в
упорядоченном массиве.
Интерполяционный поиск.
От двоичного поиска отличается лишь выбором m.
Если закон возрастания элементов массива линейный
(a[m] ≈ km + b), то индекс m определяется из соотношения
23. Поиск заданного элемента в
упорядоченном массиве.
Интерполяционный поиск.
В общем случае, если закон возрастания элементов имеет вид
a[m] ≈ f[m], индекс m определяется из соотношения
В остальном интерполяционный поиск работает так же, как и
линейный, т.е. алгоритм и блок-схемы везде, кроме выбора m,
остаются без изменений.
24. Поиск заданной
подпоследовательности в
тексте (массиве). Поиск
подстроки в строке.
Пусть задана строка S из N элементов и строка Р из M элементов.
Описаны они так:
string S[N], P[M];
Задача поиска подстроки P в строке S заключается в нахождении
первого слева вхождения P в S, т.е. найти значение индекса i,
начиная с которого
S[i] = P[0], S[i + 1] = P[1],…, S[i + M – 1] = P[M – 1].
25. Поиск заданной
подпоследовательности в тексте
(массиве). Поиск подстроки в
строке. Прямой поиск подстроки в
строке. Алгоритм
1. Установить i на начало строки S, т.е. i = 0.
2. Проверить, не вышло ли i + M за границу N строки S. Если да, то
алгоритм завершен (вхождения нет).
3. Начиная с i-го символа s, провести посимвольное сравнение
строк S и Р, т. е. S[i] и P[0], S[i+1] и P[1],…,
S[i + M – 1] и P[M – 1].
4. Если хотя бы одна пара символов не совпала, то увеличить i и
повторить шаг 2, иначе алгоритм завершен (вхождение
найдено).
26. н а д в о р е т р а в а , н а т р а в е д р о в а
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
т р а в е
Пример
27. Поиск подстроки в строке.
Блок-схема 1
Комментарий: используется
дополнительная переменная
flag, которая явно изменяет
свое значение с 0 на 1 при
обнаружении вхождения
образца P в текст S
28. Поиск подстроки в строке.
Блок-схема 2
Комментарий: используется
тот факт, что при j = M мы
дошли до конца образца P,
тем самым обнаружив его
вхождение в строку S
29. Поиск заданной
подпоследовательности в тексте
(массиве). Поиск подстроки в
строке.
Алгоритм работает достаточно эффективно, если при сравнении образца
P с фрагментом текста S довольно быстро выявляется несовпадение
(после нескольких сравнений во внутреннем цикле).
Это случается довольно часто, но в худшем случае (когда в строке часто
встречаются фрагменты, во многих символах совпадающие с образцом)
производительность алгоритма значительно падает.
Пример:
S: учить, учиться, учитель
P: учитель
Notas del editor
Результат поиска положителен. Искомое число обнаружено на девятом месте.