Двоичная куча — различия между версиями
| Строка 65: | Строка 65: | ||
Элемент добавляется в конец кучи  | Элемент добавляется в конец кучи  | ||
| + | |||
| + | == Источники ==  | ||
| + | * [http://ru.wikipedia.org/wiki/Min-heap Двоичная куча]  | ||
Версия 06:26, 15 марта 2011
| Определение: | 
Двоичная куча или пирамида — такое двоичное дерево, для которого выполнены три условия:
 
 
  | 
Удобная структура данных для сортирующего дерева — массив , у которого первый элемент, — элемент в корне, а потомками элемента являются и . Высота кучи определяется как высота двоичного дерева. То есть она равна количеству рёбер в самом длинном простом пути, соединяющем корень кучи с одним из её листьев. Высота кучи есть , где — количество узлов дерева.
Содержание
Базовые процедуры
Восстановление свойств кучи
Если в куче изменяется один из элементов, то она может перестать удовлетворять свойству упорядоченности. Для восстановления этого свойства служит процедура Shift_Down(просеивание вниз). Она восстанавливает свойство кучи в дереве, у которого левое и правое поддеревья удовлетворяют ему. Эта процедура принимает на вход массив элементов и индекс . Она восстанавливает свойство упорядоченности во всём поддереве, корнем которого является элемент . Если -й элемент больше, чем его сыновья, всё поддерево уже является кучей, и делать ничего не надо. В противном случае меняем местами -й элемент с наибольшим из его сыновей, после чего выполняем Shift_Down для этого сына. Процедура выполняется за время .
Shift_Down(i)
left = 2 * i // левый сын right = 2 * i + 1 // правый сын // heap_size - количество элементов в куче If (left ≤ A.heap_size) and (A[left] < A[i]) min = left else min = i If (right ≤ A.heap_size) and (A[right] < A[i]) min = right else min = i If (min <> i) Обменять A[i] и A[largest] Shift_Down(A, min)
Изменение значения элемента
После изменения -ого элемента вызывается функция Shift_Up, которая просеивает
Извлечение минимального элемента
Выполняет извлечение минимального элемента из кучи за время . Извлечение выполняется в четыре этапа:
- Значение корневого элемента (он и является минимальным) сохраняется для последующего возврата.
 - Последний элемент копируется в корень, после чего удаляется из кучи.
 - Вызывается Shift_Down для корня.
 - Сохранённый элемент возвращается.
 
extract_min()
min = A[1] A[1] = A[A.heap_size] A.heap_size = A.heap_size - 1 Shift_Down(A, 1) return min
Добавление нового элемента
Элемент добавляется в конец кучи