SlideShare a Scribd company logo
1 of 25
Download to read offline
Левосторонняя куча
Что такое куча?
● Куча-структура данных реализующая интерфейс очереди с приоритетом
(Priority Queue).
● Приоритетная очередь — это абстрактная структура данных наподобие стека
или очереди, где у каждого элемента есть приоритет. Элемент с более
высоким приоритетом находится перед элементом с более низким
приоритетом. Если у элементов одинаковые приоритеты, они располагаются
в зависимости от своей позиции в очереди.
Применение
● Алгоритмы на графах : алгоритм Дейкстры, алгоритм Прима, поиск по
первому наилучшему совпадению.
● Алгоритмы сжатия: алгоритм Хаффмана
● Поиск k-ого по порядку элемента
● Heap sort
Сравнение куч
Проблема
Часто необходимо слить две кучи в одну:
• merge (A, B): вернуть новую кучу с ключами из A и
B, уничтожив кучи A и B.
• В бинарной куче операция merge достаточно
дорогая.
Как можно ускорить слияние?
● Использовать несбалансированное дерево.
Определения
● Левостороннее дерево — бинарное дерево, где
ранг левого потомка всегда не меньше ранга правого.
Это дерево было изобретено Кларком Алланом Крейном.
● Левосторонняя куча (англ. leftist heap) —
левостороннее дерево с соблюдением порядка кучи.
Левосторонняя куча
Идея ускорения слияния:
• Сосредоточить все работы по изменению кучи в
одной небольшой части кучи
Основные идеи левосторонней кучи:
● Бинарные деревья
● Большинство узлов находятся слева
● Вся работа по слиянию происходит справа
Определение - Ранг узла
● Неполный узел — узел, у которого < 2
непосредственных потомков.
● Ранг узла(null path length - npl) —
расстояние (число ребер) от него до
ближайшего неполного потомка (+1)
2
11
1
0 0
000
0
● npl(null)=-1
● npl(leaf)=0
● npl(single-child node)=0
Определение - Ранг узла
Если u — неполный узел
00
0
0
00
1
1
Свойства левосторонней кучи
• Требование к каждой вершине
➢ Значения в узлах-родителях ≤ значений в узлах-детях (для min heap)
➢ Зачем? Минимальный элемент всегда в корне (как в бинарной куче)
● Требование к структуре
➢ Для каждого узла x: npl (left (x)) ≥ npl (right (x))
➢ Зачем? Левое поддерево всегда будет больше
Короче ли?
Утверждение: правый путь (путь от корня до самого
правого неполного узла) такой же короткий, как и
любой другой в дереве.
Доказательство: (Противоречие)
Выберем более короткий путь: D1 <D2
Скажем, что D1 отклоняется от правого пути D2 в узле
x:
npl (L) ≤ D1-1 из-за пути длины D1-1 к неполному узлу
npl (R) ≥ D2-1, потому что каждый узел на правом пути
является левым ребенком.
Свойство левосторонней кучи для узла х нарушено!
Короче ли?
Утверждение: если правый путь имеет r узлов, то дерево имеет как
минимум 2r
-1 узлов.
Доказательство: (по индукции)
Базовый случай: r = 1. Дерево имеет как минимум 21
-1 = 1 узел
Индуктивный шаг: предположим,что утверждение верно для r-1.
Докажем для дерева с правым путем хотя бы r:
1. Правое поддерево: правильный путь узлов r-1
⇒ 2r-1
-1 правых поддеревьев узлов (по индукции)
2. Левое поддерево: также правый путь длиной не менее r-1 (пред.
слайд)
⇒ 2r-1
-1 левых узлов поддерева (по индукции)
⇒ Общий размер дерева: (2r-1
-1) + (2r-1
-1) + 1 = 2r-1
Зачем все это?
Данные требования гарантируют, что:
● Правое поддерево действительно короче
● Левостороннее дерево из N узлов имеет правый путь не более log2
(N + 1) узлов
Вспомним основную идею: Сосредоточить все работы по изменению
кучи в одной небольшой части кучи (т.е в правом поддереве)
Слияние двух куч (операция merge)
Основная идея:
● Сделать корень с меньшим значением корнем новой кучи
● Левое поддерево нового корня оставить, а правое
рекурсивно слить с правым деревом
● Перед возвращением из рекурсии:
○ Обновить npl нового корня.
○ При необходимости поменять местами левое и правое
поддеревья этого корня, чтобы сохранить
левостороннее свойство результирующего дерева.
Специальный случай: merge(T,null) = merge(null,T) = T
Merge
Рекурсивные вызовы merge(T1
, T2
) возвращают новую левостороннюю
кучу, содержащую все элементы двух куч T1
и T2
Merge-продолжение
Merge - пример
Merge - восстановление свойств
Merge - восстановление свойств
Операции левосторонней кучи:
● merge: объединить два дерева, общий размер которых n.
○ Асимптотика: O(log n) (Каждый раз идем только в правое поддерево. То есть не более логарифма
вызовов.)
● insert: добавить новый элемент в кучу размера n.
○ притворный узел - левосторонняя куча размера 1
○ вставить, объединив оригинальную кучу с кучей из одного элемента
○ Асимптотика: O(log n) (Т.к на основе merge)
● extractMin: извлечь минимальный элемент из кучи размера n.
○ удалить и вернуть корень
○ объединить левое и правое поддеревья
○ Асимптотика: O(log n) (Т.к на основе merge)
Построение кучи за O(n)
• Храним список левосторонних куч
• Пока их количество больше 1:
1) из начала списка достаём две кучи
2) сливаем эти кучи
3) и результат кладём в конец списка
Доказательство асимптотики
На нулевом шаге — n куч из одного элемента.
На каждом шаге количество куч уменьшается вдвое ,а число вершин в куче
увеличивается вдвое.
На i-ом шаге в списке остались кучи размера 2i
.
Слияние двух куч из ni
элементов — это O(log ni
)
Поэтому построение будет выполняться за:
Сумма ряда равна 2.
Поэтому построение кучи произойдёт за O(n).
Замеры времени работы
Резюме
Плюсы:
● Основная операция merge
● Merge за O(log n)
● Простая реализация
● Нигде не делается уничтожающих присваиваний. Не создается новых узлов
в merge. А значит, кучу можно легко сделать персистентной.
● Не в виде массива
● Дополнительное поле npl
● Можно быстрее (:
Минусы:
Источники
● Левосторонняя куча - викиконспекты ИТМО
● Приоритетные очереди - викиконспекты ИТМО
● Применение куч - GeekForGeeks
● CSC 378: Data Structures and Algorithm Analysis
● Functional Heap - Leftist Tree
● MAW Chapter 6 summary
● Нормально анимированная визуализация (:
Спасибо за внимание
Вопросы?

More Related Content

What's hot

Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
Technopark
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2
Technopark
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Nikolay Grebenshikov
 
Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1
Technopark
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4
Technopark
 
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Nikolay Grebenshikov
 
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Mikhail Kurnosov
 

What's hot (20)

Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2Алгоритмы и структуры данных осень 2013 лекция 2
Алгоритмы и структуры данных осень 2013 лекция 2
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2
 
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки да...
 
Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)Лекция 2: АВЛ-деревья (AVL trees)
Лекция 2: АВЛ-деревья (AVL trees)
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 
Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1Алгоритмы и структуры данных весна 2014 лекция 1
Алгоритмы и структуры данных весна 2014 лекция 1
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4
 
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
Лекция №6. Деревья. Предмет "Структуры и алгоритмы обработки данных"
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
Лекция 8: Дерево Ван Эмде Боаса (Van Emde Boas tree)
 
Начало работы в R
Начало работы в RНачало работы в R
Начало работы в R
 

Левосторонняя куча

  • 2. Что такое куча? ● Куча-структура данных реализующая интерфейс очереди с приоритетом (Priority Queue). ● Приоритетная очередь — это абстрактная структура данных наподобие стека или очереди, где у каждого элемента есть приоритет. Элемент с более высоким приоритетом находится перед элементом с более низким приоритетом. Если у элементов одинаковые приоритеты, они располагаются в зависимости от своей позиции в очереди.
  • 3. Применение ● Алгоритмы на графах : алгоритм Дейкстры, алгоритм Прима, поиск по первому наилучшему совпадению. ● Алгоритмы сжатия: алгоритм Хаффмана ● Поиск k-ого по порядку элемента ● Heap sort Сравнение куч
  • 4. Проблема Часто необходимо слить две кучи в одну: • merge (A, B): вернуть новую кучу с ключами из A и B, уничтожив кучи A и B. • В бинарной куче операция merge достаточно дорогая. Как можно ускорить слияние? ● Использовать несбалансированное дерево.
  • 5. Определения ● Левостороннее дерево — бинарное дерево, где ранг левого потомка всегда не меньше ранга правого. Это дерево было изобретено Кларком Алланом Крейном. ● Левосторонняя куча (англ. leftist heap) — левостороннее дерево с соблюдением порядка кучи.
  • 6. Левосторонняя куча Идея ускорения слияния: • Сосредоточить все работы по изменению кучи в одной небольшой части кучи Основные идеи левосторонней кучи: ● Бинарные деревья ● Большинство узлов находятся слева ● Вся работа по слиянию происходит справа
  • 7. Определение - Ранг узла ● Неполный узел — узел, у которого < 2 непосредственных потомков. ● Ранг узла(null path length - npl) — расстояние (число ребер) от него до ближайшего неполного потомка (+1) 2 11 1 0 0 000 0 ● npl(null)=-1 ● npl(leaf)=0 ● npl(single-child node)=0
  • 8. Определение - Ранг узла Если u — неполный узел 00 0 0 00 1 1
  • 9. Свойства левосторонней кучи • Требование к каждой вершине ➢ Значения в узлах-родителях ≤ значений в узлах-детях (для min heap) ➢ Зачем? Минимальный элемент всегда в корне (как в бинарной куче) ● Требование к структуре ➢ Для каждого узла x: npl (left (x)) ≥ npl (right (x)) ➢ Зачем? Левое поддерево всегда будет больше
  • 10. Короче ли? Утверждение: правый путь (путь от корня до самого правого неполного узла) такой же короткий, как и любой другой в дереве. Доказательство: (Противоречие) Выберем более короткий путь: D1 <D2 Скажем, что D1 отклоняется от правого пути D2 в узле x: npl (L) ≤ D1-1 из-за пути длины D1-1 к неполному узлу npl (R) ≥ D2-1, потому что каждый узел на правом пути является левым ребенком. Свойство левосторонней кучи для узла х нарушено!
  • 11. Короче ли? Утверждение: если правый путь имеет r узлов, то дерево имеет как минимум 2r -1 узлов. Доказательство: (по индукции) Базовый случай: r = 1. Дерево имеет как минимум 21 -1 = 1 узел Индуктивный шаг: предположим,что утверждение верно для r-1. Докажем для дерева с правым путем хотя бы r: 1. Правое поддерево: правильный путь узлов r-1 ⇒ 2r-1 -1 правых поддеревьев узлов (по индукции) 2. Левое поддерево: также правый путь длиной не менее r-1 (пред. слайд) ⇒ 2r-1 -1 левых узлов поддерева (по индукции) ⇒ Общий размер дерева: (2r-1 -1) + (2r-1 -1) + 1 = 2r-1
  • 12. Зачем все это? Данные требования гарантируют, что: ● Правое поддерево действительно короче ● Левостороннее дерево из N узлов имеет правый путь не более log2 (N + 1) узлов Вспомним основную идею: Сосредоточить все работы по изменению кучи в одной небольшой части кучи (т.е в правом поддереве)
  • 13. Слияние двух куч (операция merge) Основная идея: ● Сделать корень с меньшим значением корнем новой кучи ● Левое поддерево нового корня оставить, а правое рекурсивно слить с правым деревом ● Перед возвращением из рекурсии: ○ Обновить npl нового корня. ○ При необходимости поменять местами левое и правое поддеревья этого корня, чтобы сохранить левостороннее свойство результирующего дерева. Специальный случай: merge(T,null) = merge(null,T) = T
  • 14. Merge Рекурсивные вызовы merge(T1 , T2 ) возвращают новую левостороннюю кучу, содержащую все элементы двух куч T1 и T2
  • 19. Операции левосторонней кучи: ● merge: объединить два дерева, общий размер которых n. ○ Асимптотика: O(log n) (Каждый раз идем только в правое поддерево. То есть не более логарифма вызовов.) ● insert: добавить новый элемент в кучу размера n. ○ притворный узел - левосторонняя куча размера 1 ○ вставить, объединив оригинальную кучу с кучей из одного элемента ○ Асимптотика: O(log n) (Т.к на основе merge) ● extractMin: извлечь минимальный элемент из кучи размера n. ○ удалить и вернуть корень ○ объединить левое и правое поддеревья ○ Асимптотика: O(log n) (Т.к на основе merge)
  • 20. Построение кучи за O(n) • Храним список левосторонних куч • Пока их количество больше 1: 1) из начала списка достаём две кучи 2) сливаем эти кучи 3) и результат кладём в конец списка
  • 21. Доказательство асимптотики На нулевом шаге — n куч из одного элемента. На каждом шаге количество куч уменьшается вдвое ,а число вершин в куче увеличивается вдвое. На i-ом шаге в списке остались кучи размера 2i . Слияние двух куч из ni элементов — это O(log ni ) Поэтому построение будет выполняться за: Сумма ряда равна 2. Поэтому построение кучи произойдёт за O(n).
  • 23. Резюме Плюсы: ● Основная операция merge ● Merge за O(log n) ● Простая реализация ● Нигде не делается уничтожающих присваиваний. Не создается новых узлов в merge. А значит, кучу можно легко сделать персистентной. ● Не в виде массива ● Дополнительное поле npl ● Можно быстрее (: Минусы:
  • 24. Источники ● Левосторонняя куча - викиконспекты ИТМО ● Приоритетные очереди - викиконспекты ИТМО ● Применение куч - GeekForGeeks ● CSC 378: Data Structures and Algorithm Analysis ● Functional Heap - Leftist Tree ● MAW Chapter 6 summary ● Нормально анимированная визуализация (: