php - 试图了解 array_diff_uassoc 优化

标签 php arrays sorting php-7

似乎数组在array_diff_uassoc 内部相互比较之前已经排序.

这种方法有什么好处?

测试脚本

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 中发生了变化。

最佳答案

排序算法在 PHP 7 中没有改变。元素只是以另一种顺序传递给排序算法以提高性能。

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

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

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

在匹配的情况下,您不必再次与整个数组进行比较,而只需从匹配后的键开始。

但在当前的实现中,排序只是多余的。我认为 php-src 中的实现需要一些改进。没有彻底的错误,但实现很糟糕。如果你懂一些C:http://lxr.php.net/xref/PHP_TRUNK/ext/standard/array.c#php_array_diff (请注意,该函数是通过 php_array_diff(INTERNAL_FUNCTION_PARAM_PASSTHRU, DIFF_ASSOC, DIFF_COMP_DATA_INTERNAL, DIFF_COMP_KEY_USER);array_diff_uassoc 调用的)

关于php - 试图了解 array_diff_uassoc 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28846822/

相关文章:

python - python中堆元素的比较顺序

java - 关于调试 Hadoop MapReduce 作业中二级排序问题的任何提示?

c++ - 如何根据第一个或第二个中的较大值对数组对进行排序

Javascript - 如何创建过滤嵌套数组

php - 使 Pdo 保留反斜杠

用于多种条件的php sql语句正确方法

php - Codeigniter jquery ajax mysql 形式

c++ - 在 C++ 中切片 char 数组(python 到 c++)

php - 如何在android java中获取关联数组元素?

php - MySQL 和 PHP 中的批处理?