Структура данных Scapegoat Tree

Содержание

Слайд 2

Разработана Arne Andersson, Igal Galperin, Ronald L. Rivest в 1962г.

Ronald L. Rivest

Arne

Разработана Arne Andersson, Igal Galperin, Ronald L. Rivest в 1962г. Ronald L. Rivest Arne Andersson
Andersson

Слайд 3

 

Определение

Определение

Слайд 4

Понятия, необходимые для работы с данным деревом:
?−дерево
????[?]−корень дерева ?

Понятия, необходимые для работы с данным деревом: ?−дерево ????[?]−корень дерева ? ????[?],???ℎ?[?]−левые

????[?],???ℎ?[?]−левые и правый "сын" вершины
????ℎ??(?)− брат вершины (имеет общего родителя)
????ℎ(?)−глубина вершины (расстояние от вершины до корня)
ℎ???ℎ?(?)−глубина дерева ?
????(?)−вес вершины ? (кол−во всех ее дочерних вершины+1)
????[?]−размер дерева ? (вес корня)
???_size[T] – максимальный размер дерева T.

Слайд 6

Примеры

 

 

 

Примеры

Слайд 7

Плюсы и минусы Scapegoat дерева

Плюсы
Скорость одних операций возможно улучшить за счет

Плюсы и минусы Scapegoat дерева Плюсы Скорость одних операций возможно улучшить за
других операций.
Scapegoat tree работает быстрее, чем красно-черное дерево и декартово.
Требуется меньше памяти (не надо хранить информацию для балансировки).
Настройки скорости меняются в процессе выполнения.
Не требуется перебалансировать дерево при поиске.

Слайд 8

Минусы
В худшем случае операции модификации дерева могут занять ?(?) времени.
В случае

Минусы В худшем случае операции модификации дерева могут занять ?(?) времени. В
неправильного выбора парметра ???ℎ? часто используемые операции будут работать долго, а редко используемые – быстро. При этом дерево будет уступать остальным по скорости

Слайд 9

Поиск

 

Поиск

Слайд 10

Вставка

Начинается вставка нового элемента в Scapegoat-дерево классически: поиском ищем место, куда бы

Вставка Начинается вставка нового элемента в Scapegoat-дерево классически: поиском ищем место, куда
подвесить новую вершину и подвешиваем.
Легко понять, что это действие могло нарушить α-балансировку по весу для одной или более вершин дерева. И вот теперь начинается то, что и дало название структуре данных: мы ищем «козла отпущения» (Scapegoat-вершину) — вершину, для которой потерян α-баланс и её поддерево должно быть перестроено.
Сама только что вставленная вершина, хотя и виновата в потере баланса, «козлом отпущения» стать не может — у неё ещё нет «детей», а значит её баланс идеален.
Соответственно, нужно пройти по дереву от этой вершины к корню, пересчитывая веса для каждой вершины по пути. Если на этом пути встретится вершина, для которой критерий α-сбалансированности по весу нарушился — мы полностью перестраиваем соответствующее ей поддерево так, чтобы восстановить α-сбалансированность по весу.

Слайд 11

Перебалансировка

Обходим всё поддерево Scapegoat-вершины (включая её саму) с помощью in-order обхода —

Перебалансировка Обходим всё поддерево Scapegoat-вершины (включая её саму) с помощью in-order обхода
на выходе получаем отсортированный список (свойство In-order обхода бинарного дерева поиска).
Находим медиану на этом отрезке, подвешиваем её в качестве корня поддерева.
Для «левого» и «правого» поддерева рекурсивно повторяем ту же операцию.

Слайд 12

if start > ends then
begin
result := Nil;
exit;
end;
mid

if start > ends then begin result := Nil; exit; end; mid
:= ceil((start + ends) / 2.0);
d := nodesList[mid];
p := Node.Create(d.key);
leftNode := self.buildTreeFromSortedList(nodesList, start, mid-1);
p.left := leftNode;
rightNode := self.buildTreeFromSortedList(nodesList, mid+1, ends);
p.right := rightNode;
result := p;

Слайд 13

7

3

8

1

10

2

9

1

3

5

 

Пример:
α = 0.5

Верхний индекс – вес вершины
(количество всех ее потомков

7 3 8 1 10 2 9 1 3 5 Пример: α
+ 1)

Слайд 14

8

1

Вычислив медиану (2) (start = 0, ends = 4), подвешиваем 8 в

8 1 Вычислив медиану (2) (start = 0, ends = 4), подвешиваем
качестве корня поддерева (в данном случае корень самого дерева)

Пример:
α = 0.5

Верхний индекс – вес вершины
(количество всех ее потомков + 1)

Слайд 15

8

7

1

2

Далее, рекурсивно проходим влево, выполняем туже функцию, уменьшая параметр ends.
В левое поддерево

8 7 1 2 Далее, рекурсивно проходим влево, выполняем туже функцию, уменьшая
подвешиваем 7

Пример:
α = 0.5

Верхний индекс – вес вершины
(количество всех ее потомков + 1)

Слайд 16

8

7

2

3

Далее, рекурсивно проходим влево, выполняем туже функцию, уменьшая параметр ends.
В левое поддерево

8 7 2 3 Далее, рекурсивно проходим влево, выполняем туже функцию, уменьшая
подвешиваем 3

Пример:
α = 0.5

Верхний индекс – вес вершины
(количество всех ее потомков + 1)

3

1

Слайд 17

8

7

2

4

Далее, рекурсивно проходим вправо, выполняем туже функцию, увеличивая параметр ends.
В правое поддерево

8 7 2 4 Далее, рекурсивно проходим вправо, выполняем туже функцию, увеличивая
подвешиваем 10

Пример:
α = 0.5

Верхний индекс – вес вершины
(количество всех ее потомков + 1)

3

1

10

2

Слайд 18

8

7

2

5

Далее, рекурсивно проходим вправо, выполняем туже функцию, увеличивая параметр ends.
В левое поддерево

8 7 2 5 Далее, рекурсивно проходим вправо, выполняем туже функцию, увеличивая
вершины 10 подвешиваем 9
Выходим из рекурсии
Дерево имеет α-балансировку

Пример:
α = 0.5

Верхний индекс – вес вершины
(количество всех ее потомков + 1)

3

1

10

2

9

1