對於字典,BFS是最優的,但所需的運行時間與其大小(V + E)成正比。用n個字母,字典可能有〜個字母,其中a是字母大小。如果字典中包含的所有單詞都應該放在鏈的末尾,那麼您將遍歷所有可能的單詞,但不會找到任何內容。這是圖遍歷,但大小可能是指數級大。
您可能想知道是否有可能更快地做到 - 以「智能」的方式瀏覽結構並在多項式時間內完成。答案是,我認爲,不。
問題:
你給出一個快速的(線性)的方式,來檢查單詞在字典兩個字U,V,並檢查是否有一個序列u - >一個 - > a - > ... - > a n - > v。
是NP-hard。
證明:花一些3SAT例如,像
(P或Q或者不r)和(p或非q或r)
您將與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
從0 000 00產生2 222 22你必須這樣做,以這樣的方式。
(1)翻轉相應的位 - 例如,在四個步驟0 100 111這需要找到一個解決方案3SAT
(2)將第一位更改爲2:2 100 111.在這裏您將驗證這確實是3SAT解決方案。
(3)改變2 100 111 - > 200 2 111 - > 220 2 111 - > 222 2 111 - > 222 2 211 - > 222 2 221 - > 222 2 222
這些規則強制執行你不能作弊(檢查)。只有當公式是可以滿足的,並且檢查是NP-hard時,纔可能去2 222 22。我覺得它可能更難(可能是#P或FNP),但我認爲NP硬度就足夠了。您可能有興趣disjoint set data structure。這將會把你的字典和分組單詞彼此聯繫起來。您還可以存儲從每個頂點到根或其他某個頂點的路徑。這會給你一條道路,而不是最短的道路。
在你的例子中,爲什麼在那裏下注?你連續兩次更改了同一封信,它應該是: cat - > bat - > bot - > bog - > – CaffGeek 2009-10-07 15:01:51
duplicate http://stackoverflow.com/questions/11811918/how-to-compute-shortest-距離之間的雙字/ 11813399#11813399 – 2012-08-24 04:47:01
達克曼,你介意分享多少你的表現改善使用啓發式與BFS? – 2014-09-15 00:38:46