zoukankan      html  css  js  c++  java
  • 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循环,以上代码是最终版本

  • 相关阅读:
    算法总结7—多维缩放
    算法总结3—神经网络
    算法总结9—优化
    算法总结8—非负矩阵因式分解
    R语言系列—区间估计
    算法总结2—决策树分类器
    算法总结5&6k最近邻与聚类
    统计,逻辑与智能
    算法总结4—支持向量机
    R语言系列—回归分析
  • 原文地址:https://www.cnblogs.com/tf-Y/p/5768901.html
Copyright © 2011-2022 走看看