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循環,以上代碼是最終版本


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM