Троичные деревья поиска VS Бинарные деревья поиска

Троичные деревья поиска очень распространены в области редактирования текста. Их можно использовать для реализации функции "Автозаполнение", проверки орфографии, поиска совпадений по частям, поиска по соседству и многих других опций.

Причиной их известности является их космическая эффективность по сравнению с попытками (хотя попытки выполняются быстрее) и их гибкость (по сравнению с Hashtables).

Тернарные деревья поиска имеют три указателя в узле данных: lokid левый ребенок, hikid правильный ребенок и midkid средний ребенок.

Я скучаю по тому, зачем нам средний ребенок? В чем особенность этого указателя? В каких вещах было бы лучше иметь этот указатель, чем вообще не иметь его?

Я рисовал несколько деревьев, и я думаю, что мы можем реализовать то же самое, используя только 2 указателя (двоичное дерево поиска) со вставками, идущими к левому ребенку, если текущий символ в строке для вставки равен или меньше символа на текущем узле и вставки, идущие вправо, наоборот.

На следующем рисунке показано двоичное дерево, сгенерированное из вставленных слов: KARIM, KARAS, SARAS.

Двоичное дерево поиска для строк

Алгоритм вставки приведенного выше дерева может быть похож на следующий псевдокод:

insert(root, word){

    if(!root) {
        root = new node()
        root->char = *(word++)
    }

    if(*word > root->char)
        insert(root->right, word)

    else {
        if(*word == root->char) 
            insert(root->left, word++)
        else
            insert(root->left, word)    

    }
}

Что может быть не так с вышеуказанной концепцией? Я что-то упускаю из троичных деревьев, что делает их превосходящими двоичные деревья?

0 ответов

Другие вопросы по тегам