Lecture2_Reingold_Tilford_2013

advertisement
Рисование статических
деревьев
Апанович З.В.
apanovich@iis.nsk.su
Тел:3309344
К. 217
Приведение табличных данных в
древовидную форму
Имя
Пол
Место_проживания
Катя
жен
Томск
Петя
муж
Киев
Вася
муж
Новосибирск
Оля
жен
Новосибирск
Юра
муж
Томск
Маша
жен
Томск
Деревья, основные определения
(Лес)
• Неориентированный ациклический граф
называется лесом
Деревья, основные определения
(Дерево без выделенного корня или
свободное дерево)
Неориентированный
ациклический связный граф
называется деревом без
выделенного корня или
свободным деревом.
Деревья делятся на корневые
деревья и свободные
деревья.
Основные свойства
неориентированных деревьев
Теорема
Дан G = (V, E) – неориентированный граф.
Следующие свойства равносильны:
1.
G – дерево;
2.
Для любых двух вершин G !
соединяющий их простой путь;
3.
Граф G связен, но перестает быть
связным, если удалить любое его
ребро;
4.
G - связен и |E| = |V|-1;
5.
G - ациклический и |E| = |V|-1;
6.
G - ациклический, но добавление
любого ребра порождает цикл.
Корневое дерево
Корневое дерево Т имеет выделенную
вершину, которая называется корнем
дерева Т.
Мы только что видели, что от каждой
вершины (в том числе, и от корня) к
каждому узлу идет единственный путь.
Сориентируем все ребра, находящиеся
на этом пути, от корня r к v.
Тогда:
А) в корень не входит ни одного ребра;
Б) в каждый узел, кроме корня, входит
ровно одно ребро.
Глубина узла x в дереве T
• Глубина узла x в дереве T
равна длине пути от корня до
x.
• Высота узла x в дереве –
длина самого длинного пути
от x до какого-нибудь листа.
• Высота дерева равна высоте
его корня.
• Уровень узла x в дереве
равен разности высоты
дерева и глубины узла x.
depth(r) = 0; h(T) = 4;
depth(x) = 4.
Поддерево с корнем в x
Для каждой вершины x можно
рассмотреть множество всех
вершин, для которых вершина
x является предком. Это
подмножество называется
поддеревом с корнем в x
Упорядоченное дерево
• Упорядоченное дерево – это дерево, в
котором множество сыновей каждого узла
упорядочено. При отрисовке порядок
сыновей изображается их расположением
слева направо.
Бинарные и многопутевые
деревья
• Деревья также можно разделить на
бинарные (binary) деревья и
многопутевые (multiway) деревья.
Бинарное дерево
• Бинарное дерево – это такое
упорядоченное дерево, где
каждая вершина имеет не
более двух сыновей и каждый
сын произвольного узла
идентифицируется либо как
левый сын либо как правый
сын.
• Каждый узел имеет не более
одного левого сына и не
более одного правого сына.
• Узел имеющий, только
правого сына, не равен узлу
имеющего только левого
сына.
Полное бинарное дерево
• Бинарное дерево называется полным,
если для некоторого k каждый узел
глубины < k имеет и правого и левого
сына, а каждый узел глубины = k
является листом
Многопутевое дерево
Многопутевое дерево T,
имеющее n вершин, может быть
либо пустым (при n = 0), либо
(при n > 0) состоит из корневой
вершины u и многопутевых
поддеревьев T1, .., Tdu
имеющих n1,..ndu вершин так,
что количество вершин в
дереве Т : n = 1+n1+… + ndu
• du называется степенью
вершины u. Такие деревья
называют еще деревьями
произвольной степени.
Эстетические критерии, обычно
предъявляемые к изображениям
деревьев
Плоское изображение
(не должно
содержать
пересечений ребер)
– это требование к
изображениям
деревьев достаточно
естественно, так как
все деревья
планарны.
Эстетические критерии, обычно
предъявляемые к изображениям
деревьев
Отображение иерархии
В наиболее строгой форме это
требование формулируется
как поуровневость
изображения, то есть
вершины, находящиеся на
одном расстоянии от корня,
должны иметь одну и ту же
y-координату:
if depth(v1) == depth(v2)=>
y(v1) = y(v2).
Эстетические критерии, обычно
предъявляемые к изображениям
деревьев
Упорядоченность Если
номер вершины или
поддерева N(Ti) <
N(Tj), то это
поддеревоTi
изображается левее
Tj.
Охватывающий прямоугольник (Bounding
box ,enclosing rectangle)
Часто для оценки
площади изображения
используется размер
охватывающего
прямоугольника. Его
стороны параллельны
осям координат
Эстетические критерии, обычно
предъявляемые к изображениям
деревьев
Минимизация площади
Площадь подсчитывается
как количество узлов
сетки, содержащихся
внутри охватывающего
прямоугольника
изображения дерева.
Это понятие напрямую
связано с понятием
резолюции –
минимальным
расстоянием между
узлами сетки.
Эстетические критерии, обычно
предъявляемые к изображениям
деревьев
Изображение дерева
обладает свойством
разделимости
поддеревьев, если для
любых двух
непересекающихся
поддеревьев ( T1T2 =
) охватывающие
прямоугольники их
изображений тоже не
пересекаются
( rect( T1) rect(T2) = ).
Эстетические критерии, обычно
предъявляемые к изображениям
деревьев
С 1981 года известно, что любое бинарное
дерево, имеющее n вершин, может быть
изображено на целочисленной сетке площади
O(n) [L. Valiant].
Поэтому интерес представляет вопрос о
конкретных свойствах изображения, влияющих
на площадь этого изображения.
Эстетические критерии при поуровневом
изображении деревьев
• В 1979 году C. Wetherell и A. Shannon представили
алгоритм линейной сложности для рисования
бинарных деревьев, который обеспечивал
отображение иерархической структуры дерева
благодаря следующим свойствам:
• Поуровневость: y-координата каждой вершины
равна глубине вершины;
• Упорядоченность: левый сын каждой вершины
располагается слева от правого сына;
• Центрированность: каждый родитель центрирован
относительно своих сыновей.
Эстетические критерии при поуровневом
изображении деревьев
• В 1981 Рейнгольд и Тилфорд улучшили
алгоритм добавив еще два свойства:
• Изоморфизм;
• Симметричность.
Изоморфизм изображений
поддеревьев
Изоморфизм: каждая пара изоморфных поддеревьев
рисуется идентично с точностью до переноса. То есть,
изображение каждого поддерева не зависит от расположения
этого поддерева внутри всего дерева
Симметричность изображения
дерева
Симметричность Если инвертировать все
порядки сыновей в дереве, то изображение
полученного дерева будет отражением
изображения исходного дерева.
Идея алгоритма РейнгольдаТилфорда
Подслучаи, когда
Т2= и Т1 = :
Схема алгоритма РейнгольдаТилфорда
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Вход: Бинарное дерево Т
Результат: Поуровневое изображение дерева Т
1. если |Т| =1, то его изображение определяется тривиально;
2.иначе { /* Применять рекурсивно алгоритм для построения изображения левого и правого
поддеревьев дерева Т : */
3.
T = ЛевоеПоддерево (Т);
4.
T = ПравоеПоддерево(Т);
5.
ПоуровневоеИзображение(T);
6.
ПоуровневоеИзображение(T);
}
7. если |T|  0  |T|  0, то{
8.
Разместить изображение T относительно изображения T так, чтобы расстояние
между ними стало равным 2, а расстояние между корнями – четным.
9.
Разместить корень Т на единицу выше по вертикали и на одинаковом расстоянии от
корней T' и T.
}
10.иначе /* если |T| = 0 или |T| = 0 */{
11.
Разместить корень Т по отношению к непустому дереву так, чтобы он оказался на 1
выше и на 1 правее (соответственно левее) от непустого поддерева.
}
}
Как реализовать алгоритм Рейнгольда Тилфорда за
время O(n)?
Реализация описанного алгоритма « в
лоб» имеет квадратичную сложность:
на каждом шаге рекурсии надо:
A. сначала вычислять новую позицию
правого поддерева T,
B. затем сдвигать T в эту позицию,
перевычисляя горизонтальные
координаты всех вершин T.
Рейнгольд-Тилфорд за время
О(n)
Шаг 1. Обход дерева Т в обратном порядке:
Для вершины v, рекурсивно вычисляются
относительные смещения левого сына v1 и
правого сына v2 по отношению к v.
Шаг 2. Обход в прямом порядке: абсолютные
x-координаты всех вершин дерева Т
вычисляются суммированием относительных
смещений на пути от корня до каждой
вершины.
Проблема Б: Вычисление абсолютных
координат по относительным смещениям:
absolute(v) 
 relativev 
vi  path( r , v )
i
, где r – это корень
данного поддерева
Проблема А: Вычисление сдвига
правого поддерева
Левый и правый контур
поддерева
• В условиях задачи было оговорено, что изображение
каждого поддерева не должна зависеть от его
положения в объемлющем дереве.
• Значит, для сравнения координат вершин двух
поддеревьев достаточно рассматривать только
координаты вершин, принадлежащих «границе»
каждого поддерева. То есть, на каждом уровне
можно сравнивать только x-координату самой правой
вершины левого поддерева и x-координату самой
левой вершины правого поддерева. Для реализации
этой идеи, введем понятие правого и левого
контура поддерева.
Левый и правый контур
поддерева
• Определение Левый контур L(T) бинарного дерева
Т высоты h - это последовательность вершин
v0,..vh , такая, что vi – это самая левая вершина на
глубине i. Правый контур R(T) определяется
аналогично
Вычисление сдвига поддерева Т
по контурам деревьев Т и Т 
dist ( r , r )  max {lefti  right i  2}
i  hmin
left – правый контур левого поддерева (T´),
right – левый контур правого поддерева (T),
lefti, righti - абсолютные координаты вершин контуров
на глубине i.
Вычисление сдвига поддерева Т по
контурам деревьев Т и Т 
После этого корень правого поддерева получает положительное
относительное смещение relative(r’’) = [dist(r, r) +1]/2,
а корень левого поддерева получит отрицательное
относительное смещение relative(r’) = - [dist (r, r) +1]/2.
Вычисление сдвига поддерева Т по
контурам деревьев Т и Т 
Сдвиг корня правого
поддерева T относительно
корня левого поддерева T´
равен 6. Поэтому
относительное смещение
корня T относительно корня
T равно +3, аналогично
относительное смещение
корня T относительно корня
T равно -3.
Вычисление сдвига поддерева Т по контурам
деревьев Т и Т  за линейное время
• Поскольку каждая вершина
принадлежит просмотренной части
левого контура правого поддерева L(T)
не более, чем для одной комбинации
поддеревьев, и участвует не более, чем
в двух сравнениях, общее количество
таких сравнений зависит линейно от n
для полного дерева.
Вычисление контура дерева Т по
контурам деревьев Ти Т
•
1.
2.
3.
Для перехода на следующий уровень рекурсивного обхода
необходимо построить левый и правый контур L(T) и R(T) для
дерева Т с корнем в вершине v. Эффективность вычислений
обеспечивается тем, что при вычислении контуров L(T) и R(T)
используются уже известные контуры поддеревьев T и T.
Обозначим через h(T) высоту дерева Т. При объединении
контуров T и T возможен один из следующих случаев:
оба поддерева T и T имеют одинаковую высоту: h(T) =
h(T),
высота левого поддерева меньше, чем высота правого
поддерева ( h(T) < h(T)),
высота правого поддерева меньше, чем высота левого
поддерева h(T) > h(T).
Вычисление контура дерева Т по
контурам деревьев Ти Т
1. Если оба поддерева (T) и (T) имеют
одинаковую высоту h(T) = h(T),
то L(T) = r + L(T)), (R(T) = r + R(T’’)).
Вычисление контура дерева Т по
контурам деревьев Т и Т
•
•
•
Если h(T) < h(T)), то результирующие контуры вычисляются
следующим образом:
а) R(T) = r + R(T');
б) Левый контур будет состоять из трех частей: корневая
вершина r плюс левый контур левого поддерева и порция
левого контура правого поддерева от вершины w до его
самой нижней вершины (L(T) = r + L(T) + {часть L(T),
начиная с w}).
Вычисление контура дерева Т по
контурам деревьев Т1 и Т2
h(T)  h(T): В случае
объединения двух поддеревьев
разной высоты, контуры
поддеревьев «сшиваются» при
помощи нити(thread), а
относительное смещение
вершины w, связанной нитью с
вершиной u, можно вычислить
по формуле: relative(w) =
absolute(u) – absolute(w).
Благодаря этому, абсолютная
позиция вершины w вычисляется
вдоль контура нового поддерева.
Алгоритм Рейнгольда-Тилфорда не
гарантирует минимальной площади
изображения!
а
(
Поуровневое изображение
меньшей ширины
Свойства изображения, построенного
алгоритмом Рейнгольда-Тилфорда
Утверждение:
Алгоритм построения изображения бинарного дерева методом
Рейнгольда-Тилфорда строит изображение, обладающее
следующими свойствами:
• Плоское, прямолинейное, сетчатое и строго восходящее;
• Для каждой вершины v верно соотношение: y(v) = depth(v) ;
• Занимает площадь O(n2);
• x(vi) – x(vj)  1 , i  j;
• Изоморфные поддеревья имеют конгруентные изображения с
точностью до переноса;
• Родительская вершина центрирована относительно своих
сыновей;
• Ширина изображения не всегда минимальна при заданных
условиях, но в общем-то она достаточно близка к минимуму.
Поуровневое изображение для
многопутевых деревьев
Схема алгоритма
Вход Дерево Т с поддеревьями Т1,Т2,...Tm
Выход: поуровневое изображение дерева Т
Метод ПоуровневоеИзображение(Т) = {
1. если Т состоит из одной вершины, то его изображение
определяется тривиально;
2. иначе Для каждого из поддеревьев Ti
ПоуровневоеИзображение( Ti );
3. Сдвигать изображение T i+1 относительно Ti до тех пор, пока
горизонтальное расстояние между ними не станет равным 2 ;
4. если m>1 то Поместить корень Т на один уровень выше и
посередине между корнями деревьев T1 … Tm ;
5. иначе поместить корень на горизонтальном и вертикальном
расстоянии 1 от сына;
}
Поуровневое изображение для
многопутевых деревьев (деревьев
произвольной степени)
• В случае, когда вершина имеет более двух сыновей,
может оказаться, что небольшие поддеревья будут
максимально сдвинуты влево, что ведет к нарушению
принципа симметрии: при отражении дерева
относительно оси y получается другое изображение.
Решение: взять среднее арифметическое
x-координат двух размещений
x(vi) = (xleft(vi)+xright(vi))/2
В этом случае результирующее изображение
будет удовлетворять всем заданным условиям,
но при этом маленькие поддеревья будут
размещены неравномерно
Вопрос: как модифицировать алгоритм, так
чтобы все маленькие
поддеревья были размещены равномерно?
Свойства поуровневого размещения
многопутевого дерева
• Утверждение
• Алгоритм поуровневого рисования дерева
произвольной степени строит изображение дерева Т
с n вершинами, обладающее следующими
свойствами:
• Плоское, прямолинейное и строго восходящее;
• Поуровневое: y(vi) = depth(vi);
• Занимает площадь O(n2);
• Любые две вершины расположены на
горизонтальном расстоянии не менее 1;
• Изоморфные поддеревья имеют конгруентные
отрисовки с точностью до переноса;
Основные недостатки
поуровневого алгоритма
• Площадь изображения имеет оценку O(n2);
• Часть экрана, в которой расположен корень дерева практически
пустая, а там, где находятся листья, изображение сильно
загромождено;
• Для сбалансированных деревьев с большим количеством
вершин ширина такого изображения обычно во много раз
превосходит его высоту:
Пути преодоления проблемы
- Другие статические алгоритмы с
лучшей оценкой площади;
- Радиальный и круговые алгоритмы для
свободных деревьев;
- Интерактивные алгоритмы с хорошей
навигацией по дереву.
Восходящие изображения
деревьев.
Для бинарных деревьев, следующими по
читаемости после поуровневых изображений,
считаются восходящие (нисходящие)
изображения деревьев.
Определение (Восходящее изображение) это такое плоское прямолинейное,
сетчатое изображение, в котором для
любого ребра (v, u) вершина v расположена
выше, чем вершина u (отец расположен выше
сына).
HV-изображение бинарного
дерева
Определение (hv-изображение)
бинарного дерева T- это плоское,
прямолинейное, сетчатое
изображение, такое, что
• для каждой вершины u, сын вершины
u находится:
• либо на одной горизонтали и
справа от u,
• либо на одной вертикали и под u.
• ортогональное и (не строго)
восходящее изображение.
• охватывающие прямоугольники
поддеревьев вершины u не
пересекаются(subtree separation).
• NB: Нет требования упорядоченности
hv-изображения и восходящие
изображения деревьев
Утверждение Дано t – hv-изображение
бинарного дерева T.
Существует строго восходящее изображение
t бинарного дерева T, чья площадь не более
чем в 2 раза превышает площадь
изображения t.
Доказательство.
Строго восходящее изображение t' можно получить из
hv-изображения t при помощи следующей
трансформации:
1) для каждой вершины, имеющей координаты (x, y) в
hv-изображении t, нарисовать вершину с координатами
(x, x+y) в восходящем изображении t'.
2) Если в hv-изображении t реберный сегмент
соединял вершины с координатами (x, y) и (x,y), то
нарисовать сегмент, соединяющий вершины (x, x+y) и
(x, x+y).
Трансформация hv-изображения в
восходящее изображение дерева
•
•
•
•
•
•
•
•
(x, y)-> (x, x+y):
(0,0)->(0,0)
(1,0)->(1,1)
(2,0)->(2,2)
(1,1)->(1,2)
(0,2)->(0,2)
(1,2)->(1,3)
(0,3)->(0,3)
Трансформация hv-изображения в
восходящее изображение дерева
• Для полного доказательства
утверждения надо показать, что
в результате трансформации
• (x, y) -> (x, x+y) :
– изображение t’ будет
восходящим и будет
изображать то же самое
дерево (упражнение);.
– будет плоским (не возникнет
пересечений ребер);
– его площадь не более чем в 2
раза превышает площадь t.
Трансформация hv-изображения в
восходящее изображение дерева
1) В результате
трансформации
• (x, y)-> (x, x+y)
горизонтальный
отрезок перейдет
в диагональный,
а вертикальный в вертикальный
Трансформация hv-изображения в
восходящее изображение дерева
Если два вертикальных или два
диагональных отрезка,
пересекаются, то пересекаются и
их прообразы.
Предположим поэтому, что s1- это
диагональный сегмент,
1
1
1
соединяющий вершины ( x1 , x1  y1 )
и ( x12 , x12  y12 ) , а s2 – это вертикальный
сегмент, соединяющий вершины
( x12 , x12  y12 )
( x22 , x22  y22 )
1. s1 соответствует горизонтальному сегменту в t, =>
y11  y12
1
1
1
2. точка пересечения сегментов s1 и s2 имеет координаты ( x 2 , x 2  y1 )
3.
x11  x12  x12
y12  y11  y 22
4. Значит, t содержит два пересекающихся ребра
Трансформация hv-изображения в
восходящее изображение дерева
• (x, y)-> (x, x+y)
• 1) При таком отображении
ширина изображения не
меняется: w(t)= w(t).
• 2) Поскольку рассматриваются
неупорядоченные деревья,
можно считать без потери
общности, что w(t) ≤ h(t).
• Тогда:
• h(t) ≤ h(t) + w(t) ≤ 2 h(t)
Построение hv-изображения
• Построить рекурсивно
hv-изображения для
левого и правого
поддеревьев
• Выполнить либо
– Горизонтальную
комбинацию либо
– Вертикальную
комбинацию
• И высота и ширина не
превышают n
Горизонтальная комбинация:
(x,y)
(x’+1,y)
(x,y+1)
(x’,y+1)
Вертикальная комбинация:
(x,y)
(x+1, y)
(x+1,y’)
(x,y’+1)
Алгоритм построения hv-изображения
•
•
•
•
Вход. Корневое бинарное дерево Т
Выход hv-изображение дерева Т.
если |Т| =1, то Тривиальное_изображение(Т);
иначе{ /* Применять рекурсивно алгоритм для
построения изображения левого и правого
поддеревьев дерева Т : */
T = ЛевоеПоддерево (Т);
•
T = ПравоеПоддерево(Т);
•
hv-изображение(T);
•
hv-изображение(T);
}
• Скомбинировать изображение T’’с изображением T’
при помощи либо горизонтальной либо вертикальной
комбинации.
• }
Алгоритм построения утяжеленного
вправо hv-изображения
• Вход. Корневое бинарное дерево Т
• Выход Утяжеленное вправо hv-изображение дерева
Т.
• если |Т| =1, то Тривиальное_изображение(Т);
• иначе /* Применять рекурсивно алгоритм для
построения изображения левого и правого
поддеревьев дерева Т : */
• Утяжеленное вправо hv-изображение(T’);
• Утяжеленное вправо hv-изображение(T’’);
• если |T’| ≤ |T’’| то T’ = ЛевоеПоддерево (Т); T’’ =
ПравоеПоддерево(Т);
• иначе T’’ = ЛевоеПоддерево (Т); T’ =
ПравоеПоддерево(Т);
• Скомбинировать изображение T’’с изображением T’
при помощи горизонтальной комбинации.
Алгоритм построения hv-изображения
Что можно сказать про площадь этого изображения???
Заблокированность вершины
• Будем называть вершину v степени <3
загороженной снизу, если вертикальная
линия, проходящая через v, пересекает
часть изображения, расположенную под
v.
Свойства утяжеленного вправо hvизображения
• Утверждение. Алгоритм построения утяжеленного вправо
hv-изображения строит изображение бинарного дерева Т,
имеющего n вершин. Изображение обладает следующими
свойствами:
• Это восходящее, плоское, сетчатое, прямолинейное и
ортогональное изображение, то есть, hv –изображение;
• Изображение занимает площадь O(nlogn);
• Его ширина не превышает n;
• Его высота не превышает log n;
• Корень размещается в верхнем левом углу и.
• Оно не является упорядоченным!
• Оно обладает свойством незагороженности снизу
Литература
• E. Reingold J. Tilford Tidier drawings of trees
IEEE Transactions on Software Engineering 7(2)
P.223-228,1981
• J. Walker II A node-positioning algorithm for
general trees Software-Practice and Experience
20(7) P. 685-705, 1990.
• C. Buchheim, M. Junger, S. Leipert Improving
Walker’s Algorithm to Run in Linear Time LNCS
2528, P. 344-355, 2002
• C. Wetherell and A. Shannon.: Tidy drawing of
trees. IEEE Trans. Softw. Eng., SE-5(5):514520, 1979
Отец и сын вершины в дереве
Пусть Т=(V, E) является
корневым деревом.
Если в дереве
имеется ребро (u,v),
то u является отцом
узла v, а v является
сыном u.
Предок вершины
• Назовем предками
вершины все
вершины,
находящиеся на
пути от корня r к
вершине x
(ancestors).
Потомок вершины
Если y является предком x,
то x является потомком y.
Каждая вершина является
своим предком и
потомком. Предки и
потомки вершины x, не
совпадающие с x,
называются
собственными предками и
собственными потомками.
Лист дерева
• Вершина, не
имеющая
собственных
потомков,
называется листом
дерева
Download