用C ++存储和搜索短语的最佳数据结构

时间:2015-08-20 04:20:37

标签: c++ c performance data-structures phrases

我使用尝试数据结构来存储单词。现在,我有一个要求,如果某段短语出现在同一段落中,则需要找到一个段落。

这样做最有效的方法是什么?短语总数不会超过100个。

2 个答案:

答案 0 :(得分:2)

如果我是你,我会首先使用boost :: multi_index_container将一些东西放在一起,因为如果你以后得到更多的要求,那么进一步扩展它将非常容易。如果稍后您测量并发现它没有充分执行,那么您可以用优化的数据结构替换它。

答案 1 :(得分:1)

指定的特里在许多方面都不是最理想的。

  • 首先,它为每个插入的项目构造多个节点。正如作者所写,"输入键的每个字符都作为单独的节点插入。"这是一个可怕的,不必要的惩罚!使用大于2的ALPHABET_SIZE会增加侮辱伤害;不仅50个字节的短语需要50个节点,而且每个节点的大小可能超过100个字节......每个项目或"短语"使用该代码,长度为50个字节可能需要高达约5KB的存储空间!这甚至不是最糟糕的。
  • 提供的算法在内部嵌入malloc,使得优化非常困难。每个节点都有自己的分配,使insert非常malloc - 很重。分配细节应与数据结构处理分开,如果不是为了优化的目的,那么为了简化使用。大量使用此代码的程序可能会遇到与内存碎片和/或缓存未命中相关的性能问题,除了用trie代替其他东西外,没有任何简单或重要的优化。
  • 这不是唯一的错误......这段代码也不是便携式!如果你最终在旧的(不是那个旧;它们仍然存在!)大型机上运行它,它使用EBCDIC而不是ASCII,这个代码将产生缓冲区溢出,程序员(你)将是打电话来解决它。 <sarcasm>这是最优的,对吗?</sarcasm>

我编写了一个PATRICIA trie实现,每个项目只使用一个节点,字母大小为2(它使用每个字符的位,而不是每个字符),并允许您使用您希望的任何分配。唉,我还没有花很多精力去重构它的界面,但它应该非常接近最优。您可以找到该实现here。您可以在patricia_test.c测试用例文件中查看插入(使用patricia_add),检索(使用patricia_get)和删除(使用patricia_remove)的示例。