31
Хакасский государственный университет им. Н.Ф. Катанова Структуры и алгоритмы обработки данных Лекция: Поиск. Бинарный поиск. Деревья поиска. Николай Гребенщиков, www.grebenshikov.ru

Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Embed Size (px)

Citation preview

Page 1: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Хакасский государственный университет им. Н.Ф. Катанова

Структуры и алгоритмы обработки данных

Лекция: Поиск. Бинарный поиск. Деревья

поиска.

Николай Гребенщиков, www.grebenshikov.ru

Page 2: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Задача поиска - очень широкая.

Дано: множество элементов.

Найти: подмножество по заданным критериям поиска.

Что можно искать? Какие могут быть критерии поиска?

1

Page 3: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Из чего складывается время работы поиска - T (n)

• Tprepare(n) - подготовительная часть - организация струк-туры данных для множества элементов

• Tfind(n) - сам поиск - время работы алгоритма поиска

2

Page 4: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Поиск по ключу

1 class SomeData<K,D> {2 K key;3 D data;4 }

Дано: множество элементов с заданным ключом. Условие:на множестве возможных ключей можно установить отношеепорядка.

Найти: подмножество элементов с ключом равным заданно-му.

3

Page 5: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Наивный алгоритм

1 D find(K key) {2 for (int i=0; i<length; i++) {3 if (datas[i].key == key) {4 return datas[i].data5 }6 }7 return null;8 }

Tprepare(n) = 0

Tfind(n) = Θ(n)

4

Page 6: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарный поиск - алгоритм поиска элемента x в отсорти-рованном списке A длинны n.

1. Сравнить x c A [bn/2c], если x = A [bn/2c], то мы нашли.

2. Запустить рекурсию поиска с подсписком [0, bn/2c − 1],если x < A [bn/2c] иначе с подсписком [bn/2c+ 1, n + 1]

5

Page 7: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарный поиск

A:0 1 2 3 4 5 6 7 8 91 2 32 47 63 64 86 89 91 95

Найти x = 64

1. [0, 9] : x > A[4] = 63

2. [5, 9] : x < A[7] = 89

3. [5, 6] : x < A[6] = 86

4. [5, 5] : x = A[5] = 64 - Успех

6

Page 8: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарный поиск

A:0 1 2 3 4 5 6 7 8 91 2 32 47 63 64 86 89 91 95

Найти x = 53

1. [0, 9] : x < A[4] = 63

2. [0, 3] : x > A[2] = 32

3. [3, 3] : x 6= A[3] = 47 - Провал

7

Page 9: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарный поиск - http://algolist.manual.ru

1 int function binarySearch (Array A, int lB, int uB, K key) {2 while (true) {3 M = (Lb + Ub)/2;4 if (key < A[M]) then5 Ub = M - 1;6 else if (Key > A[M]) then7 Lb = M + 1;8 else9 return M;10 if (Lb > Ub) then11 return -1;12 }13 }

8

Page 10: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарный поиск - Скорость работы

• Tprepare(n) = O(log(n)) или O(n) - зависит от способа сор-тировки - разберем позже.

• Tfind(n) = O(log(n)) - докажем сейчас.

T (n) = T (n/2) + Θ(1)

Используем основной метод:

nlog21 = n0 = 1 = Θ(1) = f(n)⇒ Второй случай

⇒ T (n) = Θ(log(n))

9

Page 11: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Двоичное/бинарное дерево поиска (англ. binary search tree,BST) - это двоичное дерево, для которого выполняются сле-дующие дополнительные условия:

• У всех узлов левого поддерева произвольного узла X зна-чения ключей меньше, нежели значение ключа узла X.

• У всех узлов правого поддерева произвольного узла X

значения ключей не меньше, нежели значение ключа узлаX.

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

10

Page 12: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарное дерево поиска - Пример

11

Page 13: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

АТД Бинарное дерево поиска

1 class SearchTreeNode<T> {2 public Comparable key;3 public T value;4 }5 interface SearchTree<T> {6 void insert(SearchTreeNode<T> node);7 void remove(Comparable key);8 SearchTreeNode<T> find(Comparable key);9 }

12

Page 14: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарное дерево поиска - Поиск1 public SearchTreeNode<T> find(Comparable key) {2 findNode(root);3 }4 private SearchTreeNode<T> findNode(SearchTreeNode<T> node,5 Comparable key) {6 if (null == node) return null;7 int comparingResult = key.compareTo(node.key);8 if (0 == comparingResult) {9 return node;10 } else if (comparingResult < 0) {11 return findNode(node.left, key);12 } else {13 return findNode(node.right, key);14 }15 }

13

Page 15: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарное дерево поиска - Пример

14

Page 16: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарное дерево поиска - Вставка

1. Найти место для вставки, используя алгоритм поиска.

2. Вставить.

15

Page 17: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарное дерево поиска - Скорость работы

Tinsert(n) = O(H(n))

Tprepare(n) = O(n ·H(n))

Tfind(n) = O(H(n))

H(n) - высота дерева. H(n) =?

16

Page 18: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарное дерево поиска

Высота дерева зависит от данных и последовательности за-полнения им дерева.

Например: H(n) = n

Тогда: Tprepare(n) = O(n2), Tfind(n) = O(n)

17

Page 19: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Бинарное дерево поиска - Примеры высот

• Для полного дерева - H(n) = log2(n)

• Для случайного дерева (равномерное распределение) -H(n) = O(log(n)) - доказательство, можно взять как до-клад на семинар.

18

Page 20: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Сбалансированные деревья поиска - это деревья поиска,структура которых поддерживается приближенной к стурк-туре полного дерева, и высота таких деревьев равна O(log(n)).Методы поддержания баланса бинарных деревьев поиска:

• АВЛ-дерево

• 2-3-дерево (доклад на семинар)

• Красно-черные деревья (доклад на семинар)

• и другие (доклады на семинаре)

19

Page 21: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

АВЛ-дерево - сбалансированное по высоте двоичное деревопоиска: для каждой его вершины высота её двух поддеревьевразличается не более чем на 1.

Оно названо по первым буквам фамилий его изобретателей,Г. М. Адельсона-Вельского и Е. М. Ландиса, которые впер-вые предложили использовать АВЛ-деревья в 1962.

20

Page 22: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Пример АВЛ-дерева

21

Page 23: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Пример не АВЛ-дерева

22

Page 24: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

АВЛ-дерево - скорость работы.

Найдем высоту дерева - H(n).

1. Пусть N(h) - минимальное количество узлов для АВЛ-дерева высотой h.

2. N(h) = 1 + N(h − 1) + N(h − 2) ⇒ N(h) > Fh, где Fh - h-ечисло Фиббоначи.

3. Известно, что Fh = ϕh√

5, тогда N(h) > ϕh

√5⇒ H(n) < logϕ(n ·

√5)

4. H(n) = O(log(n))

23

Page 25: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

АВЛ-дерево - скорость работы.

Tprepare(n) = O(n · log(n))

Tfind(n) = O(log(n))

24

Page 26: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Механизм поддержание сбалансированности АВЛ-дерева- изменение структуры дерева при добавлении и удаленииэлементов.

Повороты:

• Левый

• Правый

• Лево-правый

• Право-левый

25

Page 27: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

АВЛ-дерево: правый поворот

26

Page 28: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

АВЛ-дерево: правый поворот

1 private AvlSearchTreeNode<T> rotateR(AvlSearchTreeNode<T> node) {2 AvlSearchTreeNode<T> result = node.left;3 node.left = result.right;4 result.right = node;5 result.updateHeight();6 node.updateHeight();7 return result;8 }

27

Page 29: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

АВЛ-дерево: право-левый поворот

28

Page 30: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

АВЛ-дерево: правый поворот

1 private AvlSearchTreeNode<T> rotateRL(AvlSearchTreeNode<T> node) {2 node.right = rotateR(node.right);3 return rotateL(node);4 }

29

Page 31: Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных"

Список литературы

• Ахо А., Хопкрофт Д., Ульман Д. Структуры данных иалгоритмы. - М. : Издательский дом “Вильямс”, 2000.сс.146-182.

• Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-мы: построение и анализ, 2-е издание. - М. : Издатель-ский дом “Вильямс”, 2007. сс.103-104, 316-364.

• Кнут Д, Искусство программирования, том 3. Сортировкаи поиск, 2-е изд. - М. : Издательский дома “Вильямс”,2000. сс.425-526.

30