【问题标题】:Looping through a large array循环遍历一个大数组
【发布时间】:2013-11-06 13:52:06
【问题描述】:

我正在创建将创建一个非常大的数组并搜索它们的应用程序。 我只想知道是否有一个好的 PHP 数组搜索算法来完成这项任务?

示例:我有一个包含超过 2M 键和值的数组,最好的搜索方式是什么?

编辑 我已经创建了一个基于数组的平面文件 dbms,所以我想找到最好的方法来搜索它

【问题讨论】:

  • 你的数组排序了吗?如果不是,我认为您别无选择,只能遍历您的数组。但无论如何,200 万个密钥对于一台计算机来说并不算多。
  • 为什么不使用数据库?我们可以看到您的键和值的示例吗?正如@kren470 暗示的那样,如果您按键搜索,那么对它们进行排序可能会有所帮助。另外,您是否尝试过普通的蛮力搜索?它可能很快你不需要优化它。
  • SPLHeap 等替代数据结构可能比数组更合适,具体取决于您的数据
  • 我编辑了问题..

标签: php arrays loops search


【解决方案1】:

最好的方法是使用array_search()。 PHP 已经对其in C written 函数进行了大量优化。

如果这仍然太慢,您应该切换到另一种“编程”语言(PHP 的速度并不受欢迎)。

有算法available 使用您的显卡并行搜索特定值。

【讨论】:

  • 我找到了一种更快的方法:使用array_flip(),然后使用isset() 进行检查。当然,当有重复值(翻转时成为键)时,它并不“安全”
  • @HamZa: array_flipO(n) + isset 是更接近 O( 1) 操作。将两者结合起来,您的方法的最坏情况是 O(2n) 操作,但实际上,它会更接近 O(n+1)跨度>
  • @EliasVanOotegem 我曾经测试过它的投影机问题,相信我,它更快
  • @HamZa Big O 表示法只是一种工具,用于绘制坐标系中曲线(计算时间与数据大小)的样子(线性、二次、对数等)。在实践中,+1 通常被省略,因为它对曲线的形状没有影响
【解决方案2】:

有几点:

  1. 尝试一下,对几种方法进行基准测试,看看哪一种更快
  2. 考虑使用对象
  3. 至少考虑一下 DB...它可能是 NoSQL 键->值存储,例如 Redis.io(非常快)
  4. 搜索算法,确定there are plenty of them around

但是在内存中存储一​​个由 2M 键组成的 assoc 数组将意味着您将有大量的哈希冲突,这无论如何都会减慢您的速度。对数组进行排序、分块,然后应用一个体面的搜索算法,您可能会使其工作得相当快,但老实说,我会说你将做出一个错误的决定。

还要考虑这一点:PHP 在设计上是无状态的,每次您的脚本运行时,数据都必须再次加载到内存中(如果它是您正在编写的 Web 应用程序,则对于每个请求)。 不太可能成为比 HashTable 上的蛮力搜索更大的瓶颈。
找出这一点的最快方法是运行测试,关闭 APC(或替代方案)一次,然后再运行一次,但先缓存要搜索的数组。测量两者之间的差异,您将了解阵列的实际构造花费了多少

【讨论】:

    猜你喜欢
    • 2019-07-10
    • 2021-11-25
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2014-06-04
    相关资源
    最近更新 更多