PHP去重算法的优化过程
最近公司在做一个项目,需要对爬取到的数据进行去重,方法就是根据数据的id,去除掉id重复的数据。
下面是这个方法的演化过程。
// 去重
$arr_id = array();
$LeTVFeedList = array();
for ($i = 0; $i < count($arrFeedList); $i++){
if(!in_array($arrFeedList[i]['id'], $arr_id)){
$LeTVFeedList[] = $arrFeedList[i];
$arr_id[] = $arrFeedList[i]['id'];
}
}
从上面的算法中可以看到,上面的算法用了两个数组,两个循环,所以它的时间复杂度为O(n^2),空间复杂度为O(2n)。上面的算法,我们可以从in_array()入手,考虑下面的因素。
用数组的id作数组下标,来存储爬取到的数据值。
// 去重
$tmp_arr = array();
for ($i = 0; $i < min(count($arrFeedList),10); $i++){
$tmp_arr[$arrFeedList[$i]['id']] = $arrFeedList[$i];
}
$arrLeTVFeedList = array();
foreach ($tmp_arr as $key => $value){
$arrLeTVFeedList[] = $value;
}
这里用了两个循环,两个数组,时间复杂度是O(2n),空间复杂度是O(2n).
后来又对循环进行了优化,变成如下代码:
// 去重
$tmp_arr = array();
$arrLeTVFeedList = array();
foreach ($arrFeedList as $key => $value){
if(!isset($tmp_arr[$key['id']])){
$tmp_arr[$key['id']] = $value;
$arrLeTVFeedList[] = $value;
}
}
isset是速度要快于for循环,以上代码是最终版本
PHP去重算法的优化过程的更多相关文章
- 【转】JavaScript下对去重算法的优化
本人较懒,直接将链接附上: JavaScript下去重算法优化:http://www.linuxde.net/2013/02/12062.html
- SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(一)。
这里的高斯模糊采用的是论文<Recursive implementation of the Gaussian filter>里描述的递归算法. 仔细观察和理解上述公式,在forward过程 ...
- Spark Mllib里的协调过滤的概念和实现步骤、LS、ALS的原理、ALS算法优化过程的推导、隐式反馈和ALS-WR算法
不多说,直接上干货! 常见的推荐算法 1.基于关系规则的推荐 2.基于内容的推荐 3.人口统计式的推荐 4.协调过滤式的推荐 (广泛采用) 协调过滤的概念 在现今的推荐技术和算法中,最被大家广泛认可和 ...
- [转] Paxos算法2-算法过程(实现)
请先参考前文:Paxos算法1 1.编号处理 根据P2c ,proposer在提案前会先咨询acceptor查看其批准的最大的编号和value,再决定提交哪个value.之前我们一直强调更高编号的pr ...
- Bellman-Ford 算法及其优化
Bellman-Ford 算法及其优化 转自:http://hi.baidu.com/jzlikewei/blog/item/94db7950f96f995a1038c2cd.html Bellman ...
- 【转】larbin中的url去重算法
1.bloom filter算法 传说中,larbin使用bloom filter算法来进行url去重.那我们就先来了解下bloom filter算法好了. [以下转自:http://hi.baidu ...
- 算法的优化(C语言描述)
算法的优化 算法的优化分为全局优化和局部优化两个层次.全局优化也称为结构优化,主要是从基本控制结构优化.算法.数据结构的选择上考虑:局部优化即为代码优化,包括使用尽量小的数据类型.优化表达式.优化赋值 ...
- 支持向量机-完整Platt-SMO算法加速优化
完整版SMO算法与简单的SMO算法: 实现alpha的更改和代数运算的优化环节一模一样,唯一的不同就是选择alpha的方式.完整版应用了一些能够提速的方法. 同样使用Jupyter实现,后面不在赘述 ...
- 【转】Paxos算法2-算法过程
——转自:{老码农的专栏} 1.编号处理 根据P2c ,proposer在提案前会先咨询acceptor查看其批准的最大的编号和value,再决定提交哪个value.之前我们一直强调更高编号的prop ...
随机推荐
- 面向过程(POP)、面向对象(OOP)、面向接口(IOP)、面向切面(AOP)
面向过程:典型的是C/C++的结构体,结构体里只有变量,没有处理变量的方法,需要专门编写处理变量的方法. 面向对象:ArrayList<Integer> list=new ArrayLis ...
- EF jsonignore
页面单独指定不循环引用 [JsonIgnore] Newtonsoft.Json.JsonSerializerSettings jsSettings = new Newtonsoft.Json.Jso ...
- 远方的塔--Pylons
转自:https://en.wikipedia.org/wiki/Pylons_project#Pylons_Framework Pylons
- (3)WebApi客户端调用
1.创建一个应用台控制程序,可以把Model的引用,用下面的方法拖拽上来(解决方案里没有这个文件,只是这个文件的引用) 2.Program.cs using System; using System ...
- ***git自动化部署总结
在网上搜了一堆没用找到太仔细的教程,于是花费2天时间,自己研究了下.现在分享如下: 思路:利用crontab定时去去执行git pull脚本 首先,用git clone命令将中央库的代码下载到阿里云 ...
- Delphi容器类之---TList、TObjectList、TComponentList、TClassList
转载自:http://blog.csdn.net/iseekcode/article/details/4922001 从Delphi5开始VCL中增加了新的Contnrs单元,单元中定义了8个新的类, ...
- Jquery中ajax方法data参数的用法
$.ajax({ type: "POST", url: "some.php", data: "name=John&location ...
- Ajax ContentType 列表大全
".*"="application/octet-stream" ".001"="application/x-001" & ...
- 【积累篇:他山之石,把玉攻】Mime 类型列表
按照内容类型排列的 Mime 类型列表 类型/子类型 扩展名 application/envoy evy application/fractals fif application/futurespla ...
- android中 onResume()方法什么时候执行 ??(转)
转自: onResume是在启动activity启动之后才能执行的,也就是恢复执行.程序正常启动:onCreate()->onStart()->onResume();正常退出:onPaus ...