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循环,以上代码是最终版本

转载于:https://www.cnblogs.com/tf-Y/p/5768901.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值