問題:給定乙個詞典,包括一些詞和其出現的頻率。實現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本身不會像蟻穴那樣慢慢變大,但對使用者而言,它引起的錯誤 異常等的次數卻會越積越多,最終我們會失去使用者,造成不可挽回的損失,因此,這些質量的問題,我們必須注意,並制定相應的措施 ...