【问题标题】:Php prefix tree implementation versus assoc array [closed]PHP前缀树实现与关联数组[关闭]
【发布时间】:2016-04-29 12:42:25
【问题描述】:

UPD:我将原始问题移至https://codereview.stackexchange.com/questions/127055/building-tree-graph-from-dictionary-performance-issues

这是一个简短的版本,没有代码。

我正在尝试从字典构建前缀树。因此,使用以下字典 'and','anna','ape','apple',图形应如下所示: 我尝试了两种方法:使用关联数组和使用自写的树/节点类。

注意:原始字典大约 8 MB,包含 >600000 个单词。

问题:有什么好的(快速/高效)方法吗?

到目前为止我已经尝试过:

  • php 关联数组(它们对于以后使用此图的工作不是很灵活)。

  • 自写的树/节点类(性能问题 - 执行时间最多增加 7 倍,内存使用量增加 2 倍,即使除了 inserting 函数之外没有实现任何东西)。

codereview 上提供了示例代码(有问题的第一个链接)

【问题讨论】:

  • 它们都具有相同的代码/执行复杂性,不同的内存占用和执行速度。根据您在类下运行的 PHP 版本,也会使用或多或少的内存。如果您正在寻找更好的性能而不仅仅是学习东西,我建议您研究嵌套集。您也可以使用 PHP 实现:stackoverflow.com/questions/272010/…
  • 这个问题更适合code review
  • @Sergiu Paraschiv - 我会调查一下
  • @nickb 我实际上并没有要求审查我的代码,我基本上是在问“为什么类上的树实现比数组上的实现慢得多?”。给出代码来说明问题。我实际上期待着接近 2 倍的速度下降。 8x+ 让我震惊。
  • 确定是 - 绩效评估仍然是评估。请参阅tour of code review - “询问...关于以下方面的工作代码的质量:性能”。

标签: php arrays class graph trie


【解决方案1】:

只要我已经切换到 C++ 并且在 codereview 上得到了很好的回答,我就在这里回答我自己的问题。

还有另一种方法可以通过增加内存使用来提高时间效率(与“array of arrays of arrays...”方法相比,这并不是很大的增加)。该方法称为“双数组特里”,您可以阅读有关此主题的信息here 并阅读上述关于 codereview 的答案以查看实现示例。

它更省时,但它为将来的 trie 使用提供了较少的灵活性/方便性(与 OOP 方法相比)。

所以对我来说,这个问题的最终答案是:“php 不是处理真正大尝试的最佳工具”。

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 2010-11-01
    • 1970-01-01
    • 2021-05-10
    • 2014-08-09
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多