比较两个大型阵列的高效解决方案

时间:2013-04-23 21:01:17

标签: php arrays multidimensional-array simplexml

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

我将使用哪种最快最有效的解决方案?

First Array
从SQL Query

生成的多维数组
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] => ...
  )
)

3 个答案:

答案 0 :(得分:2)

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

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

P.S。 如果它已经排序(比如你发布的代码),那么你可以用O(N)用第二种方式做到这一点

答案 1 :(得分:1)

从算法的角度来看,最快的是按项目(mergesort like)比较和补充检测一次通过两个排序的数组...时间复杂度O(N logN)+ O(MlogM)+ O (M + N)〜 O(N log N)......

AVL Tree太过分了......

答案 2 :(得分:0)

使用'id'作为两个集合的数组键将使得基于PHP的算法更快,就像V-X所暗示的那样。

但是,最有效的解决方案是将您的引用集保留在数据库中并向其添加XML记录,检测插入时或后续SELECT连接上的冲突/非冲突,特别是如果参考集更大比对比组。

你没有说你打算用不匹配的数据做什么 - 这与方法有关。