繁体   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