балансировка бинарного дерева
- From
- Spiridonov Ed (2:5059/9.55)
- To
- All
- Date
- 2003-01-04T14:23:56Z
- Area
- RU.ALGORITHMS
Здравствуй All!
какие алгоритмы существуют?
поясню задачу - есть небольшой движок бд, используемый на слабеньких по
сегодняшним меркам машинах (палм - 33mhz процессор motorola 68k, 8b ram). в нем
для индексов используются бинарные деревья (сами индексы используются для
сортировки, поиска, фильтрации).
хочется в фоне производить балансировку этого дерева. самый простой вариант
(перестроить дерево заново) не подходит - он требует больших затрат времени и
памяти.
поэтому хочется найти некий итерационный алгоритм (многозадачности нет, так что
необходимо при появлении какого-либо события как можно быстрее остановить
балансировку и продолжить работу).
в общем-то алгоритм уже прорисовывается (взять вершину, которая должна быть в
центре, поставить её туда, повторить рекурсивно для левого и правого
поддеревьев), но наверняка это уже решено кем-нибудь красиво.
почему не используются avl-деревья или b-tree:
- b-tree оптимизированно под внешние носители, при размещении данных в озу
двоичное дерево ИМХО намного эффективнее; у avl-деревьев большие накладные
расходы на модификацию дерева
- необходимо модифицировать алгоритмы работы с этими деревьями, чтобы
поддерживать актуальной всю необходимую мне информацию (см ниже)
- проблема сбалансированности стоит не очень остро - данные подготавливаются
на обычном пк и в исходном положении все деревья сбалансированы
если кому интересно - в каждой вершине дерева хранится:
- сслыки на потомков слева и справа (вершины левого и правого поддерева)
- количество вершин в левом и в правом поддереве (чтобы можно было быстро
узнать порядковый номер вершины)
- ссылки на предыдущую и следующую вершины (для быстрого последовательного
обхода дерева - от этого можно и отказаться).
С уважением, Ed.
--- Ничего особенного
* Origin: My tiny station, Penza (2:5059/9.55)