再談type ahead 問題

2021-07-16 02:15:05 字數 1333 閱讀 8731

問題:給定乙個詞典,包括一些詞和其出現的頻率。實現type ahead功能,要求使用者每鍵入乙個字元,下拉框顯示以當前輸入為字首的前10個最熱門的詞

解法1:用不帶data的trie,(data僅僅是詞頻)實時查詢法,需要實時的去build hot list

框架就是triie的 startwithprefix 查詢,不同的是並不是返回遍歷得到的所有詞,而是像經典求top k那樣,用乙個大小為k的最小堆過濾。

struct trienode ;

trienode* put(trienode* x, string word, int i, int data)

x->next[word[i]] = put(x->next[word[i]], word, i + 1, data);

return x;

}trienode * buildtrie(map&dict)

return root;

}class typeahead

for (char c = 0; c < 256; ++c)

collect(x->next[c], prefix + c, pq);

}public:

typeahead(trienode* root)

vectortype(char c) );

return {};

} priority_queue, greater> pq;

collect(path.top(), prefix, pq);

vectordroplist;

for (; pq.size() > 0; pq.pop())

cache.push(droplist);

return droplist;

} vectorback() ;

path.pop();

prefix.pop_back();

cache.pop();

return cache.top();

}};

解法2: 用 帶data的 trie,data就是該字首下 最熱的十個詞,查詢時候直接返回hot list

build trie 有所不同,遍歷詞典,把每個詞所有字首對應的節點都link到該詞,每個節點的拉鍊就是乙個大小為k的最小堆,

解法3: 還是用帶data的 trie,詞典預先按詞頻降序排列,然後按順序插入trie,也是把詞加入到其每個字首節點的拉鍊,拉鍊大小超過10後就不插了,

第一種方法,build trie時候就是傳統的build trie, 查詢相對複雜

第二三種方法,是invert index,定位到key後,直接返回資料就行 (top 10 拉鍊)

Typeahead的使用總結

typeahead是bootstrap的自動補全js外掛程式。最近專案中用到,總結一下。與autocomplish類似,通過ajax實現,實現流程是前台輸入關鍵字,後台根據關鍵字查詢出資訊,構造json串並返回,前台接收顯示。例項一html input type text class form co...

再談加班問題

既然從事it這個行業,加班是乙個不可避免的事情。不知道為什麼,其實我對加班一直很牴觸。在我待過的一些公司,有些是有強制加班的文化,有些按照自己的工作自己調整,有些甚至不加班。對於我個人而言,我習慣於自我調整,在規定的時間內高質量完成我自己的任務,如果感覺時間不夠,加班來做完。但是大多數情況下,加不加...

再談「蟲子」的問題

很感謝 加大碼 同志在上篇隨筆的恢復,讓我想起了許多問題。常言道,千里之堤,毀於蟻穴,軟體同樣如此。雖然軟體中的 bug本身不會像蟻穴那樣慢慢變大,但對使用者而言,它引起的錯誤 異常等的次數卻會越積越多,最終我們會失去使用者,造成不可挽回的損失,因此,這些質量的問題,我們必須注意,並制定相應的措施 ...