最近在面試,僥倖面試成功,這裏列舉一下數組去重的方法
這裏咱們先隨機生成一個10000項的數組,經過不一樣方法的對數組進行去重,來比較一下速度。javascript
首先生成數組java
function product(){ var arr=[] for(var i=0;i<10000;i++){ var a=randomNum() arr.push(a) } return arr } function randomNum(){ return Math.ceil((Math.random()*10000)) } var arr=product() console.log(arr)
1.首先是經過雙循壞的方法
聲明一個新的空數組,每次對新數組進行檢索,若是查不到,則將元素插入。時間複雜度爲O(n2)
貼上代碼面試
function isRepeat2(arr){ var newArr=[]; for(var i=0;i<arr.length;i++){ if(newArr.indexOf(arr[i])==-1){//沒查到 newArr.push(arr[i]) } } return newArr }
2.這種思路是先對數組進行排序,而後比較相鄰的元素,若是重複就刪除。時間複雜度也爲O(n2)數組
因爲JS對sort排序進行了優化,會比第一種方法速度要快一些
代碼:dom
function isRepeat(arr){ arr=arr.sort((a,b)=>{ return a-b }) for(var i=0;i<arr.length-1;i++){ if(arr[i]==arr[i+1]){ arr.splice(i,1) i-- } } return arr }
3. 利用hash對象進行排序優化
利用hash對象的key值不重複,來判斷是否插入新的元素,因爲只進行了一次遍歷 時間明顯縮短。時間複雜度爲O(n)
4.利用ES6的Set對象
Set對象的相似於數組,其值不能重複spa
function isRepeat3(arr){ const s = new Set(); arr.forEach(x => s.add(x)); return arr }
這種跟第3種速度差很少
下面貼一下四種方式的運行時間比較code
console.time() console.log(isRepeat(arr)) console.timeEnd() console.time() console.log(isRepeat2(arr)) console.timeEnd() console.time() console.log(isRepeat3(arr)) console.timeEnd() console.time() console.log(set(arr)) console.timeEnd()
能夠看到,4種去重方式的運行速度,明顯3,4速度要快一些
你學到了嗎?
歡迎各位批評指正
對象