首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >试着理解array_diff_uassoc优化

试着理解array_diff_uassoc优化
EN

Stack Overflow用户
提问于 2015-03-04 04:47:29
回答 2查看 133关注 0票数 5

乌索克内部进行比较之前,数组似乎进行了排序。

这种方法的好处是什么?

测试脚本

代码语言:javascript
复制
function compare($a, $b)
    {
    echo("$a : $b\n");
    return strcmp($a, $b);
    }

$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('v' => 1, 'w' => 2, 'x' => 3, 'y' => 4, 'z' => 5);
var_dump(array_diff_uassoc($a, $b, 'compare'));


$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('d' => 1, 'e' => 2, 'f' => 3, 'g' => 4, 'h' => 5);
var_dump(array_diff_uassoc($a, $b, 'compare'));


$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
var_dump(array_diff_uassoc($a, $b, 'compare'));

$a = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
$b = array('e' => 5, 'd' => 4, 'c' => 3, 'b' => 2, 'a' => 1);
var_dump(array_diff_uassoc($a, $b, 'compare'));

http://3v4l.org/DKgms#v526

在php7中,排序算法似乎发生了变化。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-04 05:22:43

排序算法在PHP 7中没有改变。为了提高性能,元素被按另一个顺序传递给排序算法。

好吧,好处可能是最终更快的执行。当两个数组都有完全不同的键时,您真的遇到了最坏的情况。

最糟糕的情况是,复杂性是对数组进行两次排序,然后对两个数组的每个键进行比较。O(n*m + n * log(n) + m * log(m))

最好的情况是进行两次排序,然后再进行与较小数组中的元素相同的比较。O(min(m, n) + n * log(n) + m * log(m))

在匹配的情况下,您不必再与完整的数组进行比较,而是只从匹配之后的键进行比较。

但是在当前的实现中,排序只是多余的。我认为,php-src中的实现需要改进。没有彻底的错误,但实现只是糟糕的。如果您了解一些C:比较 (请注意,该函数是通过php_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_ASSOC, DIFF_COMP_DATA_INTERNAL, DIFF_COMP_KEY_USER);array_diff_uassoc调用的)

票数 4
EN

Stack Overflow用户

发布于 2015-03-04 08:06:35

理论

排序允许进行一些快捷方式;例如:

代码语言:javascript
复制
A      | B
-------+------
1,2,3  | 4,5,6

A的每个元素只能与B进行比较,因为其他元素至少也是一样大的。

另一个例子是:

代码语言:javascript
复制
A      | B
-------+-------
4,5,6  | 1,2,6

在这种情况下,A与B的所有元素进行比较,而A1和A2仅与B2进行比较。

如果A的任何元素比B中的所有元素都大,您将得到最差的性能。

实践

虽然上面的方法对于标准的array_diff()array_udiff()很好,但是一旦使用了一个关键的比较函数,它就会依赖于O(n * m)的性能,因为它在试图修复这只虫子时使用了这一变化

上述bug描述了当与具有混合键(即数值和字符串键值)的数组一起使用时,自定义键比较函数如何会导致意外的结果。我个人认为应该通过文档来解决这个问题,因为使用ksort()会得到同样奇怪的结果。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28846822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档