两个分别有 5000 个元素的数组,计算他们的差集,也就是用 PHP 和你认为最好的算法实现 array_diff 的算法
$StartTime = microtime(true); // 程序运行起始时间
// 模拟两个5000量级的数组
for($i=0;$i<4999;$i++){
$array_1[] = $i;
}
for($k=4800;$k<9899;$k++){
$array_2[] = $k;
}
输出两个数组:
$array_1:
Array
( [0] => 0 [1] => 1 [2] => 2 [3] => 3 ...
[4997] => 4997 [4998] => 4998 )
$array_2:
Array
( [0] => 4800 [1] => 4801 ...
[5097] => 9897 [5098] => 9898 )
方法一:
/*
$diff = array();
foreach ($array_1 as $k => $v1) {
$flag = false;
foreach ($array_2 as $v2) {
if ($flag = ($v1 == $v2)) {
break;
}
}
if (!$flag) {
$diff[$k] = $v1;
}
}*/
// 2,347.2552毫秒
虽然实现是可以的,但是发现这个函数的效率是惨不忍睹。于是我又重新考虑了下,并优化了算法
// 方法二:
/*
foreach ($array_1 as $key => $item) {
if (in_array($item, $array_2, true)) {
unset($array_1[$key]);
}
}
*/
// 304.5480毫秒
这次几乎可以和原 array_diff 函数的速度媲美了。但是还有没有更优化的办法呢?
// 方法三:
$array_2 = array_flip($array_2); // 交换数组的键和值
foreach ($array_1 as $key => $item) {
if (isset($array_2[$item])) {
unset($array_1[$key]);
}
} // 15.0731毫秒
这个函数的效率非常的惊人,甚至比原 array_diff 函数的速度都要快。究其原因,我找到了解释:
因为键是进行 HASH 组织的,查找很快;而 Value 只是由 Key 组织存放,本身没有索引,每次查找都是遍历。
总结:
这虽然是 PHP 语言的一个小窍门,但在遍历和对比数组的值上,如果需要对比值将其与键反转的确比通常的值对值的比较效率要高得多。比如,上面的函数二需要调用 in_array 函数需要循环判断是否在函数内;而函数三则仅仅判断这个数组是否存在该键就可以了。
加上数组键和值不同的组织索引方式,效率比想象的还高那就非常可以理解了。
$StopTime = microtime(true);
$TimeSpent=$StopTime-$StartTime;
echo number_format($TimeSpent*1000, 4).'毫秒'; // 897.6068毫秒
转载:
http://bbs.chinaunix.net/thread-1032441-1-1.html
代码稍微加了点运行时间
@todo
http://www.jb51.net/article/29949.htm
http://blog.csdn.net/guguyu/article/details/45152283
相关推荐
46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip46.java数组遍历1.zip...
js 二维数组 遍历 轻松实现实现 二维数组输出 包含高级for循环
php数组遍历的类
N维数组遍历输出,代码简洁效率快,算法先进。减轻开发工作量。
PHP数组遍历方法小结 PHP数组遍历方法小结
Javascript中二维数组的遍历,上次碰到的时候有点迷惑,找了很多资料,最后整理的精华
随意写的一个文档。
本文实例讲述了JS常用的几种数组遍历方式以及性能分析对比。分享给大家供大家参考,具体如下: 前言 这一篇与上一篇 JS几种变量交换方式以及性能分析对比 属于同一个系列,本文继续分析JS中几种常用的数组遍历方式...
2.数组遍历.html
NULL 博文链接:https://onestopweb.iteye.com/blog/2323726
程序基础设计的初步方法 不同类型的数据的通用处理 对于kotlin的数组遍历输出 对kotlin的遍历的代码
c++递归函数的使用,介绍了使用递归实现数组遍历和阶乘函数的函数
整理的不是很好,大家多多见谅,茫茫人海中你点到了这个页面,认识你真是太好了。
第03章 方法与数组 04 数组遍历和内存分析
JavaScript 1.8.5 英文第四章 数组与函数数组遍历
java json解析,数组的遍历等等
主要介绍了PHP数组遍历知识汇总,本文包含3种遍历方法、7个数组指针操作函数、对3种数组遍历的速度测试等内容,需要的朋友可以参考下
java数组遍历 删除remove。需要的朋友可以过来参考下,希望对大家有所帮助
PHP程序设计-3期(KC016) 2.7.3数组遍历常见问题.docx 学习资料 复习资料 教学资源
PHP程序设计-3期(KC016) 2.7.3数组遍历拓展知识.doc 学习资料 复习资料 教学资源