Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Одна из самых популярных реализаций – Rope – предложена Hans Boehm, HP (автор одного из самых популярных консервативных сборщиков мусора для C) в 1980 годах.
· В каждой вершине ссылки на потомков или на память с символами (или на другую реализацию строк). Во внутренних вершинах вместе со ссылками хранят длины
строк, представленных левым и правым детьми (чтобы не пересчитывать).
Можем ссылаться на одни и те же вершины.
Время от времени дерево нужно перебалансировать.
///Связка (rope) представляет неизменяемую последовательность символов. Длина (length) - это просто количество символов в последовательности. Большинство реализаций строк хранят все свои символы в памяти последовательно - друг за другом. Главное свойство связки - отсутствие этого ограничения, что позволяет фрагментам связки храниться независимо и дает возможность соединять их при помощи соединительных узлов (concatenation nodes). Подобная архитектура позволяет выполнять соединение строк гораздо быстрее, чем это делается для Java-объектов типа String. Реализация соединения для объектов String требует, чтобы строки, которые нужно объединить, были скопированы в новое место, что является операцией сложности O(n). Связка, с другой стороны, просто создает новый соединительный узел, а это операция сложности O(1). /////
Операции с этим деревом.
· Конкатенация мгновенная, создается новая вершина, указывающая на строку и добавку.
· Балансировка происходит путем вращения. Цель – не наименьшая высота, а примерно одинаковая длина строк в поддеревьях.
Конкатенация.
· При конкатенации длинной строки и короткой добавки, однако, дерево получается неоптимальным.
· Каждый раз перестраивать такое дерево невыгодно.
· Но можно, если пользуемся счетчиком ссылок (имеем право, т.к. циклов нет) и уверены, что ссылка единственная, не создать новое дерево, а перестроить, используя старые вершины. Если система программирования позволяет, конечно. Haskell, например, не позволит.
Занятно: при генерации текста высокоуровневой программы по её синтаксическому дереву полученный Rope (без балансировки) будет изоморфен дереву программы.
Дата публикования: 2015-02-20; Прочитано: 207 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!