最近公司在做一個項目,需要對爬取到的數據進行去重,方法就是根據數據的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循環,以上代碼是最終版本