Лекция 4. Префиксные деревья (Tries, prefix trees)
-
Upload
mikhail-kurnosov -
Category
Software
-
view
326 -
download
0
description
Transcript of Лекция 4. Префиксные деревья (Tries, prefix trees)
![Page 1: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/1.jpg)
Лекция 4Префиксные деревья(Trie, prefix tree)
Курносов Михаил Георгиевич
E-mail: [email protected]: www.mkurnosov.net
Курс “Алгоритмы и структуры данных”Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)Осенний семестр, 2014
![Page 2: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/2.jpg)
struct rbtree *rbtree_lookup(struct rbtree *tree, int key){
while (tree != NULL) {if (key == tree->key)
return tree;else if (key < tree->key)
tree = tree->left;else
tree = tree->right;}return tree;
}
Словарь со строковыми ключами
При анализе вычислительной сложности операций бинарных деревьев поиска (АВЛ-деревьев, красно-черных деревьев, Splay trees), списков с пропусками (Skip lists) мы полагали, что время выполнения операции сравнения двух ключей (==, <, >) есть O(1)
Если ключи – это длинные строки (char[]), то время выполнения операции сравнения (strcmp()) становится значимым и его следует учитывать!
key1 == key2
key1 < key2
key1 > key2
O(1)
![Page 3: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/3.jpg)
Префиксные деревья (Trie)
3
Префиксное дерево (Trie, prefix tree, digital tree, radix tree) –это структура данных для реализации словаря (ассоциативного массива), ключами в котором являются строки
Авторы: Briandais, 1959; Fredkin, 1960
Происхождение слова “trie” – retrieval (поиск, извлечение, выборка, возврат)
Альтернативные названия:
o бор (Д. Кнут, Т. 3, 1978, выборка)
o луч (Д. Кнут, Т. 3, 2000, получение)
o нагруженное дерево (А. Ахо и др., 2000)
![Page 4: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/4.jpg)
Префиксные деревья (Trie)
4
Префиксное дерево (Trie, prefix tree, digital tree, radix tree) –это структура данных для реализации словаря (ассоциативного массива), ключами в котором являются строки
Практические применения:
o Предиктивный ввод текста (predictive text) –поиск возможных завершений слов
o Автозавершение (Autocomplete)в текстовых редакторах и IDE
o Проверка правописания (spellcheck)
o Автоматическая расстановка переносов слов (hyphenation)
o Squid Caching Proxy Server
![Page 5: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/5.jpg)
Словарь
Префиксные деревья (Trie)
5
Б Т
Ключ (Key) Значение (Value)
ТИГР 180
ТАПИР 300
БАРИБАЛ 150
БАРСУК 15
А
Р
И
Б
А
Л
С
У
К
150
$15
$
А И
П
И
Р
300
$
Г
Р
180
$
![Page 6: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/6.jpg)
Префиксные деревья (Trie)
Префиксное дерево (trie)содержит n ключей (строк) и ассоциированные с ними значения (values)
Ключ (key) – это набор символов (c1, c2, …, cm) из алфавита A = {a1, a2, …, ad}
Каждый узел содержит от 1 до d дочерних узлов
За каждым ребром закреплен символ алфавита
Символ $ – это маркер конца строки (ключа)
Б Т
А
Р
И
Б
А
Л
С
У
К
150
$15
$
А И
П
И
Р
300
$
Г
Р
180
$
![Page 7: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/7.jpg)
Префиксные деревья (Trie)
Префиксное дерево (trie)содержит n ключей (строк) и ассоциированные с ними значения (values)
Ключ (key) – это набор символов (c1, c2, …, cm) из алфавита A = {a1, a2, …, ad}
Каждый узел содержит от 1 до d дочерних узлов
За каждым ребром закреплен символ алфавита
Символ $ – это маркер конца строки (ключа)
Б Т
А
Р
И
Б
А
Л
С
У
К
150
$15
$
А И
П
И
Р
300
$
Г
Р
180
$
Алфавит A = {А-Я}d = 33
![Page 8: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/8.jpg)
Префиксные деревья (Trie)
Ключи (keys) не хранятся в узлах дерева
Позиция листа в дереве определяется значением его ключа
Значения (values) хранятся в листьях
Б Т
А
Р
И
Б
А
Л
С
У
К
150
$15
$
А И
П
И
Р
300
$
Г
Р
180
$
![Page 9: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/9.jpg)
Префиксные деревья (Trie)
Ключ Значение
Тигр 180
Барибал 150
Тапир 300
Волк 60
Барсук 15
Бегемот 4000
Барс 55
Символ $ –это маркер конца строки
Высота дерева h = O(max(keyi)),i = 1, 2, …, n
Б Т
А
Р
И
Б
А
Л
С
У
К
150
$15
$
А И
П
И
Р
300
$
Г
Р
180
$
Г
Е
М
О
Т
4K
$
Е
В
О
Л
К
60
$
![Page 10: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/10.jpg)
Узел префиксного дерева (Trie)
10
Ключ – это набор символов (c1, c2, …, cm) из алфавита A = {a1, a2, …, ad}
Каждый узел содержит от 1 до dуказателей на дочерние узлы
Значения хранятся в листьях
Value
c1 c2 … cd
Б Т
А
Р
И
Б
А
Л
С
У
К
$15
$
А И
П
И
Р
300
$
Г
Р
180
$
Как хранить c1, c2, …, cd (массив, список, BST, hash table)?
![Page 11: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/11.jpg)
Value
c1 c2 … cd
Вставка элемента в префиксное дерево (Trie)
11
1. Инициализируем k = 1
2. В текущем узле (начиная с корня)отыскиваем символ ci, равный k-у символу ключа key[k]
Value
c1 c2 … cd
root
3. Если ci ≠ NULL, то
a) Делаем текущим узел, на который указывает ci
b) Переходим к следующему символу ключа (k = k + 1)и пункту 2
4. Если ci = NULL, создаем новый узел, делаем его текущим, переходим к следующему символу ключа и пункту 2
5. Если достигли конца строки ($) вставляем значение в текущий в узел (проверить, что ключ уникальный)
Value
c1 c2 … cd
Value
c1 c2 … cd
![Page 12: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/12.jpg)
Вставка элемента в префиксное дерево (Trie)
12
Добавление элемента
(Тигр, 180)Т
И
Г
Р
180
$
![Page 13: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/13.jpg)
Вставка элемента в префиксное дерево (Trie)
13
Добавление элемента
(Тигр, 180)
Добавление элемента
(Тапир, 300)
Т
А И
П
И
Р
300
$
Г
Р
180
$
![Page 14: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/14.jpg)
Вставка элемента в префиксное дерево (Trie)
14
Добавление элемента
(Тигр, 180)
Добавление элемента
(Тапир, 300)
Добавление элемента
(Барибал, 150)
Б Т
А
Р
И
Б
А
Л
150
$
А И
П
И
Р
300
$
Г
Р
180
$
![Page 15: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/15.jpg)
Вставка элемента в префиксное дерево (Trie)
15
Б Т
А
Р
И
Б
А
Л
С
У
К
150
$15
$
А И
П
И
Р
300
$
Г
Р
180
$
Добавление элемента
(Тигр, 180)
Добавление элемента
(Тапир, 300)
Добавление элемента
(Барибал, 150)
Добавление элемента
(Барсук, 15)
![Page 16: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/16.jpg)
Вставка элемента в префиксное дерево (Trie)
16
Б Т
А
Р
И
Б
А
Л
С
У
К
150
$15
$
А И
П
И
Р
300
$
Г
Р
180
$
Добавление элемента
(Тигр, 180)
Добавление элемента
(Тапир, 300)
Добавление элемента
(Барибал, 150)
Добавление элемента
(Барсук, 15)
Добавление элемента
(Барс, 55)
$
55
![Page 17: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/17.jpg)
Вставка элемента в префиксное дерево (Trie)
17
function TrieInsert(root, key, value)
node = root
for i = 1 to Length(key) do
child = GetChild(node, key[i])
if child = NULL then
child = TrieCreateNode()
SetChild(node, key[i], child)
end if
node = child
end for
node.value = value
end function
GetChild(node, c) – возвращает указатель на дочерний узел, соответствующий символу c
SetChild(node, c, child) – устанавливает указатель, соответствующий символу c, в значение child
![Page 18: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/18.jpg)
Вставка элемента в префиксное дерево (Trie)
18
function TrieInsert(root, key, value)
node = root
for i = 1 to Length(key) do
child = GetChild(node, key[i])
if child = NULL then
child = TrieCreateNode()
SetChild(node, key[i], child)
end if
node = child
end for
node.value = value
end function
GetChild(node, c) – возвращает указатель на дочерний узел, соответствующий символу c
SetChild(node, c, child) – устанавливает указатель, соответствующий символу c, в значение child
TInsert = O(m(TGetChild + TSetChild))
![Page 19: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/19.jpg)
Поиск элемента в префиксном дереве (Trie)
19
function TrieLookup(root, key)node = rootfor i = 1 to Length(key) do
child = GetChild(node, key[i]) if child = NULL then
return NULL end if node = child
end for
// Ключ присутствует в дереве (не префикс другого)?if node.value = NULL then
return NULLreturn node
end function
GetChild(node, c) – возвращает указатель на дочерний узел, соответствующий символу c
SetChild(node, c, child) – устанавливает указатель, соответствующий символу c, в значение child
![Page 20: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/20.jpg)
20
function TrieLookup(root, key)node = rootfor i = 1 to Length(key) do
child = GetChild(node, key[i]) if child = NULL then
return NULL end if node = child
end for
// Ключ присутствует в дереве (не префикс другого)?if node.value = NULL then
return NULLreturn node
end function
GetChild(node, c) – возвращает указатель на дочерний узел, соответствующий символу c
SetChild(node, c, child) – устанавливает указатель, соответствующий символу c, в значение child
TLookup = O(mTGetChild)
Поиск элемента в префиксном дереве (Trie)
![Page 21: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/21.jpg)
Удаление элемента из префиксного дерева
1. Отыскиваем лист, содержащий искомый ключ key
2. Если текущий узел не имеет дочерних узлов, удаляем его из памяти (в противном случае заканчиваем подъем по дереву)
3. Делаем текущим родительский узел и переходим к пункту 2
Т
А И
П
И
Р
300
$
Г
Р
180
$
Удаление ключа ТИГР
![Page 22: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/22.jpg)
Узел префиксного дерева (Trie)
22
Массив указателей (индекс – номер символа)
Сложность GetChild/SetChild O(1)
Связный список указателей на дочерние узлы
Сложность GetChild/SetChild O(d)
Value
c1 c2 … cd
Как хранить указатели c1, c2, …, cd на дочерние узлы?
struct trie *child[33];
node->child[char_to_index(‘Г’)]
struct trie *child;
linked_list_lookup(child, ‘Г’)
![Page 23: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/23.jpg)
Сбалансированное дерево поиска (Red-black/AVL tree)
Сложность GetChild/SetChild O(logd)
Узел префиксного дерева (Trie)
23
Как хранить указатели c1, c2, …, cd на дочерние узлы?
struct rbtree *child;
redblack_tree_lookup(child, ‘Г’)
Value
c1 c2 … cd
![Page 24: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/24.jpg)
Представление узла Trie
24
struct trie {
char *value;
char ch;
struct trie *sibling; /* Sibling node */
struct trie *child; /* First child node */
};
value
ch: К
value
ch: И
value
ch: О
value
ch: Т
value
ch: Т
value
ch: М
root
К
И
Т
О
Т М
Сложность GetChild/SetChild: O(d)
Неупорядоченное дерево поиска (Unordered search tree)
![Page 25: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/25.jpg)
Создание пустого узла Trie
25
struct trie *trie_create()
{
struct trie *node;
if ( (node = malloc(sizeof(*node))) == NULL)
return NULL;
node->ch = '\0';
node->value = NULL;
node->sibling = NULL;
node->child = NULL;
return node;
}TCreate = O(1)
![Page 26: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/26.jpg)
Поиск узла в Trie по ключу
char *trie_lookup(struct trie *root, char *key){
struct trie *node, *list;
for (list = root; *key != '\0'; key++) {for (node = list; node != NULL; node = node->sibling) {
if (node->ch == *key)break;
}if (node != NULL)
list = node->child;else
return NULL;}/* Check: Node must be a leaf node! */return node->value;
}
26
TLookup = O(md)
![Page 27: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/27.jpg)
Вставка узла в Trie
struct trie *trie_insert(struct trie *root,
char *key, char *value)
{
struct trie *node, *parent, *list;
parent = NULL;
list = root;
for (; *key != '\0'; key++) {
/* Lookup sibling node */
for (node = list; node != NULL;
node = node->sibling)
{
if (node->ch == *key)
break;
}
27
![Page 28: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/28.jpg)
Вставка узла в Trie
if (node == NULL) {/* Node not found. Add new node */node = trie_create();node->ch = *key;node->sibling = list;if (parent != NULL)
parent->child = node;else
root = node;list = NULL;
} else {/* Node found. Move to next level */list = node->child;
}parent = node;
}/* Update value in leaf */if (node->value != NULL)
free(node->value);node->value = strdup(value);return root;
} TInsert = O(md)
![Page 29: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/29.jpg)
Удаление узла из Trie
struct trie *trie_delete(struct trie *root, char *key){
int found;
return trie_delete_dfs(root, NULL, key, &found);}
29
![Page 30: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/30.jpg)
Удаление узла из Trie
struct trie *trie_delete_dfs(struct trie *root,struct trie *parent, char *key, int *found)
{struct trie *node, *prev = NULL;
*found = (*key == '\0' && root == NULL) ? 1 : 0;if (root == NULL || *key == '\0')
return root;
for (node = root; node != NULL; node = node->sibling)
{if (node->ch == *key)
break;prev = node;
}if (node == NULL)
return root;
![Page 31: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/31.jpg)
Удаление узла из Trie
trie_delete_dfs(node->child, node, key + 1, found);
if (*found > 0 && node->child == NULL) {/* Delete node */ if (prev != NULL)
prev->sibling = node->sibling;else {
if (parent != NULL)parent->child = node->sibling;
elseroot = node->sibling;
}free(node->value);free(node);
}return root;
}
31
TDelete = TLookup + O(m) = O(md + m) = O(md)
![Page 32: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/32.jpg)
Вывод на экран элементов Trie
void trie_print(struct trie *root, int level){
struct trie *node;int i;
for (node = root; node != NULL; node = node->sibling)
{for (i = 0; i < level; i++)
printf(" ");if (node->value != NULL)
printf("%c (%s)\n", node->ch, node->value);else
printf("%c \n", node->ch);
if (node->child != NULL)trie_print(node->child, level + 1);
}}
32
![Page 33: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/33.jpg)
Пример работы с Trie
int main(){
struct trie *root;
root = trie_insert(NULL, "bars", "60");root = trie_insert(root, "baribal", "100");root = trie_insert(root, "kit", "3000");root = trie_insert(root, "lev", "500");root = trie_insert(root, "bars", "70");trie_print(root, 0);
printf("Lookup 'bars': %s\n", trie_lookup(root, "bars"));
root = trie_delete(root, "bars");trie_print(root, 0);
return 0;}
33
![Page 34: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/34.jpg)
Вычислительная сложность операций Trie
34
Операция
Способ работы c указателями c1, c2, …, cd
Связный список
МассивSelf-balanced search tree
(Red-black/AVL tree)
Lookup O(md) O(m) O(mlogd)
Insert O(md) O(m) O(mlogd)
Delete O(md) O(m) O(mlogd)
Min O(hd) O(hd) O(hlogd)
Max O(hd) O(hd) O(hlogd)
h – высота дерева (количество символов в самом длинном ключе)
В случае упорядоченного префиксного дерева (список c1, c2, …, cd
упорядочен в лексикографическом порядке) операции min и maxреализуются за время O(h)
![Page 35: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/35.jpg)
Преимущества префиксных деревьев
35
Время поиска не зависит от количества n элементов в словаре (зависит от длины ключа, мощности алфавита)
Для хранения ключей на используется дополнительной памяти (ключи не хранятся в узлах)
В отличии от хеш-таблиц поддерживает обход в упорядоченной последовательности(от меньших ключей к большим и наоборот, реализует ordered map/set) – зависит от реализации SetChild/GetChild
В отличии от хеш-таблиц не возникает коллизий
![Page 36: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/36.jpg)
Производительность строковых словарей
36
ОперацияTrie
(linked list)Self-balanced search tree
(Red black/AVL tree)Hash table(Chaining)
Lookup O(md) O(mlogn) O(m + nm)
Insert O(md) O(mlogn) O(m + n)
Delete O(md) O(mlogn) O(m + nm)
Min O(hd) O(logn) O(H + nm)
Max O(hd) O(logn) O(H + nm)
m – длина ключа
d – количество символов в алфавите (константа)
n – количество элементов в словаре
H – размер хеш-таблицы
Худший случай (Worst case)
![Page 37: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/37.jpg)
Производительность строковых словарей
37
ОперацияTrie
(linked list)
Self-balanced search tree
(Red black/AVL tree)
Hash table(Chaining)
Lookup O(md*) O(mlogn) O(m + mn/h) = O(m)
Insert O(md*) O(mlogn) O(m + mn/h) = O(m)
Delete O(md*) O(mlogn) O(m + mn/h) = O(m)
Min O(hd*) O(logn) O(H + nm)
Max O(hd*) O(logn) O(H + nm)
m – длина ключа d – количество символов в алфавите (константа) n – количество элементов в словаре H – размер хеш-таблицы
Средний случай (Average case)
![Page 38: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/38.jpg)
Bitwise tree
38
Bitwise trie – префиксное дерево (trie), в котором ключи
рассматривается как последовательность битов
Bitwise trie позволяет хранить ключи произвольного типа
данных
Bitwise trie – это бинарное дерево; алфавит A = {0, 1}
![Page 39: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/39.jpg)
Radix tree (patricia trie)
Radix tree (radix trie, patricia trie, compact prefix tree) –префиксное дерево (trie), в котором узел содержащий один дочерний элемент объединяется с ним для экономии памяти
PATRICIA trie:
D. R. Morrison. PATRICIA – Practical Algorithm to Retrieve Information Coded in
Alphanumeric. Jrnl. of the ACM, 15(4). pp. 514-534, Oct 1968.
Gwehenberger G. Anwendung einer binären Verweiskettenmethode beim Aufbau
von Listen. Elektronische Rechenanlagen 10 (1968), pp. 223–226
![Page 40: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/40.jpg)
Radix tree (patricia trie)
40http://en.wikipedia.org/wiki/Radix_tree
![Page 41: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/41.jpg)
Suffix tree
Suffix tree (PAT tree, position tree) – префиксное дерево (trie), содержащее все суффиксы заданного текста (ключи) и их начальные позиции в тексте (values)
Суффиксное дерево для текста BANANA
Суффиксы: A$, NA$, ANA$, NANA$, ANANA$, BANANA$
Применение:
o Поиск подстроки в строке O(m)
o Поиск наибольшей повторяющейся подстроки
o Поиск наибольшей общей подстроки
o Поиск наибольшей подстроки-палиндрома
o Алгоритм LZW сжатия информации
Автор: Weiner P. Linear pattern matching algorithms // 14th Annual IEEE
Symposium on Switching and Automata Theory, 1973, pp. 1-11
![Page 42: Лекция 4. Префиксные деревья (Tries, prefix trees)](https://reader033.fdocuments.us/reader033/viewer/2022060119/558c96a3d8b42aeb248b46f6/html5/thumbnails/42.jpg)
Литература
42
Ахо А.В., Хопкрофт Д., Ульман Д.Д. Структуры данных
и алгоритмы. – М.: Вильямс, 2001. – 384 с.
Гасфилд Д. Строки, деревья и последовательности в
алгоритмах. Информатика и вычислительная биология. –
Санкт-Петербург: Невский Диалект, БХВ-Петербург, 2003. – 656 с.
Билл Смит. Методы и алгоритмы вычислений на строках.
Теоретические основы регулярных вычислений. – М.: Вильямс,
2006. – 496 с.