Со словарем BFS является оптимальным, но требуемое время работы пропорционально его размеру (V + E). С n буквами словарь может иметь ~ a^n, где a - размер алфавита. Если словарь содержит все слова, но тот, который должен быть на конце цепи, тогда вы пройдете все возможные слова, но ничего не найдете. Это обход графика, но размер может быть экспоненциально большим.
Вы можете задаться вопросом, возможно ли это сделать быстрее - просматривать структуру «разумно» и выполнять ее в полиномиальное время. Ответ, я думаю, нет.
Проблема:
Вам дают быстрый (линейный) способ проверить, если слово в словаре, два слова U, V и должны проверить, есть ли последовательность и -> а -> а -> ... -> а п. -> v
является NP-трудной.
Доказательство: Возьмем некоторый экземпляр 3SAT, как
(р или д или нет г) и (р или не д или г)
Вы начнете с 0 000 00 и проверить, если можно перейти к 2 222 22.
Первый символ будет «мы закончили», три следующих бита будут управлять p, q, r и двумя последующими будут управлять предложениями.
Разрешенные слова:
- Все, что начинается с 0 и содержит только 0 и 1 в
- Все, что начинается с 2 и является законным. Это означает, что он состоит из 0 и 1 (за исключением того, что первый символ равен 2, все клаузные разряды по праву устанавливаются в соответствии с битами переменных, и они установлены в 1 (так что это показывает, что формула удовлетворительна).
- Все, что начинается с, по меньшей мере, двух 2-х, а затем, состоит из (регулярного выражения 0 и 1 в: 222 * (0 + 1) *, как 22221101, но не 2212001
Для получения 2 222 22 от 0 000 00, вы должны сделать это таким образом:..
(1) флип соответствующие биты - например, 0 100 111 в четыре этапа этого требуется найти решение 3SAT
(2) Измените первый бит на 2: 2 100 111. Здесь вы будете проверены, что это действительно решение 3SAT.
(3) Изменение 2 100 111 -> 2 200 111 -> 2 220 111 -> 2 222 111 -> 2 222 211 -> 2 222 221 -> 2 222 222.
Эти правила соблюдения, что вы не можете обмануть (проверьте). Переход к 2 222 22 возможен только в том случае, если формула удовлетворительна и проверка NP-жесткая. Я чувствую, что это может быть еще сложнее (возможно, #P или FNP), но для этой цели достаточно NP-твердости.
Редактировать: Вас может заинтересовать disjoint set data structure. Это займет ваш словарь и слова группы, которые могут быть достигнуты друг от друга. Вы также можете сохранить путь от каждой вершины к корневой или какой-либо другой вершине. Это даст вам путь, не обязательно самый короткий.
В вашем примере, почему ставка здесь? Вы изменили одну и ту же букву дважды подряд, ее следует читать: cat -> bat -> bot -> bog -> dog – CaffGeek
duplicate http://stackoverflow.com/questions/11811918/how-to-compute-shortest- расстояние между двумя словами/11813399 # 11813399 –
Dacman, не могли бы вы поделиться, насколько ваша производительность улучшилась с использованием эвристики против BFS? –