Upload
nikolay-grebenshikov
View
3.007
Download
3
Embed Size (px)
Citation preview
Хакасский государственный университет им. Н.Ф. Катанова
Структуры и алгоритмы обработки данных
Лекция: Поиск. Бинарный поиск. Деревья
поиска.
Николай Гребенщиков, www.grebenshikov.ru
Задача поиска - очень широкая.
Дано: множество элементов.
Найти: подмножество по заданным критериям поиска.
Что можно искать? Какие могут быть критерии поиска?
1
Из чего складывается время работы поиска - T (n)
• Tprepare(n) - подготовительная часть - организация струк-туры данных для множества элементов
• Tfind(n) - сам поиск - время работы алгоритма поиска
2
Поиск по ключу
1 class SomeData<K,D> {2 K key;3 D data;4 }
Дано: множество элементов с заданным ключом. Условие:на множестве возможных ключей можно установить отношеепорядка.
Найти: подмножество элементов с ключом равным заданно-му.
3
Наивный алгоритм
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
Бинарный поиск - алгоритм поиска элемента 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
Бинарный поиск
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
Бинарный поиск
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
Бинарный поиск - 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
Бинарный поиск - Скорость работы
• 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
Двоичное/бинарное дерево поиска (англ. binary search tree,BST) - это двоичное дерево, для которого выполняются сле-дующие дополнительные условия:
• У всех узлов левого поддерева произвольного узла X зна-чения ключей меньше, нежели значение ключа узла X.
• У всех узлов правого поддерева произвольного узла X
значения ключей не меньше, нежели значение ключа узлаX.
• Оба поддерева - левое и правое, являются двоичнымидеревьями поиска.
10
Бинарное дерево поиска - Пример
11
АТД Бинарное дерево поиска
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
Бинарное дерево поиска - Поиск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
Бинарное дерево поиска - Пример
14
Бинарное дерево поиска - Вставка
1. Найти место для вставки, используя алгоритм поиска.
2. Вставить.
15
Бинарное дерево поиска - Скорость работы
Tinsert(n) = O(H(n))
Tprepare(n) = O(n ·H(n))
Tfind(n) = O(H(n))
H(n) - высота дерева. H(n) =?
16
Бинарное дерево поиска
Высота дерева зависит от данных и последовательности за-полнения им дерева.
Например: H(n) = n
Тогда: Tprepare(n) = O(n2), Tfind(n) = O(n)
17
Бинарное дерево поиска - Примеры высот
• Для полного дерева - H(n) = log2(n)
• Для случайного дерева (равномерное распределение) -H(n) = O(log(n)) - доказательство, можно взять как до-клад на семинар.
18
Сбалансированные деревья поиска - это деревья поиска,структура которых поддерживается приближенной к стурк-туре полного дерева, и высота таких деревьев равна O(log(n)).Методы поддержания баланса бинарных деревьев поиска:
• АВЛ-дерево
• 2-3-дерево (доклад на семинар)
• Красно-черные деревья (доклад на семинар)
• и другие (доклады на семинаре)
19
АВЛ-дерево - сбалансированное по высоте двоичное деревопоиска: для каждой его вершины высота её двух поддеревьевразличается не более чем на 1.
Оно названо по первым буквам фамилий его изобретателей,Г. М. Адельсона-Вельского и Е. М. Ландиса, которые впер-вые предложили использовать АВЛ-деревья в 1962.
20
Пример АВЛ-дерева
21
Пример не АВЛ-дерева
22
АВЛ-дерево - скорость работы.
Найдем высоту дерева - 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
АВЛ-дерево - скорость работы.
Tprepare(n) = O(n · log(n))
Tfind(n) = O(log(n))
24
Механизм поддержание сбалансированности АВЛ-дерева- изменение структуры дерева при добавлении и удаленииэлементов.
Повороты:
• Левый
• Правый
• Лево-правый
• Право-левый
25
АВЛ-дерево: правый поворот
26
АВЛ-дерево: правый поворот
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
АВЛ-дерево: право-левый поворот
28
АВЛ-дерево: правый поворот
1 private AvlSearchTreeNode<T> rotateRL(AvlSearchTreeNode<T> node) {2 node.right = rotateR(node.right);3 return rotateL(node);4 }
29
Список литературы
• Ахо А., Хопкрофт Д., Ульман Д. Структуры данных иалгоритмы. - М. : Издательский дом “Вильямс”, 2000.сс.146-182.
• Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-мы: построение и анализ, 2-е издание. - М. : Издатель-ский дом “Вильямс”, 2007. сс.103-104, 316-364.
• Кнут Д, Искусство программирования, том 3. Сортировкаи поиск, 2-е изд. - М. : Издательский дома “Вильямс”,2000. сс.425-526.
30