Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технологии Программирования. 7 лекция

.pdf
Скачиваний:
13
Добавлен:
27.05.2015
Размер:
258.27 Кб
Скачать

Например, Дано множество из N=21 элемента. Найти элемент (ключ) k=61.

Шаг 1.

Середина массива = [21/2] =10,

условиеA[10] = = k не выполняется, поэтому массив сокращается попалам. ЕслиA[10] > k, оставляем подмассив слева.

ЕслиA[10] < k, оставляем подмассив справа.

0

1

2

3

4

5

6

7

8

9

10

11

12

12

14

15

16

17

18

19

20

7

8

12

16

18

20

30

38

49

50

60

61

69

75

79

80

81

95

96

98

99

 

 

 

 

 

 

 

 

 

 

Шаг 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

11

12

12

14

15

16

17

18

19

20

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Шаг 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

60

61

69

75

79

80

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Шаг 4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

60

61

69

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Шаг 5 условиеA[11] = = k истинно

Код программы – две функции 1 функция

int Binary_Search(int A[], int size, int n)

{

int Left, Right, Middle;

Left=0; Right=n-1; Middle=(Left+Right)/2;

while( Left<= Right )

{ /* если элемент найден, то функция возвращает его номер */ if (A[ Middle ] = = n) return Middle;

/* если элемент левее середины, то уменьшаем правую границу,

В противном случае увеличиваем левую границу

*/

if (A[ Middle ] > n) Right=Middle - 1;

else Left = Middle + 1; // находи середину подмассива

Middle=(Left+Right)/2;

}

return -1;

/* если элемент массива не найден возвращаем -1 */

}

Самостоятельно напишите вызывающую программу main.

Скорость сходимости алгоритма

log2 (N)

3. Фибоначчиев поиск

Фибоначчиев поиск изобретен Д.Фергюсоном в

1960.

В этом методе анализируются элементы,

находящиеся в позициях, равных числам

Фибоначчи.

 

 

 

Числа Фибоначчи:

Fn = Fn1

+ Fn2 , n >1

 

F0 = 0, F1

1

Последовательность

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,..

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

Дано множество из N=18 элемента.

Найти элемент (ключ) k=33.

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

[10]

[11]

[12]

[13]

[14]

[15]

[16]

[17]

[18]

3

5

8

9

11

14

15

19

21

22

28

33

35

37

42

45

48

52

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[1]

[2]

[3]

[4]

[5]

[6]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

19

21

22

28

33

35

 

 

 

 

 

Шаг 1

Число Фибоначчи = 1, сравниваем ключ с элементом на 1-ой позиции k >A[1] (33> 3) – истина, сравнение продолжается

Шаг 2

Число Фибоначчи = 3, сравниваем ключ с элементом на 3-й позиции k >A[3] (33>8) - истина, сравнение продолжается

Шаг 3

Число Фибоначчи = 5, сравниваем ключ с элементом на 3-й позиции k >A[5] (33>11) – истина, сравнение продолжается

Шаг 4

Число Фибоначчи = 8, сравниваем ключ с элементом на 3-й позиции k >A[8] (33>19) – истина, сравнение продолжается

Шаг 5

Число Фибоначчи =13, сравниваем ключ с элементом на 18-й позиции k >A[13] (33>35) – ложь,

найден интервал, в котором находится искомый элемент. Это интервал от

8 до 13 позиции.

В найденном интервале поиск вновь ведется в позициях, равных числам

Фибоначчи.

Самостоятельно написать программный код.

Для тех, кто интересуется математической основой

упомянутых методов:

Д.Кнут "Искусство программирования для ЭВМ", 1978, издательство "МИР", том 3 "Сортировка и поиск".

Р.Альсведе, И.Вегенер "Задачи поиска" , 1982, Издательство "Мир"