Центр оптико-нейронных технологий
ФГУ ФНЦ НИИСИ РАН |
|||||||||||||||||||||||||||||||||||||||||||||||
|
Прошитые деревьяПри представлении бинарного дерева в виде узлов, содержащих информационное поле и два поля связи, указывающих на поддеревья, количество полей связи, имеющих значения nil, всегда больше количества связей, указывающих на реально существующие узлы. Например, в дереве количество полей связи, имеющих значение nil, равно 10, а полей связи, указывающих на реально существующие узлы - 8. Иначе говоря, такой способ хранения деревьев оказывается неэффективным в отношении использования памяти, в особенности, если размер информационного поля сопоставим с размером указателя. Прошитые деревья - один из способов использования памяти, занимаемой в дереве пустыми указателями. Прошивка дерева позволяет выполнять b-обход дерева без использования рекурсии или стека, с помощью обычного цикла (как линейный список). Это значительно ускоряет процесс b-обхода деревьев с большим числом узлов. В прошитом дереве конечные связи (которые в обычном дереве равны nil), указывают на предшественников и преемников узлов в b-обходе. То есть если в обычном дереве llink=nil, то в прошитом llink указывает на предшественника данного узла, а если в обычном дереве rlink=nil, то в прошитом rlink указывает на преемника данного узла в b-обходе. Например: На этом рисунке прошитые связи (<нити>) обозначены пунктирными линиями. Значение самой левой и самой правой нити будет объяснено ниже. Поскольку нужно каким-то образом отличать обычную связь от прошитой, каждому узлу добавляется два однобитовых (логических) поля тэга: ltag и rtag. При значении тэга true соответствующее поле связи представляет обычную связь, при значении false - прошитую.
Значения связей в прошитом дереве приведены в следующей таблице:
Для того, чтобы значения самой левой и самой правой нити были определены, вводится головной узел HEAD. Дерево из приведенного выше примера в прошитом виде будет представлено в памяти следующим образом (для наглядности обозначим true через '+', false через '-'): А пустое прошитое дерево выглядит следующим образом: Алгоритм b-обхода прошитого дереваПусть HEAD - указатель на головной узел прошитого дерева, p - указатель на текущий узел. Тогда алгоритм b-обхода (ЛКП) прошитого дерева можно сформулировать следующим образом:
Алгоритм заканчивает работу когда p станет равным HEAD. Для ПКЛ-обхода следует везде, кроме пункта 1, поменять местами llink и rlink, ltag и rtag. Алгоритм прошивки дерева
Замечание 2. При изменениях в дереве (добавлении или удалении узлов) его нужно прошивать заново. Поэтому прошитые деревья целесообразно использовать в тех задачах, где изменения в деревьях происходят редко, а b-обход выполняется часто. Литература
Copyright c2000-2002 Михаил
Марковский |
||||||||||||||||||||||||||||||||||||||||||||||
© Центр оптико-нейронных технологий
Федеральное государственное учреждение Федеральный научный центр Научно-исследовательский институт системных исследований Российской академии наук All rights reserved. 2016 г. |