【问题标题】:Best Data structure to store and search phrases in C++在 C++ 中存储和搜索短语的最佳数据结构
【发布时间】:2015-08-20 04:20:36
【问题描述】:

我使用 Trys 数据结构来存储单词。现在,我有一个要求,如果在同一段落中存在某些短语,则需要查找给定段落。

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

【问题讨论】:

  • 哪些尝试您正在使用? trie 有多个子类型,每个子类型都有不同的理想用例。您需要更准确地描述您的尝试,以便我们确定您的尝试是否最适合您的目的。
  • 其实,废了……在现实世界中,“效率”并不是那么非黑即白。在您的计算机上最高效的可能不在我的计算机上。您最好不要过多考虑运行时效率,而是专注于生成可维护且不重复的代码。一旦你有东西在运行,决定它是否足够快...它是否最有效并不重要;如果它足够快,那么它足够快。如果它不够快,请使用您的分析器确定最重要的瓶颈是什么。
  • 我正在使用尝试的基本实现。参考:geeksforgeeks.org/trie-insert-and-search 问题是,这将投入生产。这件作品会被多次调用。因此,足够快对我的用例来说非常重要。我只是在寻找一个可以采用其中包含空格的字符串的实现。
  • 如果您对分析器有任何疑问,请随时提问...不过,这不仅看起来过于宽泛(因此原因很接近)但它似乎也不太可能在未来对其他人有所帮助(另一个可能的密切原因)。
  • 如果你的尝试的实现不够快(记住短语的数量不会超过 100,这是你的真正限制,与生产无关) ,您的分析器会突出显示这一点,如果您的代码可维护,您应该能够放入任何其他数据结构来替换它。

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


【解决方案1】:

如果我是你,我会先使用 boost::multi_index_container 把一些东西放在一起,因为如果你以后有更多的需求,进一步扩展它会很容易。如果稍后您测量并发现它表现不佳,那么您可以将其替换为优化的数据结构。

【讨论】:

  • 我应该在我自己的答案中表达这一点(而不是这个问题的 cmets)!好答案,我 +1 :)
【解决方案2】:

指定的 trie 在许多方面都不是最优的。

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

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

【讨论】:

  • 我也给你+1,你显然对trie结构有相当深入的了解
  • 有趣的实现。这个实现字符是不可知的吗?即它可以处理需要转义序列、空格和换行符等的字符。我知道我将运行哪个系统,所以,EBCIDIC 不是问题。我唯一担心的是,当我将字母大小从 26 增加到 100 以支持其他字符时,内存可能会成为问题。
  • @UmashankarDas 您的字母大小的增加与计算机字母大小的增加不对应;计算机总是以二进制方式运行......记住这一点。每个节点只需要两条边。
  • 你显然更像是一个学者,而不是一个生产系统的人。有时,更多地用实际的术语来谈论而不是宣扬最佳实践会有所帮助。感谢您的宝贵时间。
  • @UmashankarDas 您是否注意到我最受欢迎的答案之一与特里树相关?所以我对尝试了解很多......这是否意味着我的编程不实用?这就是你做出这个判断的全部依据吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 2015-11-16
相关资源
最近更新 更多