Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Представление в виде деревьев



Одна из самых популярных реализаций – Rope – предложена Hans Boehm, HP (автор одного из самых популярных консервативных сборщиков мусора для C) в 1980 годах.

· В каждой вершине ссылки на потомков или на память с символами (или на другую реализацию строк). Во внутренних вершинах вместе со ссылками хранят длины

строк, представленных левым и правым детьми (чтобы не пересчитывать).

Можем ссылаться на одни и те же вершины.

Время от времени дерево нужно перебалансировать.

///Связка (rope) представляет неизменяемую последовательность символов. Длина (length) - это просто количество символов в последовательности. Большинство реализаций строк хранят все свои символы в памяти последовательно - друг за другом. Главное свойство связки - отсутствие этого ограничения, что позволяет фрагментам связки храниться независимо и дает возможность соединять их при помощи соединительных узлов (concatenation nodes). Подобная архитектура позволяет выполнять соединение строк гораздо быстрее, чем это делается для Java-объектов типа String. Реализация соединения для объектов String требует, чтобы строки, которые нужно объединить, были скопированы в новое место, что является операцией сложности O(n). Связка, с другой стороны, просто создает новый соединительный узел, а это операция сложности O(1). /////

Операции с этим деревом.

· Конкатенация мгновенная, создается новая вершина, указывающая на строку и добавку.

· Балансировка происходит путем вращения. Цель – не наименьшая высота, а примерно одинаковая длина строк в поддеревьях.

Конкатенация.

· При конкатенации длинной строки и короткой добавки, однако, дерево получается неоптимальным.

· Каждый раз перестраивать такое дерево невыгодно.

· Но можно, если пользуемся счетчиком ссылок (имеем право, т.к. циклов нет) и уверены, что ссылка единственная, не создать новое дерево, а перестроить, используя старые вершины. Если система программирования позволяет, конечно. Haskell, например, не позволит.

Занятно: при генерации текста высокоуровневой программы по её синтаксическому дереву полученный Rope (без балансировки) будет изоморфен дереву программы.





Дата публикования: 2015-02-20; Прочитано: 207 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...