Оригинальная формулировка: tt25.rar
Дерево ключей, дерево цифрового поиска... Названий очень много.. Каждый называют его так, как ему удобно.
Для применения в чистом виде, вещь абсолютно бесполезная (почему? объяснять не буду). Но писать её немного интереснее чем, алгоритмы для make файлов (которые в тестах бывают чаще всего). Само дерево храниться ввиде списка рёбер. Каждое ребро имеет текст, потомка, список соседей по узлу и счётчик использования. Текст ребра выделяется отдельно от стуктуры ребра. Если по размеру текст ребра не больше чем размер ссылки, то текст хранится непосредвенно в байтах самой ссылки. Если счётчик использования ребра меньше чем сумма счётчиков его прямых потомков, то считается что данное ребро содержит конец слова. Для ребра без потомков, сумма счётчиков потомков равна нулю.
abc (count=2) 123 (count=1) 456 (count=1) |
Содержит два слова 'abc123', 'abc456'. |
123 (count=2) 456 (count=1) |
Содержит два слова '123456', '123'. |
Вот в целом и всё. Прилагается исходник в оригинальном исполнении с набором тестовых процедур. Немного изменена процедура SpliceNode(...). В ней, выделение памяти вместо кучи происходит в стеке, поэтому с большими словами надо быть осторожным. Прилагается более быстрый и экономный менеджер памяти, который можно в него вставить.
Тестовые словари можно взять тут: http://www.insidepro.com/rus/download.shtml