D-кучи и их применение
Ражева Н.С., Цыганова А.О.
Кафедра математического обеспечения ЭВМ
Нижегородский государственный университет
им. Н.И. Лобачевского
Факультет Вычислительной математики и кибернетики
Содержание
 d-кучи
 Общие понятия
 Структура хранения
 Основные утверждения
 Реализация d-кучи
 Основные операции
 Применение d-куч
 Сортировка с использованием d-куч
 Результаты экспериментов
 Алгоритм Дейкстры
 Приоритетная очередь
 Обзор литературы
1. d-кучи
d-кучи: общие понятия…
 Куча – представление взвешенного множества в
виде корневого дерева, узлам которого ставятся во
взаимно однозначное соответствие элементы
рассматриваемого множества.
 Соответствие между узлами дерева и
элементами множества называется кучеобразным,
если: ключ элемента, приписанного узлу, не
превосходит ключей, приписанных его потомкам.
d-кучи: общие понятия…
 Завершенное d-арное дерево - корневое дерево.
 Свойства:
 Каждый внутренний узел имеет ровно d
потомков. Исключение - один узел,
имеющий от 1 до d - 1 потомков
 На глубине i ровно узлов ( ),
k - глубина дерева;
 Количество узлов глубины k в дереве
глубины k варьируется от 1 до .
i
d 11 −≤≤ nk
k
d
d-кучи: общие понятия
 Глубина дерева – наибольшая глубина его
узлов.
 Глубина узла – число ребер в кратчайшем
пути от корня до данного узла.
 Высота узла - расстояние от него до
наиболее далекого потомка.
d-кучи: структура хранения…
 Каждому узлу дерева приписываем по одному
элементу исходного массива
 Сохраняем кучеобразный порядок
 Номеруем узлы:
 Корень получает номер 0;
 Потомки узла с номером i получают номера
от до .
 Для узла в позиции i родительский узел
расположен в позиции div d.
ddi +⋅1+⋅ di
( )1−i
d-кучи: структура хранения…
…… …
1 …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0 n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0
0
n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0
0 1
n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0
20 1
n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0
20 1 … d
n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0
20 1 … d i…
n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0
20 1 … d i… i+1
n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0
… … …20 1 … d … i+1 … i*d+1i
n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0
20 1 … d … i+1 … i*d+1 i*d+2i
n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0
20 1 … d … i+1 … i*d+1 i*d+2 i*d+d…i
n-1
d-кучи: структура хранения…
1 …
…… …
0
2 d
…
…… …
………
i i+1
Уровень 0
Уровень 1
Уровень j
Уровень j+1
…
…
i*d+1 i*d+2 i*d+d
(i-1)*d+d
0 n-1
20 1 … d … i+1 … i*d+1 i*d+2 i*d+d…i … n-1
d-кучи: структура хранения…
 Пример: n = 8, d = 3
key[n] = [2, 2, 4, 5, 5, 6, 6, 5]
2
2 4 5
5 6 6 5
0
1
5
2
4
3
76
d-кучи: основные утверждения
 Утверждение 1: Длина h пути из корня
завершенного d-арного дерева с n > 1 узлами в
любой лист удовлетворяет неравенствам:
 Утверждение 2: Количество узлов высоты h не
превосходит .
1log1log +<<− nhn dd
h
dn
2. Реализация d-кучи.
Основные операции
d-кучи: основные операции
 Основные операции над d-кучами:
 Всплытие
 Погружение
 Вставка
 Удаление
 Уменьшение ключа
 Окучивание
Основные операции: Всплытие(i)…
 Всплытие(i)
 Применяется для элемента x в узле i , нарушающего
кучеобразный порядок, т.е если ключ элемента меньше
ключа родителя.
Procedure Всплытие(i)
begin
p := (i-1)div d
while (i≠0) and (key[p]>key[i]) do
begin
tr(i,p);
i:= p; p:=(i-1)div d
end;
end;
Вычислительная сложность: )(log nO d
Основные операции: Всплытие(i)…
Пример: d = 3, n = 8
7
7 6 9
9 6 8 7
0
1
5
2
4
3
76
Основные операции: Всплытие(i)…
Пример: d = 3, n = 8
7
7 8 9
9 6 8 9
0
1
5
2
4
3
76
!!!
Основные операции: Всплытие(i)…
Пример: d = 3, n = 8
7
7 8 9
9 6 8 9
0
1
5
2
4
3
76
Основные операции: Всплытие(i)…
Пример: d = 3, n = 8
7
6 8 9
9 7 8 9
0
1
5
2
4
3
76
Основные операции: Всплытие(i)…
Пример: d = 3, n = 8
7
6 8 9
9 7 8 9
0
1
5
2
4
3
76
!!!
Основные операции: Всплытие(i)…
Пример: d = 3, n = 8
7
6 8 9
9 7 8 9
0
1
5
2
4
3
76
Основные операции: Всплытие(i)
Пример: d = 3, n = 8
6
7 8 9
9 7 8 9
0
1
5
2
4
3
76
Основные операции: Погружение(i)…
 Погружение(i)
 Применяется для элемента x в узле i , нарушающего
кучеобразный порядок, т.е если ключ элемента больше
ключа потомка.
Вспомогательная функция min_child(i):
Function min_child(i)
begin
if (i*d+1>=n) return 0;
else
begin
s:=i*d+1; min_key:=key[s]; last:=(i+1)*d;
if (last>=n) last:=n-1;
for j:=s+1 to j:=last do
begin
if (min_key > key[j]) min_key=key[j]; s=j;
return s;
end;
end;
Основные операции: Погружение(i)…
Procedure Погружение(i)
begin
s:=min_child(i);
while (s≠0) and (key[i]>key[s])
begin
tr(i,s);
i:=s;
s:=min_child(i);
end;
end;
Вычислительная сложность: )log( ndO d⋅
Основные операции: Погружение(i)…
Пример: d = 3, n = 8
8
7 6 9
9 7 8 7
0
1
5
2
4
3
76
Основные операции: Погружение(i)…
Пример: d = 3, n = 8
8
7 6 9
9 7 8 7
0
1
5
2
4
3
76
!!!
Основные операции: Погружение(i)…
Пример: d = 3, n = 8
8
7 6 9
9 7 8 7
0
1
5
2
4
3
76
Основные операции: Погружение(i)…
Пример: d = 3, n = 8
6
7 8 9
9 7 8 7
0
1
5
2
4
3
76
Основные операции: Погружение(i)…
Пример: d = 3, n = 8
6
7 8 9
9 7 8 7
0
1
5
2
4
3
76
!!!
Основные операции: Погружение(i)…
Пример: d = 3, n = 8
6
7 8 9
9 7 8 7
0
1
5
2
4
3
76
Основные операции: Погружение(i)
Пример: d = 3, n = 8
6
7 7 9
9 7 8 8
0
1
5
2
4
3
76
Основные операции: Вставка(key_insert)
 Вставка(key_insert):
 Добавление n+1 узла с номером n;
 Применение операции Всплытие(n).
Procedure Вставка(key_insert)
begin
key[n]:=key_insert;
ВСПЛЫТИЕ(n);
n:=n+1;
end;
Вычислительная сложность: )(log nO d
Основные операции: Вставка(key_insert)
6
7 8 9
9 7 8
0
1
5
2
4
3
6
Пример: d = 3, n = 7
Основные операции: Вставка(key_insert)
6
7 8 9
9 7 8
0
1
5
2
4
3
3
6
Пример: d = 3, n = 7 Добавление элемента:
Основные операции: Вставка(key_insert)
6
7 8 9
9 7 8
0
1
5
2
4
3
3
76
Пример: d = 3, n = 7
n = n+1
Добавление элемента:
Основные операции: Вставка(key_insert)
6
7 8 9
9 7 8
0
1
5
2
4
3
3
76
Пример: d = 3, n = 7 Всплытие:
!!!
Основные операции: Вставка(key_insert)
6
7 8 9
9 7 8
0
1
5
2
4
3
3
76
Пример: d = 3, n = 7 Всплытие:
Основные операции: Вставка(key_insert)
6
7 3 9
9 7 8
0
1
5
2
4
3
8
76
Пример: d = 3, n = 7 Всплытие:
Основные операции: Вставка(key_insert)
6
7 3 9
9 7 8
0
1
5
2
4
3
8
76
Пример: d = 3, n = 7 Всплытие:
!!!
Основные операции: Вставка(key_insert)
6
7 3 9
9 7 8
0
1
5
2
4
3
8
76
Пример: d = 3, n = 7 Всплытие:
Основные операции: Вставка(key_insert)
3
7 6 9
9 7 8
0
1
5
2
4
3
8
76
Пример: d = 3, n = 7 Всплытие:
Основные операции: Удаление(i)
 Удаление(i):
 Перенести последний элемент на место удаляемого
элемента с номером i;
 Если узел i имеет родителя с большим ключом, то
применяется операции Всплытие(i), иначе операция
Погружение(i)
Procedure Удаление(i)
begin
key[i]:=key[n-1]; n:=n-1;
if (i≠0) and (key[i]<key[(i-1)div d] then ВСПЛЫТИЕ(i)
else ПОГРУЖЕНИЕ(i);
end;
Вычислительная сложность: )log( ndO d⋅
Основные операции: Удаление(i)
6
7 8 9
9 7 8
0
1
5
2
4
3
3
76
Пример: d = 3, n = 8, i = 1
Основные операции: Удаление(i)
6
7 8 9
9 7 8
0
1
5
2
4
3
3
76
Пример: d = 3, n = 8, i = 1
Основные операции: Удаление(i)
6
7 8 9
9 7 8
0
1
5
2
4
3
3
76
Пример: d = 3, n = 8, i = 1
Основные операции: Удаление(i)
6
3 8 9
9 7 8
0
1
5
2
4
3
76
Пример: d = 3, n = 8, i = 1 Удаление:
n = n-1
Основные операции: Удаление(i)
6
3 8 9
9 7 8
0
1
5
2
4
3
6
Пример: d = 3, n = 8, i = 1 Всплытие:
!!!
n = n-1
Основные операции: Удаление(i)
6
3 8 9
9 7 8
0
1
5
2
4
3
6
Пример: d = 3, n = 8, i = 1 Всплытие:
n = n-1
Основные операции: Удаление(i)
3
6 8 9
9 7 8
0
1
5
2
4
3
6
Пример: d = 3, n = 8, i = 1 Всплытие:
n = n-1
Основные операции: Уменьшение_ключа(i,k)
 Уменьшение_ключа(i,k):
 Уменьшить ключ элемента в узле i на заданную
константу
k = const ;
 Выполнить операцию Всплытие(i).
Procedure Уменьшение_ключа(i,k)
begin
key[i]:=key[i]-k;
ВСПЛЫТИЕ(i);
end;
Вычислительная сложность: )(log nO d
Основные операции: Уменьшение_ключа(i,k)
6
7 8 9
9 7 8
0
1
5
2
4
3
9
76
Пример: d = 3, n = 8, i = 2, k = 3
Уменьшение ключа:
Основные операции: Уменьшение_ключа(i,k)
6
7 5 9
9 7 8
0
1
5
2
4
3
9
76
Пример: d = 3, n = 8, i = 2, k = 3
!!!
Всплытие:
Основные операции: Уменьшение_ключа(i,k)
6
7 5 9
9 7 8
0
1
5
2
4
3
9
76
Пример: d = 3, n = 8, i = 2, k = 3
Всплытие:
Основные операции: Уменьшение_ключа(i,k)
5
7 6 9
9 7 8
0
1
5
2
4
3
9
76
Пример: d = 3, n = 8, i = 2, k = 3
Всплытие:
Основные операции: Окучивание
 Окучивание:
 Применение операции Погружение(i) по
очереди к узлам .
Procedure Окучивание
begin
for i:=(n-1)/d downto 0 do ПОГРУЖЕНИЕ(i);
end;
Вычислительная сложность: )(nO
0,,1 −n
 Утверждение 3. Вычислительная сложность операции
ОКУЧИВАНИЕ равна
 Доказательство.
1. Трудоемкость погружения с высоты i равна O(i);
2. Число узлов высоты i не превосходит
3. Суммарная трудоемкость окучивания:
, где - высота d-арного дерева с n узлами.
Основные операции: Окучивание
≤++





++++ hh
2
1
...
2
1
...
16
1
8
1
)(nO
i
dn
∑=
⋅
h
oi
i
d
n
i
 nh dlog=
=+++++=≤ ∑∑ ==
h
i
hi
h
oi
i
hi
d
i
0 2
...
8
3
4
2
2
1
0
2
+





++++





+++ hh
2
1
...
8
1
4
1
2
1
...
4
1
2
1
consth
=≤++++ −
2
2
1
...
4
1
2
1
1 1
Т.о.,
∑=
⋅
h
oi
i
d
n
i
( )nOn =≤ 2
3. Применение d-куч
3.1. Сортировка массива
Сортировка массива…
 Задача сортировки с использованием d-куч:
 Требуется упорядочить массив key[n] по неубыванию,
путем перестановки его элементов с использованием d-
кучи.
 На выходе требуется получить последовательность
key[1] ≤key[2] ≤… ≤key[n].
Сортировка массива…
 Алгоритм сортировки с использованием d-куч:
 Применение операции Погружение(i) по очереди к
узлам (Окучивание);
 Обмен первого и последнего элемента кучи:
уменьшение размера кучи на 1;
 Применение операции погружения к первому элементу
кучи.
 Повторение описанных операций до тех пор, пока
размер кучи не будет равен 1.
0,),1( −n
 В результате к моменту выполнения всех операций
получаем массив упорядоченный по невозрастанию. Далее
массив следует упорядочить по неубыванию.
Сортировка массива…
 Реализация сортировки с использованием d-куч:
Procedure Heap_Sort(n);
begin
ОКУЧИВАНИЕ;
k = n-1;
while (k > 0)
begin
tr(0, k); k = k - 1; ПОГРУЖЕНИЕ(0);
end;
for i:=0 to (n mod 2)do tr(i,n-1-i);
end;
Вычислительная сложность: )log( nnO d⋅
 Недостатки сортировки с помощью d-кучи
 Алгоритм является неустойчивым (меняет взаимное
расположение равных элементов)
 Алгоритм является неестественным (частичная
упорядоченность массива никак не учитывается)
 Достоинства сортировки с помощью d-кучи
 Не использует дополнительной памяти, размер которой
зависит от длины сортируемого массива
 Даже в среднем, а так же в лучшем и худшем случаях
сортировка имеет трудоемкость
Сортировка массива
)log( nnO d⋅
3. Применение d-куч
3.2. Результаты экспериментов
 Вычислительные эксперименты
 нижняя граница значений элементов q = 1
 верхняя граница значений элементов w = 10000
 размер массива с шагом
Вычислительный эксперимент…
110,1 6
+= n
4
10
Вычислительный эксперимент…
Сортировка с помощью D-кучи
0,0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9
1,0
1,1
1,2
1,3
1,4
1,5
1
50001
100001
150001
200001
250001
300001
350001
400001
450001
500001
550001
600001
650001
700001
750001
800001
850001
900001
950001
1000001
Количество элементов в массиве
Время,сек.
2-heap
3-heap
4-heap
5-heap
6-heap
7-heap
8-heap
9-heap
10-heap
11-heap
Вычислительный эксперимент…
 Сравнение сортировок с помощью d-куч с Quick_Sort
Сортировка с помощью D-кучи и Quick_Sort
0,0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,9
1,0
1,1
1,2
1,3
1,4
1,5
1
50001
100001
150001
200001
250001
300001
350001
400001
450001
500001
550001
600001
650001
700001
750001
800001
850001
900001
950001
1000001
Количество элементов в массиве
Время,сек.
2-heap
3-heap
4-heap
5-heap
6-heap
7-heap
8-heap
9-heap
10-heap
11-heap
Quick Sort
Вычислительный эксперимент…
График зависимости времени от d (при n= ).6
10
Анализ сортировки с помощью 7-кучи
7-heap
0,0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
1
40001
80001
120001
160001
200001
240001
280001
320001
360001
400001
440001
480001
520001
560001
600001
640001
680001
720001
760001
800001
840001
880001
920001
960001
100000
7-heap
Анализ сортировки с помощью 7-кучи
7-heap
0,0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
1
40001
80001
120001
160001
200001
240001
280001
320001
360001
400001
440001
480001
520001
560001
600001
640001
680001
720001
760001
800001
840001
880001
920001
960001
100000
7-heap
ax+b
 Построение МНК с помощью прямой
Анализ сортировки с помощью 7-кучи
 Проверим, является ли наша теоретическая
оценка о трудоемкости алгоритма сортировки с
помощью d-кучи верной на практике.
 Поделим полученное время на nn dlog⋅
Анализ сортировки с помощью 7-кучи
x(n)/(n*logn)
0
0,00000002
0,00000004
0,00000006
0,00000008
0,0000001
0,00000012
0,00000014
30001
130001
230001
330001
430001
530001
630001
730001
830001
930001
x(n)/(n*logn)
С ростом длинны массива зависимость между x и у становится похожей на
линейную.
Анализ сортировки с помощью 7-кучи
С использованием с = 1,05Е-7 получаем более точное приближение. Делаем
вывод, что зависимость между х и у n*logn.
7-heap
0,0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
1
40001
80001
120001
160001
200001
240001
280001
320001
360001
400001
440001
480001
520001
560001
600001
640001
680001
720001
760001
800001
840001
880001
920001
960001
100000
7-heap
ax+b
c*nlogn
Анализ сортировки с помощью 7-кучи
7-heap
0,0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
1
40001
80001
120001
160001
200001
240001
280001
320001
360001
400001
440001
480001
520001
560001
600001
640001
680001
720001
760001
800001
840001
880001
920001
960001
100000
7-heap
c1*nlogn
c*nlogn
Было построено МНК приближение с помощью функции nn dlog⋅
Аппаратная часть
3. Применение d-куч
3.3. Алгоритм Дейкстры
Алгоритм Дейкстры…
 d-кучи используются для ускорения алгоритма
Дейкстры, который ищет минимальные пути в
графе. Этот алгоритм применим только к
взвешенным графам с неотрицательными весами.
 Алгоритм ищет кратчайший путь от вершины ко
всем вершинам.
Алгоритм Дейкстры…
 Алгоритм Дейкстры:
 Шаг 1.
Для каждой вершины введем метку, которую обозначим
.
Тогда для вершины положим и будем считать эту
метку постоянной. Для всех остальных вершин положим
и будем считать эти метки временными.
За обозначим текущую вершину и положим .
Алгоритм Дейкстры…
Шаг 2.
Для всех вершин являющихся смежными с р и метки
которых временные, изменить метки в соответствии со
следующим выражением:
Где - это вес дуги
Шаг 3.
Среди всех вершин с временными метками найти такую,
для которой
Множество можно организовать с помощью d-кучи,
тогда поиск минимума будет происходить быстрее.
Алгоритм Дейкстры
 Шаг 4.
Метку вершины сделаем постоянной и положим .
 Шаг 5.
Если все вершины отмечены постоянными метками, то эти
метки дают длины кратчайших путей.
Если некоторые метки являются временными, то следует
перейти к Шагу 2.
3. Применение d-куч
3.4. Приоритетная очередь
Приоритетная очередь…
 Приоритетная очередь - абстрактный тип
данных, предназначенный для представления
взвешенных множеств.
 Взвешенное множество - каждому
элементу множества однозначно
соответствует число, называемое ключом или
весом.
Приоритетная очередь: основные операции
 Основные операции:
 ВСТАВИТЬ;
 НАЙТИ MIN или МАХ;
 УДАЛИТЬ.
Приоритетная очередь: применение…
 Очереди с приоритетом могут использоваться в
операционных системах разделения времени для
хранения списка заданий с приоритетами.
 После выполнения очередного задания из списка
выбирается задание с наибольшим приоритетом.
Приоритетная очередь: применение…
 Приоритетные очереди также используются в
управляемом событиями моделировании.
 В данной очереди приоритетом является время, в
которое событие должно произойти.
 Каждый раз из очереди выбирается событие с
минимальным временем.
Приоритетная очередь: применение
 Приоритетные очереди могут использоваться в
численных расчетах
 Приоритетом является ошибка вычислений
 Наиболее грубая ошибка обрабатывается в
первую очередь
Обзор литературы
 Алексеев В.Е., Таланов В.А. Графы. Модели вычислений.
Структуры данных: Учебник. – Нижний Новгород ННГУ,
2005. - 307 с.
 Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы:
построение и анализ. 2-е издание. – М.: Вильямс, 2010. –
1296 с.
 Седжвик Р. Фундаментальные алгоритмы на С++.
Анализ/Структуры данных/Сортировка/Поиск. – К.:
ДиаСофт, 2001. – 688 с.
 LaMarca A., Ladner R. The influence of Caches on the
Performance of Heaps. – Seattle University of Washington,
1996. – 29 p.

D-кучи и их применение

  • 1.
    D-кучи и ихприменение Ражева Н.С., Цыганова А.О. Кафедра математического обеспечения ЭВМ Нижегородский государственный университет им. Н.И. Лобачевского Факультет Вычислительной математики и кибернетики
  • 2.
    Содержание  d-кучи  Общиепонятия  Структура хранения  Основные утверждения  Реализация d-кучи  Основные операции  Применение d-куч  Сортировка с использованием d-куч  Результаты экспериментов  Алгоритм Дейкстры  Приоритетная очередь  Обзор литературы
  • 3.
  • 4.
    d-кучи: общие понятия… Куча – представление взвешенного множества в виде корневого дерева, узлам которого ставятся во взаимно однозначное соответствие элементы рассматриваемого множества.  Соответствие между узлами дерева и элементами множества называется кучеобразным, если: ключ элемента, приписанного узлу, не превосходит ключей, приписанных его потомкам.
  • 5.
    d-кучи: общие понятия… Завершенное d-арное дерево - корневое дерево.  Свойства:  Каждый внутренний узел имеет ровно d потомков. Исключение - один узел, имеющий от 1 до d - 1 потомков  На глубине i ровно узлов ( ), k - глубина дерева;  Количество узлов глубины k в дереве глубины k варьируется от 1 до . i d 11 −≤≤ nk k d
  • 6.
    d-кучи: общие понятия Глубина дерева – наибольшая глубина его узлов.  Глубина узла – число ребер в кратчайшем пути от корня до данного узла.  Высота узла - расстояние от него до наиболее далекого потомка.
  • 7.
    d-кучи: структура хранения… Каждому узлу дерева приписываем по одному элементу исходного массива  Сохраняем кучеобразный порядок  Номеруем узлы:  Корень получает номер 0;  Потомки узла с номером i получают номера от до .  Для узла в позиции i родительский узел расположен в позиции div d. ddi +⋅1+⋅ di ( )1−i
  • 8.
    d-кучи: структура хранения… ……… 1 … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 n-1
  • 9.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 0 n-1
  • 10.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 0 1 n-1
  • 11.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 20 1 n-1
  • 12.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 20 1 … d n-1
  • 13.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 20 1 … d i… n-1
  • 14.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 20 1 … d i… i+1 n-1
  • 15.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 … … …20 1 … d … i+1 … i*d+1i n-1
  • 16.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 20 1 … d … i+1 … i*d+1 i*d+2i n-1
  • 17.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 20 1 … d … i+1 … i*d+1 i*d+2 i*d+d…i n-1
  • 18.
    d-кучи: структура хранения… 1… …… … 0 2 d … …… … ……… i i+1 Уровень 0 Уровень 1 Уровень j Уровень j+1 … … i*d+1 i*d+2 i*d+d (i-1)*d+d 0 n-1 20 1 … d … i+1 … i*d+1 i*d+2 i*d+d…i … n-1
  • 19.
    d-кучи: структура хранения… Пример: n = 8, d = 3 key[n] = [2, 2, 4, 5, 5, 6, 6, 5] 2 2 4 5 5 6 6 5 0 1 5 2 4 3 76
  • 20.
    d-кучи: основные утверждения Утверждение 1: Длина h пути из корня завершенного d-арного дерева с n > 1 узлами в любой лист удовлетворяет неравенствам:  Утверждение 2: Количество узлов высоты h не превосходит . 1log1log +<<− nhn dd h dn
  • 21.
  • 22.
    d-кучи: основные операции Основные операции над d-кучами:  Всплытие  Погружение  Вставка  Удаление  Уменьшение ключа  Окучивание
  • 23.
    Основные операции: Всплытие(i)… Всплытие(i)  Применяется для элемента x в узле i , нарушающего кучеобразный порядок, т.е если ключ элемента меньше ключа родителя. Procedure Всплытие(i) begin p := (i-1)div d while (i≠0) and (key[p]>key[i]) do begin tr(i,p); i:= p; p:=(i-1)div d end; end; Вычислительная сложность: )(log nO d
  • 24.
  • 25.
    Основные операции: Всплытие(i)… Пример:d = 3, n = 8 7 7 8 9 9 6 8 9 0 1 5 2 4 3 76 !!!
  • 26.
  • 27.
  • 28.
    Основные операции: Всплытие(i)… Пример:d = 3, n = 8 7 6 8 9 9 7 8 9 0 1 5 2 4 3 76 !!!
  • 29.
  • 30.
  • 31.
    Основные операции: Погружение(i)… Погружение(i)  Применяется для элемента x в узле i , нарушающего кучеобразный порядок, т.е если ключ элемента больше ключа потомка. Вспомогательная функция min_child(i): Function min_child(i) begin if (i*d+1>=n) return 0; else begin s:=i*d+1; min_key:=key[s]; last:=(i+1)*d; if (last>=n) last:=n-1; for j:=s+1 to j:=last do begin if (min_key > key[j]) min_key=key[j]; s=j; return s; end; end;
  • 32.
    Основные операции: Погружение(i)… ProcedureПогружение(i) begin s:=min_child(i); while (s≠0) and (key[i]>key[s]) begin tr(i,s); i:=s; s:=min_child(i); end; end; Вычислительная сложность: )log( ndO d⋅
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
    Основные операции: Вставка(key_insert) Вставка(key_insert):  Добавление n+1 узла с номером n;  Применение операции Всплытие(n). Procedure Вставка(key_insert) begin key[n]:=key_insert; ВСПЛЫТИЕ(n); n:=n+1; end; Вычислительная сложность: )(log nO d
  • 41.
    Основные операции: Вставка(key_insert) 6 78 9 9 7 8 0 1 5 2 4 3 6 Пример: d = 3, n = 7
  • 42.
    Основные операции: Вставка(key_insert) 6 78 9 9 7 8 0 1 5 2 4 3 3 6 Пример: d = 3, n = 7 Добавление элемента:
  • 43.
    Основные операции: Вставка(key_insert) 6 78 9 9 7 8 0 1 5 2 4 3 3 76 Пример: d = 3, n = 7 n = n+1 Добавление элемента:
  • 44.
    Основные операции: Вставка(key_insert) 6 78 9 9 7 8 0 1 5 2 4 3 3 76 Пример: d = 3, n = 7 Всплытие: !!!
  • 45.
    Основные операции: Вставка(key_insert) 6 78 9 9 7 8 0 1 5 2 4 3 3 76 Пример: d = 3, n = 7 Всплытие:
  • 46.
    Основные операции: Вставка(key_insert) 6 73 9 9 7 8 0 1 5 2 4 3 8 76 Пример: d = 3, n = 7 Всплытие:
  • 47.
    Основные операции: Вставка(key_insert) 6 73 9 9 7 8 0 1 5 2 4 3 8 76 Пример: d = 3, n = 7 Всплытие: !!!
  • 48.
    Основные операции: Вставка(key_insert) 6 73 9 9 7 8 0 1 5 2 4 3 8 76 Пример: d = 3, n = 7 Всплытие:
  • 49.
    Основные операции: Вставка(key_insert) 3 76 9 9 7 8 0 1 5 2 4 3 8 76 Пример: d = 3, n = 7 Всплытие:
  • 50.
    Основные операции: Удаление(i) Удаление(i):  Перенести последний элемент на место удаляемого элемента с номером i;  Если узел i имеет родителя с большим ключом, то применяется операции Всплытие(i), иначе операция Погружение(i) Procedure Удаление(i) begin key[i]:=key[n-1]; n:=n-1; if (i≠0) and (key[i]<key[(i-1)div d] then ВСПЛЫТИЕ(i) else ПОГРУЖЕНИЕ(i); end; Вычислительная сложность: )log( ndO d⋅
  • 51.
    Основные операции: Удаление(i) 6 78 9 9 7 8 0 1 5 2 4 3 3 76 Пример: d = 3, n = 8, i = 1
  • 52.
    Основные операции: Удаление(i) 6 78 9 9 7 8 0 1 5 2 4 3 3 76 Пример: d = 3, n = 8, i = 1
  • 53.
    Основные операции: Удаление(i) 6 78 9 9 7 8 0 1 5 2 4 3 3 76 Пример: d = 3, n = 8, i = 1
  • 54.
    Основные операции: Удаление(i) 6 38 9 9 7 8 0 1 5 2 4 3 76 Пример: d = 3, n = 8, i = 1 Удаление: n = n-1
  • 55.
    Основные операции: Удаление(i) 6 38 9 9 7 8 0 1 5 2 4 3 6 Пример: d = 3, n = 8, i = 1 Всплытие: !!! n = n-1
  • 56.
    Основные операции: Удаление(i) 6 38 9 9 7 8 0 1 5 2 4 3 6 Пример: d = 3, n = 8, i = 1 Всплытие: n = n-1
  • 57.
    Основные операции: Удаление(i) 3 68 9 9 7 8 0 1 5 2 4 3 6 Пример: d = 3, n = 8, i = 1 Всплытие: n = n-1
  • 58.
    Основные операции: Уменьшение_ключа(i,k) Уменьшение_ключа(i,k):  Уменьшить ключ элемента в узле i на заданную константу k = const ;  Выполнить операцию Всплытие(i). Procedure Уменьшение_ключа(i,k) begin key[i]:=key[i]-k; ВСПЛЫТИЕ(i); end; Вычислительная сложность: )(log nO d
  • 59.
    Основные операции: Уменьшение_ключа(i,k) 6 78 9 9 7 8 0 1 5 2 4 3 9 76 Пример: d = 3, n = 8, i = 2, k = 3 Уменьшение ключа:
  • 60.
    Основные операции: Уменьшение_ключа(i,k) 6 75 9 9 7 8 0 1 5 2 4 3 9 76 Пример: d = 3, n = 8, i = 2, k = 3 !!! Всплытие:
  • 61.
    Основные операции: Уменьшение_ключа(i,k) 6 75 9 9 7 8 0 1 5 2 4 3 9 76 Пример: d = 3, n = 8, i = 2, k = 3 Всплытие:
  • 62.
    Основные операции: Уменьшение_ключа(i,k) 5 76 9 9 7 8 0 1 5 2 4 3 9 76 Пример: d = 3, n = 8, i = 2, k = 3 Всплытие:
  • 63.
    Основные операции: Окучивание Окучивание:  Применение операции Погружение(i) по очереди к узлам . Procedure Окучивание begin for i:=(n-1)/d downto 0 do ПОГРУЖЕНИЕ(i); end; Вычислительная сложность: )(nO 0,,1 −n
  • 64.
     Утверждение 3.Вычислительная сложность операции ОКУЧИВАНИЕ равна  Доказательство. 1. Трудоемкость погружения с высоты i равна O(i); 2. Число узлов высоты i не превосходит 3. Суммарная трудоемкость окучивания: , где - высота d-арного дерева с n узлами. Основные операции: Окучивание ≤++      ++++ hh 2 1 ... 2 1 ... 16 1 8 1 )(nO i dn ∑= ⋅ h oi i d n i  nh dlog= =+++++=≤ ∑∑ == h i hi h oi i hi d i 0 2 ... 8 3 4 2 2 1 0 2 +      ++++      +++ hh 2 1 ... 8 1 4 1 2 1 ... 4 1 2 1 consth =≤++++ − 2 2 1 ... 4 1 2 1 1 1 Т.о., ∑= ⋅ h oi i d n i ( )nOn =≤ 2
  • 65.
    3. Применение d-куч 3.1.Сортировка массива
  • 66.
    Сортировка массива…  Задачасортировки с использованием d-куч:  Требуется упорядочить массив key[n] по неубыванию, путем перестановки его элементов с использованием d- кучи.  На выходе требуется получить последовательность key[1] ≤key[2] ≤… ≤key[n].
  • 67.
    Сортировка массива…  Алгоритмсортировки с использованием d-куч:  Применение операции Погружение(i) по очереди к узлам (Окучивание);  Обмен первого и последнего элемента кучи: уменьшение размера кучи на 1;  Применение операции погружения к первому элементу кучи.  Повторение описанных операций до тех пор, пока размер кучи не будет равен 1. 0,),1( −n  В результате к моменту выполнения всех операций получаем массив упорядоченный по невозрастанию. Далее массив следует упорядочить по неубыванию.
  • 68.
    Сортировка массива…  Реализациясортировки с использованием d-куч: Procedure Heap_Sort(n); begin ОКУЧИВАНИЕ; k = n-1; while (k > 0) begin tr(0, k); k = k - 1; ПОГРУЖЕНИЕ(0); end; for i:=0 to (n mod 2)do tr(i,n-1-i); end; Вычислительная сложность: )log( nnO d⋅
  • 69.
     Недостатки сортировкис помощью d-кучи  Алгоритм является неустойчивым (меняет взаимное расположение равных элементов)  Алгоритм является неестественным (частичная упорядоченность массива никак не учитывается)  Достоинства сортировки с помощью d-кучи  Не использует дополнительной памяти, размер которой зависит от длины сортируемого массива  Даже в среднем, а так же в лучшем и худшем случаях сортировка имеет трудоемкость Сортировка массива )log( nnO d⋅
  • 70.
    3. Применение d-куч 3.2.Результаты экспериментов
  • 71.
     Вычислительные эксперименты нижняя граница значений элементов q = 1  верхняя граница значений элементов w = 10000  размер массива с шагом Вычислительный эксперимент… 110,1 6 += n 4 10
  • 72.
    Вычислительный эксперимент… Сортировка спомощью D-кучи 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0 1,1 1,2 1,3 1,4 1,5 1 50001 100001 150001 200001 250001 300001 350001 400001 450001 500001 550001 600001 650001 700001 750001 800001 850001 900001 950001 1000001 Количество элементов в массиве Время,сек. 2-heap 3-heap 4-heap 5-heap 6-heap 7-heap 8-heap 9-heap 10-heap 11-heap
  • 73.
    Вычислительный эксперимент…  Сравнениесортировок с помощью d-куч с Quick_Sort Сортировка с помощью D-кучи и Quick_Sort 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0 1,1 1,2 1,3 1,4 1,5 1 50001 100001 150001 200001 250001 300001 350001 400001 450001 500001 550001 600001 650001 700001 750001 800001 850001 900001 950001 1000001 Количество элементов в массиве Время,сек. 2-heap 3-heap 4-heap 5-heap 6-heap 7-heap 8-heap 9-heap 10-heap 11-heap Quick Sort
  • 74.
  • 75.
    Анализ сортировки спомощью 7-кучи 7-heap 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 1 40001 80001 120001 160001 200001 240001 280001 320001 360001 400001 440001 480001 520001 560001 600001 640001 680001 720001 760001 800001 840001 880001 920001 960001 100000 7-heap
  • 76.
    Анализ сортировки спомощью 7-кучи 7-heap 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 1 40001 80001 120001 160001 200001 240001 280001 320001 360001 400001 440001 480001 520001 560001 600001 640001 680001 720001 760001 800001 840001 880001 920001 960001 100000 7-heap ax+b  Построение МНК с помощью прямой
  • 77.
    Анализ сортировки спомощью 7-кучи  Проверим, является ли наша теоретическая оценка о трудоемкости алгоритма сортировки с помощью d-кучи верной на практике.  Поделим полученное время на nn dlog⋅
  • 78.
    Анализ сортировки спомощью 7-кучи x(n)/(n*logn) 0 0,00000002 0,00000004 0,00000006 0,00000008 0,0000001 0,00000012 0,00000014 30001 130001 230001 330001 430001 530001 630001 730001 830001 930001 x(n)/(n*logn) С ростом длинны массива зависимость между x и у становится похожей на линейную.
  • 79.
    Анализ сортировки спомощью 7-кучи С использованием с = 1,05Е-7 получаем более точное приближение. Делаем вывод, что зависимость между х и у n*logn. 7-heap 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 1 40001 80001 120001 160001 200001 240001 280001 320001 360001 400001 440001 480001 520001 560001 600001 640001 680001 720001 760001 800001 840001 880001 920001 960001 100000 7-heap ax+b c*nlogn
  • 80.
    Анализ сортировки спомощью 7-кучи 7-heap 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 1 40001 80001 120001 160001 200001 240001 280001 320001 360001 400001 440001 480001 520001 560001 600001 640001 680001 720001 760001 800001 840001 880001 920001 960001 100000 7-heap c1*nlogn c*nlogn Было построено МНК приближение с помощью функции nn dlog⋅
  • 81.
  • 82.
    3. Применение d-куч 3.3.Алгоритм Дейкстры
  • 83.
    Алгоритм Дейкстры…  d-кучииспользуются для ускорения алгоритма Дейкстры, который ищет минимальные пути в графе. Этот алгоритм применим только к взвешенным графам с неотрицательными весами.  Алгоритм ищет кратчайший путь от вершины ко всем вершинам.
  • 84.
    Алгоритм Дейкстры…  АлгоритмДейкстры:  Шаг 1. Для каждой вершины введем метку, которую обозначим . Тогда для вершины положим и будем считать эту метку постоянной. Для всех остальных вершин положим и будем считать эти метки временными. За обозначим текущую вершину и положим .
  • 85.
    Алгоритм Дейкстры… Шаг 2. Длявсех вершин являющихся смежными с р и метки которых временные, изменить метки в соответствии со следующим выражением: Где - это вес дуги Шаг 3. Среди всех вершин с временными метками найти такую, для которой Множество можно организовать с помощью d-кучи, тогда поиск минимума будет происходить быстрее.
  • 86.
    Алгоритм Дейкстры  Шаг4. Метку вершины сделаем постоянной и положим .  Шаг 5. Если все вершины отмечены постоянными метками, то эти метки дают длины кратчайших путей. Если некоторые метки являются временными, то следует перейти к Шагу 2.
  • 87.
    3. Применение d-куч 3.4.Приоритетная очередь
  • 88.
    Приоритетная очередь…  Приоритетнаяочередь - абстрактный тип данных, предназначенный для представления взвешенных множеств.  Взвешенное множество - каждому элементу множества однозначно соответствует число, называемое ключом или весом.
  • 89.
    Приоритетная очередь: основныеоперации  Основные операции:  ВСТАВИТЬ;  НАЙТИ MIN или МАХ;  УДАЛИТЬ.
  • 90.
    Приоритетная очередь: применение… Очереди с приоритетом могут использоваться в операционных системах разделения времени для хранения списка заданий с приоритетами.  После выполнения очередного задания из списка выбирается задание с наибольшим приоритетом.
  • 91.
    Приоритетная очередь: применение… Приоритетные очереди также используются в управляемом событиями моделировании.  В данной очереди приоритетом является время, в которое событие должно произойти.  Каждый раз из очереди выбирается событие с минимальным временем.
  • 92.
    Приоритетная очередь: применение Приоритетные очереди могут использоваться в численных расчетах  Приоритетом является ошибка вычислений  Наиболее грубая ошибка обрабатывается в первую очередь
  • 93.
    Обзор литературы  АлексеевВ.Е., Таланов В.А. Графы. Модели вычислений. Структуры данных: Учебник. – Нижний Новгород ННГУ, 2005. - 307 с.  Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ. 2-е издание. – М.: Вильямс, 2010. – 1296 с.  Седжвик Р. Фундаментальные алгоритмы на С++. Анализ/Структуры данных/Сортировка/Поиск. – К.: ДиаСофт, 2001. – 688 с.  LaMarca A., Ladner R. The influence of Caches on the Performance of Heaps. – Seattle University of Washington, 1996. – 29 p.