Это двоякий вопрос, потому что у меня нет идей о том, как реализовать это наиболее эффективно.Самый короткий путь между двумя узлами Trie
У меня есть словарь 150000 слов, которые хранятся в реализации Trie, вот что выглядит моя конкретная реализация, как:
Пользователь дается с двумя словами. С целью найти кратчайший путь других английских слов (измененных одним символом за штуку) от стартового слова до конечного слова.
Например:
Старт: Собака
Конец: Cat
Путь: Собака, Dot, раскладушка, Cat
Путь: Собака, зубчатая, лаг, Болото, Bot, Cot, Cat
Путь: Собака, Doe, Joe, Joy, Jot, Cot, Cat
Моя текущая реализация прошла несколько итераций, но самый простой, я могу предоставить псевдокод для (как фактический код несколько файлов):
var start = "dog";
var end = "cat";
var alphabet = [a, b, c, d, e .... y, z];
var possible_words = [];
for (var letter_of_word = 0; letter_of_word < start.length; letter_of_word++) {
for (var letter_of_alphabet = 0; letter_of_alphabet < alphabet.length; letter_of_alphabet++) {
var new_word = start;
new_word.characterAt(letter_of_word) = alphabet[letter_of_alphabet];
if (in_dictionary(new_word)) {
add_to.possible_words;
}
}
}
function bfs() {
var q = [];
... usual bfs implementation here ..
}
Knowns:
- Начальное слово и слово завершения
- слова одинакового размера
- Слова английские слова
- Вполне возможно, там не может быть путь
Вопрос:
Мой вопрос я не эффективный способ определения того, потенциальное слово, чтобы попытаться без грубого форсирования алфавита и проверки каждого нового слова против словаря. Я знаю, что есть возможность более эффективного использования префиксов, но я не могу понять правильную реализацию или не просто удвоить обработку.
Во-вторых, следует ли использовать другой алгоритм поиска, я рассматривал A * и Best First Search как возможности, но для них требуются веса, которых у меня нет.
Мысли?
Просто мысль: если ваши слова были сохранены на графике, где каждый узел соединяется со словами, отличающимися на одну букву (при всех затратах на края/весах 1) вы можете использовать [algortihm] Дейкстры (https: // en. wikipedia.org/wiki/Dijkstra%27s_algorithm), чтобы найти кратчайший путь между любыми двумя словами. –
@TonyD Цените это! Я не возражаю против этого, но если я правильно понимаю эту реализацию, вместо того, чтобы иметь 150 000 записей, я бы возвестил об этом, потому что каждое слово имело бы «(длина слова« 26 * * »),« возможные литы правильные? – acupajoe
Каждое слово должно быть в узле с контейнером каких-либо ссылок на другие узлы. Ссылки могут быть, например, индексы в массиве, где хранятся все слова/узлы, или «указатели» на языке, который поддерживает это. Также было бы возможно сохранить 32-битовое целое для каждой буквы в слове, причем каждый из первых 26 бит указывал, есть ли слово только с той буквой, измененной на «A» + бит-положение (например, «собака» «Первое 32-битное значение будет иметь биты в позициях« B »-« A »= 1,« C'-A »= 2,« F »-« A »= 5 и т. д. –