陣列去重的幾種方式

TaylorSwiftTayolr發表於2019-01-14

1、陣列去重的幾種方式(轉載連結

方法1:使用Set + Array

function uniqueArray(arr){
    return Array.from(new Set(arr));
}
複製程式碼

優點:程式碼簡潔,速度快,時間複雜度為O(N)

缺點:需要一個額外的Set和Array的儲存空間,空間複雜度為O(N)

方法2:使用splice

function uniqueArray(arr){
    for(var i = 0; i < arr.length - 1; i++){
        for(var j = i + 1; j < arr.length; j++){
            if(arr[j] === arr[i]){
                arr.splice(j--, 1);
            }
        }
    }
    return arr;
}
複製程式碼

優點:不需要使用額外的儲存空間,空間複雜度為O(1)
缺點:需要頻繁的記憶體移動,雙重迴圈,時間複雜度為O(N2)

方法3:只用Array

function uniqueArray(arr){
    var retArray = [];
    for(var i = 0; i < arr.length; i++){
        if(retArray.indexOf(arr[i]) < 0){
            retArray.push(arr[i]);
        }
    }
    return retArray;
}複製程式碼

時間複雜度為O(N2),空間複雜度為O(N)

方法4:使用Object + Array

陣列去重的幾種方式

和方法三的區別在於,它不再是使用Array.indexOf判斷是否已存在,而是使用Object[key]進行雜湊查詢,所以它的時間複雜度為O(N),空間複雜為O(N).

總結:Object + Array最省時間,splice的方式最耗時(它比較省空間),Set + Array的簡潔方式在資料量大的時候時間將明顯少於需要O(N2)的Array,同樣是O(N2)的splice和Array,Array的時間要小於經常記憶體移動操作的splice。


相關文章