Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中存储和搜索短语的最佳数据结构+;_C++_C_Performance_Data Structures_Phrases - Fatal编程技术网

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

C++ 在C+中存储和搜索短语的最佳数据结构+;,c++,c,performance,data-structures,phrases,C++,C,Performance,Data Structures,Phrases,我使用数据结构来存储单词。现在,我有一个要求,需要找到,给定一个段落,在同一段落中是否存在某些短语 做这件事最有效的方法是什么?短语总数不会超过100个。指定的trie在许多方面都不理想 首先,它为每个插入的项目构造多个节点。正如作者所写,“输入键的每个字符都作为一个单独的trie节点插入。”这是一个可怕的、不必要的惩罚!使用大于2的字母表在这里会增加侮辱和伤害;一个50字节的短语不仅需要50个节点,而且每个节点的大小可能超过100字节。。。使用该代码,50字节长的每个项目或“短语”可能需要高

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


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

指定的trie在许多方面都不理想

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

我已经编写了一个PATRICIA trie实现,每个项目只使用一个节点,字母表大小为两个(它使用每个字符的位,而不是每个字符),并允许您使用您希望的任何分配。。。唉,我还没有花太多精力重构它的接口,但它应该相当接近最优。您可以找到该实现。您可以在testcase文件中看到插入(使用
patricia\u add
)、检索(使用
patricia\u get
)和删除(使用
patricia\u remove
)的示例。

如果我是您,我会首先使用boost::multi\u index\u容器将一些内容组合起来,因为如果你以后得到更多的需求,那么进一步扩展就很容易了。如果以后您进行测量,发现它的性能不够好,那么您可以用优化的数据结构替换它。

您正在使用哪种方法?trie有多个子类型,每个子类型都有不同的理想用例。您需要更准确地描述您的尝试,以便我们确定您的尝试是否最适合您的目的。事实上,放弃这一点。。。在现实世界中,“效率”并不是那么黑白分明。在你的电脑上效率最高的可能不在我的电脑上。您最好在不考虑运行时效率的情况下解决这个问题,并专注于生成可维护且不重复的代码。一旦你有东西在跑,决定它是否足够快。。。不管它是否是最有效的;如果它足够快,那么它就足够快了。如果速度不够快,请使用您的探查器确定最重要的瓶颈是什么。我使用的是基本的尝试实现。问题是,这将投入生产。这首曲子将被多次命名。所以,足够快对于我的用例来说非常重要。我只是在寻找一个实现,它可以采取一个字符串,其中有空格。如果你有一个关于分析器的问题,那么请随时问。。。然而,事实上,这不仅显得过于宽泛(因此是接近的原因),而且似乎也不太可能对未来的任何人有帮助(另一个可能的接近的原因)。如果你的尝试实施速度不够快(请记住短语的数量不会超过100,这是您的实际限制,与生产无关),您的分析器将突出显示这一点,如果您的代码是可维护的,您应该能够删除任何其他数据结构来替换它。我应该在自己的回答中表达这一点(而不是这个问题的评论)!回答得好,+1来自我:)我还告诉你+1,你显然对trie结构的测试实现有相当深入的了解。这个实现字符不可知吗?也就是说,它能处理需要转义序列、空格和换行符等的字符。我知道我将运行哪个系统,所以,EBCIDIC不是一个问题。我唯一关心的是,当我将字母表大小从26减小到100以支持其他字符,那么内存可能会成为一个问题。@umashankard因为字母表大小的增加与计算机字母表大小的增加不一致;计算机总是以二进制方式运行……记住这一点。每个节点只需要两条边。显然,您更像一个acad主位的,不太像生产系统的人。有时多说些实际的话而不是说些最佳实践会有帮助。谢谢你的时间。@UmashankarDas你注意到我最流行的答案之一是trie相关的吗?所以我知道很多关于尝试的事……这是否意味着我对编程不实际?这就是你的全部依据吗从何处判断?