Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2-й семестр / Лекция 4 - Тема 6 - Алгоритмы поиска в массивах.pptx
Скачиваний:
52
Добавлен:
02.06.2020
Размер:
52.08 Mб
Скачать

ОЗВУЧЕННАЯ ПРЕЗЕНТАЦИЯСтруктуры и

ДЛЯ ВОСПРОИЗВЕДЕНИЯ ЗВУКА НАЖМИТЕалгоритмы

ЗНАЧОК обработки данных

Грушицын Александр Степанович

Старший преподаватель МИРЭА

nicifor@bk.ru

Алгоритмы поискаТЕМА 6 в массивах

ЗАДАЧА ПОИСКА. КЛАССИФИКАЦИЯ АЛГОРИТМОВ ПОИСКА (АЛГОРИТМЫ, ИСПОЛЬЗУЮЩИЕ КЛЮЧИ И АЛГОРИТМЫ, ОСНОВАННЫЕ НА ЦИФРОВЫХ СВОЙСТВАХ КЛЮЧЕЙ).

ПОСЛЕДОВАТЕЛЬНЫЙ ПОИСК. БИНАРНЫЙ ПОИСК. ФИБОНАЧЧИЕВ ПОИСК. ИНТЕРПОЛЯЦИОННЫЙ ПОИСК. ИСПОЛЬЗОВАНИЕ БИНАРНОГО ДЕРЕВА ПОИСКА. ВЫЧИСЛИТЕЛЬНАЯ СЛОЖНОСТЬ АЛГОРИТМОВ ПОИСКА.

Задача поиска в структурах данных

Поиск необходимой информации в списке – одна из задач теоретического программирования.

Дано: фиксированная последовательность a = a1, a2, a3, …, an и "ключ" x искомого элемента.

Необходимо: определить, входит ли элемент с ключем x в последовательность a и, если входит, индекс элемента key(ai) = x.

Пример:

Входные данные: a = 5, 3, 8, 9, 4 , x = 9. Выходные данные: элемент x найден, индекс i = 4.

3

КЛАССИФИКАЦИЯ АЛГОРИТМОВ ПОИСКА

Все методы делятся на статические и динамические.

При статическом поиске массив значений не меняется во время работы алгоритма. Если Вы ищете слово в словаре, то алгоритм будет статическим, так как сам словарь ( массив слов ) не будет изменяться во время поиска.

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

 

КЛАССИФИКАЦИЯ АЛГОРИТМОВ ПОИСКА

 

Методы

поиска

можно

разделить

на

использующие истинные ключи и на работающие

по преобразованным ключам.

«Ключем» называют значение, которое нужно

найти.

Поиск в колоде карт - поиск по истинным ключам,

то есть имеете дело с тем, что есть. Поиск в

словаре - поиск по преобразованным ключам, так как все слова отсортированы в алфавитном порядке, то есть массив значений изменен перед началом поиска.

КЛАССИФИКАЦИЯ АЛГОРИТМОВ ПОИСКА

В методе хэширования надо найти определенную карту в колоде. Для этого придумали функцию,

которая вычисляет номер нужной карты в колоде.

Например f ("крестовая дама") = 5 , а f("туз

пик")=12. То есть, подставив в функцию искомое

значение, мы получаем местоположение этого

значения в нашем массиве. Функция f(К) должна определять ОДНОЗНАЧНОЕ соответствие для каждого

значения в массиве, а находить подобные функции

довольно сложно.

Алгоритм последовательного поиска

x = 11

i = 1

i = 2

i = 3

i = 4

i = 5

i = 6

16

7

10

1

5

11

3

8

14

4

2

12

6

13

9

15

16

7

10

1

5

11

3

8

14

4

2

12

6

13

9

15

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

7

10

1

5

11

3

 

14

4

2

12

6

13

9

15

xx

16

7

10

1

5

11

3

8

14

4

2

12

6

13

9

15

x

x

x

 

 

 

 

 

 

 

 

 

 

 

 

 

16

7

10

1

5

11

3

8

14

4

2

12

6

13

9

15

x

x

x

x

 

 

 

 

 

 

 

 

 

 

 

 

16

7

10

1

5

11

3

8

14

4

2

12

6

13

9

15

x

x

x

x

x

 

 

 

 

 

 

 

 

 

 

 

7

Алгоритм последовательного поиска (псевдокод)

x = 11

LINEAR_SEARCH(a, x) 1 i ← 1

2 while i n и ai x do

3i i + 1

4 if i > n then i ← 0

5 return i

Алгоритм не предъявляет никаких требований к последовательности, в которой производится поиск.

i = 1

16

7

10

1

5

11

3

8

14

4

2

i = 2

16

7

10

1

5

11

3

8

14

4

2

 

x

 

 

 

 

 

 

 

 

 

 

i =

 

7

10

1

5

11

3

8

14

4

2

 

 

x

 

 

 

 

 

 

 

 

 

i = 4

16

7

10

1

5

11

3

8

14

4

2

 

x

x

x

 

 

 

 

 

 

 

 

i = 5

16

7

10

1

5

11

3

8

14

4

2

 

x

x

x

x

 

 

 

 

 

 

 

i = 6

16

7

10

1

5

11

3

8

14

4

2

 

x

x

x

x

x

 

 

 

 

 

 

8

Алгоритм последовательного поиска (худший случай)

 

Поиск последнего элемента

 

 

Поиск несуществующего

 

 

 

 

 

 

 

элемента

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

7

10

1

5

11

3

8

14

4

2

16

7

10

1

5

11

3

8

14

4

2

x x

x x

x

x x

x

x x

 

x x

x x

x

x x

x x x x

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

Это значит, что в худшем случае потребуется выполнить n сравнений, где n – количество элементов в последовательности.

Таким образом вычислительная сложность алгоритма последовательного поиска в наихудшем случае – O(n).

9

Алгоритм последовательного поиска (худший случай) (2)

LINEAR_SEARCH(a, x)

Время

Кол-во

1

i ← 1

c1

1

2

while i n и

c2

n + 1

3

ai x do

c3

n

4

i i + 1

c4

n

5

if i > n then i ← 0

c5

1

6

return i

c6

1

Tп(худш)(n) = c1 + c2∙(n + 1) + c3n + c4n + c5 + c6 = O(n)

10