簡體   English   中英

兩個Trie節點之間的最短路徑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM