【问题标题】:Efficient solution to compare two large arrays比较两个大型阵列的有效解决方案
【发布时间】:2013-04-23 21:01:16
【问题描述】:

我喜欢在不使用in_array 的情况下比较两个数组,因为这两个数组都非常大(超过 50,000 个)。我喜欢为第一个数组中缺少的所有数组生成一个新数组。

我将使用的最快最有效的解决方案是什么?

第一个数组
SQL查询生成的多维数组

Array (
  [0] => Array (
    [id] => 17228219
    [name] => ...
  )
  [1] => Array (
    [id] => 17228220
    [name] => ...
  )
  [2] => Array (
    [id] => 17228221
    [name] => ...
  )
  [3] => Array (
    [id] => 17228222
    [name] => ...
  )
  [4] => Array (
    [id] => 17228223
    [name] => ...
  )
  [5] => Array (
    [id] => 17228224
    [name] => ...
  )
)

第二个数组
从简单 XML 生成

Array (
  [0] => SimpleXMLElement Object (
    [0] => 17228219
  )
  [1] => SimpleXMLElement Object (
    [0] => 17228221
  )
  [2] => SimpleXMLElement Object (
    [0] => 17228222
  )
  [3] => SimpleXMLElement Object (
    [0] => 17228224
  )
)

新数组
创建一个缺少 ID 的数组

Array (
  [0] => Array (
    [id] => 17228220
    [name] => ...
  )
  [1] => Array (
    [id] => 17228223
    [name] => ...
  )
)

【问题讨论】:

  • 你试过array_diff吗?
  • 第一个来自数据库,使用查询与第二个进行比较,而不是将其全部读入内存
  • 假设这些 id 字段在每个数组中都是唯一的,我建议构建一个以id => name 为键的新数组。然后一个简单的 array_diff 将完成所有繁重的工作。
  • 我确实尝试了 array_diff - 需要很长时间。是的,它有效,希望在没有那么多服务器负载的情况下提供更快的解决方案。

标签: php arrays multidimensional-array simplexml


【解决方案1】:

例如,您可以通过实现 AVL 树来加快速度,然后它会在 O(N*Log(N)),可以找到many implementations of trees in php

这会比双 'for' (N^2) 快一点, 此外,您可以对数组进行排序并将每次迭代在两个数组上移动一步,这样您就可以找到差异,但这也是 O(N*Log(N)),很难相信它会比这更快。

附言 如果它已经排序(就像你发布的代码一样),那么你可以用第二种方式在 O(N) 中完成它

【讨论】:

  • 现在正在阅读这个,是的,这就是结构。谢谢
【解决方案2】:

从算法的角度来看,最快的将是逐项(类似合并排序)比较和补码检测,通过一次通过两个排序数组...具有时间复杂度 O(N logN) + O(MlogM) + O (M + N) ~ O(N log N)...

AVL 树是一个矫枉过正...

【讨论】:

  • avl 树与排序几乎相同......但正如我所说,如果它已经排序,那么它可以在线性时间内完成
  • 我不确定是否有一些对 AVL 树的支持,但排序是肯定的。
【解决方案3】:

使用 'id' 作为两个集合的数组键将使 V-X 建议的基于 PHP 的算法更快。

然而,最有效的解决方案是将您的参考集留在数据库中并向其中添加 XML 记录,在插入时或在随后的带有连接的 SELECT 中检测冲突/非冲突,特别是在参考集较大的情况下比比较集。

你没有说你打算用不匹配的数据做什么 - 这对方法有一些影响。

【讨论】:

  • 我必须删除数据库记录以及服务器本身的文件。
猜你喜欢
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多