Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы / Глава 6_Поиск.doc
Скачиваний:
73
Добавлен:
15.02.2015
Размер:
1.1 Mб
Скачать

6.2. Бинарный поиск в упорядоченной таблице

Стратегия бинарного поиска основана на получении максимальной информации от каждого сравнения. Последнее имеет место, если любой вариант ответа на правильно поставленный при поиске вопрос вдвое уменьшает число дальнейших сравнений при наихудшем раскладе ключей. Степень быстро растёт с увеличением, а соответствующая область поиска, оцениваемая числом, так же быстро уменьшается (см. [16]). При делении области поиска пополам количество сравнений является величиной порядка(точнее, оно равно этому логарифму, округлённому до ближайшего целого, то есть это либо, либо).

Правильный вопрос, ответ на который уменьшает (упорядоченную!) область поиска вдвое, звучит так: слева или справа от середины текущей области поиска лежит искомый ключ?

Алгоритм бинарного поиска содержит следующие этапы.

Ш1. Начальные присваивания:

—указатель левой границы области поиска;

—указатель правой границы области поиска.

Ш2. — номер, делящий область поиска

приблизительно пополам.

Ш.3. Сравнение ключей и; при этом:

если , то

—новая правая граница, так как иско-

мый ключ лежит слева от ;

левая граница сохраняется;

переход к Ш.2;

если , то

—новая левая граница, так как искомый

ключ лежит справа от ;

правая граница сохраняется;

переход к Ш.2;

если , то поиск завершён.

NB: Целесообразен именно такой порядок сравнений и, поскольку равенство может иметь место только один раз, а в остальных случаях сразу сработает переход к суженной области поиска.

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

В данном алгоритме много сходства с поиском корня функции методом деления отрезка пополам.

Если число записей удовлетворяет неравенству, то число необходимых сравнений в худшем случае равно.

6.3. Поиск Фибоначчи в упорядоченной таблице

При поиске Фибоначчи с индексами массива производятся только сложения и вычитания, без применения более медленной операции деления пополам и взятия целой части.

Пусть сначала число ключей на единицу меньше некоторого числа Фибоначчи:. С ключом поиска в первый раз сравнивается ключ, имеющий номер. Если от него надо переходить в правую область бóльших значений, то «длинный» шаг перехода вправо равен; переход в левую область меньших значений производится на «короткий» шаг. Поскольку когда-нибудь шаг перехода окажется равнымили, то есть единице, останется проверить соседний элемент.

Ввиду рекурсивной структуры последовательности чисел Фибоначчи, всякий раз достаточно помнить только текущую тройку чисел . Следующая тройка, со сдвигом номеров на единицу, получается из предыдущей:

.

Номера ключей, выбираемых для сравнения, образуют дерево Фибоначчи порядка , или, для краткости, Ф-дерево, которое определяется рекурсивно следующим образом:

- если или, то дерево является листом с номером;

- если , то корнем дерева является элемент с номером; левое поддерево является Ф-деревом порядкасо номером корня; правое поддерево является Ф-деревом порядкас номером корня.

Связь Ф-дерева с поиском: значение узла — номер очередного элемента, сравниваемого с ключом поиска . Левый и правый непосредственные потомки его — возможный номер следующего сравниваемого элемента в зависимости от результата текущего сравнения. Значенияилевого и правого непосредственных потомков внутреннего узлаотличаются от него на величину являющуюся числом Фибоначчи:. Например, при:

.

Если разница значений узла и его непосредственных потомков на каком-либо уровне составляла , то на следующем уровне для потомков на левой ветви она составит, а для потомков правой ветви —.

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

На рис. 40 приведено Ф-дерево порядка 6 с корнем для поиска в массиве изэлементов ().

Рис. 40.

Алгоритм поиска Фибоначчи.

Ш1. Начальные установки: .

Ш2. Если , то

перейти к шагу Ш3;

если , то

перейти к шагу Ш4;

если , то ключ найден, алгоритм завершается.

Ш3. Переход влево, то есть уменьшение :

если , то

ключ не найден, и алгоритм завершается;

;

—изменение шага путём

сдвига чисел Фибоначчи на один номер.

.

(Три последних присваивания можно выразить присваиванием значения паре: , где справа от знакастоят прежние значения, а слева — новые).

Возврат к Ш2.

Ш4. Переход вправо, то есть увеличение :

если , то ключ не найден, и алгоритм завершается;

;

; — изменение шага путём сдвига

чисел Фибоначчи на один номер (в

изменении участвует уже новое зна-

чение ).

Возврат к Ш2.

Пример. Рассмотрим, как происходит поиск в массиве

6

8

14

17

20

22

28

31

32

40

42

43

48

55

62

67

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

68

80

82

87

17

18

19

20

Здесь .

Пусть ключ поиска равен 28.

1) ;кШ3;

2) ;кШ3;

3) ;кШ4;

4) ;ключ найден.

Пусть ключ поиска равен 39 (в массиве отсутствует).

1) ;к Ш3;

2) ;кШ4;

3) ;кШ3;

4) ;кШ3;

5) ;кШ4.

6) Поскольку , ключ не найден.

Если не является числом Фибоначчи, начальные установки модифицируются следующим образом. Находится минимальноетакое, чтооказывается некоторым числом Фибоначчи:. На предварительном шагеШ1 устанавливается . В начало шагаШ2 вставляется условие “если , то перейти к шагуШ4.” Алгоритм циклического получения новых индексов сдвигает поиск влево на, и на завершающем этапе, как и раньше, приводит к концевым листьям.

Пример.

6

8

14

17

20

22

28

31

32

40

42

43

48

55

62

67

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

68

80

82

87

90

91

95

97

99

102

105

110

111

130

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Здесь .

Пусть ключ поиска равен 28.

1) ;;кШ3;

2) ;кШ3;

3) ;кШ4;

4) ;ключ найден.