【问题标题】:How to search for values of giant array inside string very quickly?如何快速搜索字符串中巨型数组的值?
【发布时间】:2013-06-05 01:39:25
【问题描述】:

我有一个 "words" 文件,大小约为 5.8 MB,其中包含 560,000 个单词。我正在使用它从连接在一起的字符串中获取真实的单词。

例如greenbananatruck 可以是这样的字符串。

我写这个函数是为了快速使用。但我无法让它比 0.5 秒 更快。我正在使用具有 8 核处理器、8GB RAM 的服务器。实际上cpu不是问题,问题是RAM。我需要能够在多个实例中快速有效地完成此过程。

public function wordSplitReal( $str ){

  $words = array_filter( $this->dict, function($word) use(&$str) {
      $pos = strpos( $str, $word );
      if ( $pos !== false ){
          $str = substr_replace($str, "", $pos, strlen($word));
          return true;
      }
      return false;
  } );

  return $words;

}

这很简单,我实际上在做的是 "filtering" 数组 "dict" 仅包含给定字符串中的单词。 (我对多个单词不感兴趣。) Dict 是从最长到最短的单词进行预排序的。全部只有小写字母。 这个函数是使用单例的更大类的一部分。

任何帮助将不胜感激。

【问题讨论】:

  • 数据库不是更适合这个吗?
  • 不,我用资源测试了同样的东西,花了大约 3 倍的时间。

标签: php arrays performance load strpos


【解决方案1】:

数组对于这项工作来说是一个错误的工具,因为它们以线性时间访问(正如您所发现的,这对于字典来说太慢了)。您可能想要尝试一下;如果您搜索它们,有几个 PHP 实现。 (我没有任何 PHP trie 库的经验,所以我不能向你推荐。)

算法的大纲可能是:

While string is non-empty
  For all prefixes of str in decreasing order:
    If it is in trie:
      Drop the prefix
      Add it to the result array
      Next iteration of outer loop
  Return failure
Return result array

(算法不是很复杂,因为它没有实现回溯;留给读者练习:p)

【讨论】:

    猜你喜欢
    • 2013-01-20
    • 2013-01-06
    • 2018-01-02
    • 2014-11-24
    • 2011-03-01
    • 1970-01-01
    • 2010-09-17
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多