input:array1,array2
output:an array that values in array1 but not in array2
1.php有内置函数php_diff($array1,$array2);
详见php官网:http://www.php.net/manual/zh/function.array-diff.php
array array_diff ( array $array1
, array $array2
[, array $...
] )
对比返回在 array1
中但是不在 array2
及任何其它参数数组中的值。
php_diff的实现原理是什么呢?我没有编译过php的源码,不知道。
但是想了想,大致有两种方法:
1)、把array2 中的每一个值拿到array1中比较,如果存在,就删掉,直到比完array2中所有的值 -->时间复杂度:O(n*n)
2)、hashtable法:新建数组hasharr[],遍历array2,array2中的值为value,则设置 : hasharr[value] = 1; -->时间复杂度:O(n)
然后再遍历array1,unset(hasharr[value]); -->时间复杂度:O(n)
最后,return array_keys(hasharr).
从理论上分析,hashtable的方法更有效率
2.最近学会个新词,叫做: benchmark test
下面做一个benchmark test:
<?php
$a = range(0, 10000);
$b = range(5000,15000);
shuffle($a);
shuffle($b);
function general_thought_method($array1, $array2) {
foreach ($array1 as $key1 => $value1) {
if (in_array($value1, $array2)) {
unset($array1[$key1]);
}
}
return $array1;
}
function hashtable_method($array1,$array2) {
$hasharr = array();
foreach ($array2 as $key2 => $value2) {
$hasharr[$value2] = 1;
}
foreach ($array1 as $key1 => $value1) {
if (isset($hasharr[$value1])) {
unset($array1[$key1]);
}
}
return $array1;
}
$timestamp = microtime(true);
general_thought_method($a, $b);
printf("general_thought_method =%.4f\n", microtime(true) - $timestamp);
$timestamp = microtime(true);
hashtable_method($a, $b);
printf("hashtable_method=%.4f\n", microtime(true) - $timestamp);
$timestamp = microtime(true);
array_diff($a, $b);
printf("array_diff=%.4f\n",microtime(true) - $timestamp);
general_thought_method =1.2986 hashtable_method=0.0121 array_diff=0.0816
hashtable快了不止一点!