1

我喜欢在不使用的情况下比较两个数组,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] => ...
  )
)
4

3 回答 3

2

例如,您可以通过实现 AVL 树来使其更快一点,然后它将在 O(N*Log(N)) 中完成,您可以在 php 中找到许多树的实现

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

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

于 2013-04-23T21:11:21.797 回答
1

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

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

于 2013-04-23T21:15:49.267 回答
0

正如 VX 建议的那样,使用 'id' 作为两个集合的数组键将使基于 PHP 的算法更快。

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

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

于 2013-04-23T21:28:54.650 回答