簡體   English   中英

最佳數據結構,用於在C ++中存儲和搜索短語

[英]Best Data structure to store and search phrases in C++

我使用trys數據結構存儲單詞。 現在,我有一個要求,即在給定的段落中查找同一段落中是否存在某些短語。

這樣做最有效的方法是什么? 短語總數不超過100。

如果我是你,我會先使用boost :: multi_index_container來組合一些東西,因為那樣的話,如果以后獲得更多需求,將很容易進行進一步擴展。 如果以后您測量並發現它的性能不足,則可以用優化的數據結構替換它。

指定的特里在許多方面都不理想。

  • 首先,它為每個插入的項目構造多個節點。 正如作者所寫,“輸入鍵的每個字符都作為一個單獨的Trie節點插入”。 那是可怕的,不必要的懲罰! 如果使用大於2的ALPHABET_SIZE ,則會ALPHABET_SIZE侮辱性傷害; 一個五十字節的短語不僅需要五十個節點,而且每個節點的大小可能超過一百個字節……使用該代碼,長度為五十個字節的每個項目或“短語”可能最多需要約5KB的存儲空間! 這還不是最壞的情況。
  • 該算法在內部提供了嵌入malloc ,因此很難進行優化。 每個節點都是其自己的分配,這使得insert非常malloc -heavy。 分配細節應與數據結構處理分開,如果不是出於優化目的,則是為了簡化使用。 大量使用此代碼的程序很可能會遇到與內存碎片和/或高速緩存未命中有關的性能問題,除了用trie代替其他東西外,看不到任何簡單或重大的優化。
  • 這不是這里唯一的錯誤...該代碼也不太可移植 如果你最終在一個古老的運行這個(不 ;!它們仍然存在),它使用EBCDIC而不是ASCII主機,該代碼會產生緩沖區溢出,而程序員(你)會被稱為解決它。 <sarcasm>吧? </sarcasm>

我已經編寫了PATRICIA trie實現,該實現每個項目僅使用一個節點,字母大小為2(它使用每個字符的位,而不是每個字符),並允許您使用任何希望的分配... a,我在重構接口方面還沒有付出很大的努力,但是它應該非常接近最優。 您可以在此處找到該實現。 您可以在patricia_test.c測試用例文件中看到插入(使用patricia_add ),檢索(使用patricia_get )和刪除(使用patricia_remove )的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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