[英]Shortest Path between two Trie Nodes
這是一個雙重性的問題,因為我對如何最有效地實現這一點沒有想法。
我有一個150,000個單詞的字典,存儲在Trie實現中,這是我的特定實現的樣子:
給用戶提供兩個單詞。 目的是找到其他英語單詞(從一個單詞到最后一個單詞)的最短路徑(每個單詞一個字符更改)。
例如:
開始於:狗
結束:貓
路徑:狗,圓點,嬰兒床,貓
路徑:狗,齒輪,原木,沼澤,機器人,嬰兒床,貓
路徑:狗,母鹿,喬,喬伊,喬特,嬰兒床,貓
我當前的實現經歷了幾次迭代,但是我可以為其提供最簡單的偽代碼(因為實際代碼是幾個文件):
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 ..
}
已知:
我的問題是,我沒有一種有效的方法來確定可能要嘗試的單詞,而不會強行使用字母並對照字典檢查每個新單詞。 我知道有一種使用前綴的更有效方法的可能性,但是我無法弄清楚適當的實現,或者不能僅僅將處理量加倍。
其次,如果我使用其他搜索算法,我將A *和“最佳優先搜索”視為可能,但這些都需要權重,而我沒有。
有什么想法嗎?
正如評論中所要求的那樣,說明了我的意思是將鏈接的單詞編碼為整數位。
在C ++中,它可能看起來像...
// populate a list of known words (or read from file etc)...
std::vector<std::string> words = {
"dog", "dot", "cot", "cat", "log", "bog"
};
// create sets of one-letter-apart words...
std::unordered_map<std::string, int32_t> links;
for (auto& word : words)
for (int i = 0; i < word.size(); ++i)
{
char save = word[i];
word[i] = '_';
links[word] |= 1 << (save - 'a');
word[i] = save;
}
上面的代碼運行之后, links[x]
-其中x
是一個單詞,其中一個字母替換為下划線la d_g
檢索一個整數,該整數指示可以替換下划線以形成已知單詞的字母。 如果最低有效位打開,則“ dag”是已知單詞,如果最低有效位的下一個打開,則“ dbg”是已知單詞,等等。
直觀上,我希望使用整數來減少用於鏈接數據的整體內存,但是如果大多數單詞每個單詞只有幾個鏈接的單詞,那么存儲指向這些單詞的索引或指針實際上可能會使用更少的內存-如果您這樣做,會更容易不使用按位操作,即:
std::unordered_map<std::string, std::vector<const char*>> links;
for (auto& word : words)
for (int i = 0; i < word.size(); ++i)
{
char save = word[i];
word[i] = '_';
links[word].push_back(word.c_str());
word[i] = save;
}
無論哪種方式,您都可以得到一個圖形,將每個單詞與可以通過單字符更改轉換成的單詞鏈接起來。 然后,您可以應用Dijkstra算法的邏輯來查找任意兩個單詞之間的最短路徑。
只是為了為引起這一問題的人員提供更新,我為該特定數據結構的Javascript添加了一個Github存儲庫。
https://github.com/acupajoe/Lexibit.js
謝謝大家的幫助和想法!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.