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

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

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

    1. Хакасский государственный университет им. Н.Ф. Катанова Структуры и алгоритмы обработки данных Лекция: Поиск. Бинарный поиск. Деревья поиска. Николай Гребенщиков, www.grebenshikov.ru
    2. Задача поиска - очень широкая. Дано: множество элементов. Найти: подмножество по заданным критериям поиска. Что можно искать? Какие могут быть критерии поиска? 1
    3. Из чего складывается время работы поиска - T (n) • Tprepare(n) - подготовительная часть - организация струк- туры данных для множества элементов • Tf ind(n) - сам поиск - время работы алгоритма поиска 2
    4. Поиск по ключу 1 class SomeData<K,D> { 2 K key; 3 D data; 4 } Дано: множество элементов с заданным ключом. Условие: на множестве возможных ключей можно установить отношее порядка. Найти: подмножество элементов с ключом равным заданно- му. 3
    5. Наивный алгоритм 1 D find(K key) { 2 for (int i=0; i<length; i++) { 3 if (datas[i].key == key) { 4 return datas[i].data 5 } 6 } 7 return null; 8 } Tprepare(n) = 0 Tf ind(n) = Θ(n) 4
    6. Бинарный поиск - алгоритм поиска элемента x в отсорти- рованном списке A длинны n. 1. Сравнить x c A [ n/2 ], если x = A [ n/2 ], то мы нашли. 2. Запустить рекурсию поиска с подсписком [0, n/2 − 1], если x < A [ n/2 ] иначе с подсписком [ n/2 + 1, n + 1] 5
    7. Бинарный поиск A: 0 1 2 3 4 5 6 7 8 9 1 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
    8. Бинарный поиск A: 0 1 2 3 4 5 6 7 8 9 1 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 = A[3] = 47 - Провал 7
    9. Бинарный поиск - 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]) then 5 Ub = M - 1; 6 else if (Key > A[M]) then 7 Lb = M + 1; 8 else 9 return M; 10 if (Lb > Ub) then 11 return -1; 12 } 13 } 8
    10. Бинарный поиск - Скорость работы • Tprepare(n) = O(log(n)) или O(n) - зависит от способа сор- тировки - разберем позже. • Tf ind(n) = O(log(n)) - докажем сейчас. T (n) = T (n/2) + Θ(1) Используем основной метод: nlog21 = n0 = 1 = Θ(1) = f (n) ⇒ Второй случай ⇒ T (n) = Θ(log(n)) 9
    11. Двоичное/бинарное дерево поиска (англ. binary search tree, BST) - это двоичное дерево, для которого выполняются сле- дующие дополнительные условия: • У всех узлов левого поддерева произвольного узла X зна- чения ключей меньше, нежели значение ключа узла X. • У всех узлов правого поддерева произвольного узла X значения ключей не меньше, нежели значение ключа узла X. • Оба поддерева - левое и правое, являются двоичными деревьями поиска. 10
    12. Бинарное дерево поиска - Пример 11
    13. АТД Бинарное дерево поиска 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
    14. Бинарное дерево поиска - Поиск 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
    15. Бинарное дерево поиска - Пример 14
    16. Бинарное дерево поиска - Вставка 1. Найти место для вставки, используя алгоритм поиска. 2. Вставить. 15
    17. Бинарное дерево поиска - Скорость работы Tinsert(n) = O(H(n)) Tprepare(n) = O(n · H(n)) Tf ind(n) = O(H(n)) H(n) - высота дерева. H(n) =? 16
    18. Бинарное дерево поиска Высота дерева зависит от данных и последовательности за- полнения им дерева. Например: H(n) = n Тогда: Tprepare(n) = O(n2), Tf ind(n) = O(n) 17
    19. Бинарное дерево поиска - Примеры высот • Для полного дерева - H(n) = log2(n) • Для случайного дерева (равномерное распределение) - H(n) = O(log(n)) - доказательство, можно взять как до- клад на семинар. 18
    20. Сбалансированные деревья поиска - это деревья поиска, структура которых поддерживается приближенной к стурк- туре полного дерева, и высота таких деревьев равна O(log(n)). Методы поддержания баланса бинарных деревьев поиска: • АВЛ-дерево • 2-3-дерево (доклад на семинар) • Красно-черные деревья (доклад на семинар) • и другие (доклады на семинаре) 19
    21. АВЛ-дерево - сбалансированное по высоте двоичное дерево поиска: для каждой его вершины высота её двух поддеревьев различается не более чем на 1. Оно названо по первым буквам фамилий его изобретателей, Г. М. Адельсона-Вельского и Е. М. Ландиса, которые впер- вые предложили использовать АВЛ-деревья в 1962. 20
    22. Пример АВЛ-дерева 21
    23. Пример не АВЛ-дерева 22
    24. АВЛ-дерево - скорость работы. Найдем высоту дерева - H(n). 1. Пусть N (h) - минимальное количество узлов для АВЛ- дерева высотой h. 2. N (h) = 1 + N (h − 1) + N (h − 2) ⇒ N (h) > Fh, где Fh - h-е число Фиббоначи. ϕh ϕh √ , тогда N (h) > √ ⇒ H(n) < logϕ (n · 3. Известно, что Fh = √ 5 5 5) 4. H(n) = O(log(n)) 23
    25. АВЛ-дерево - скорость работы. Tprepare(n) = O(n · log(n)) Tf ind(n) = O(log(n)) 24
    26. Механизм поддержание сбалансированности АВЛ-дерева - изменение структуры дерева при добавлении и удалении элементов. Повороты: • Левый • Правый • Лево-правый • Право-левый 25
    27. АВЛ-дерево: правый поворот 26
    28. АВЛ-дерево: правый поворот 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
    29. АВЛ-дерево: право-левый поворот 28
    30. АВЛ-дерево: правый поворот 1 private AvlSearchTreeNode<T> rotateRL(AvlSearchTreeNode<T> node) { 2 node.right = rotateR(node.right); 3 return rotateL(node); 4 } 29
    31. Список литературы • Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и алгоритмы. - М. : Издательский дом “Вильямс”, 2000. сс.146-182. • Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит- мы: построение и анализ, 2-е издание. - М. : Издатель- ский дом “Вильямс”, 2007. сс.103-104, 316-364. • Кнут Д, Искусство программирования, том 3. Сортировка и поиск, 2-е изд. - М. : Издательский дома “Вильямс”, 2000. сс.425-526. 30
    SlideShare Zeitgeist 2009

    + Nikolay GrebenshikovNikolay Grebenshikov Nominate

    custom

    194 views, 0 favs, 0 embeds more stats

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 194
      • 194 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 0
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories