1. 程式人生 > >簡單說一說資料結構——集合

簡單說一說資料結構——集合

迄今為止,我們已經學習了陣列(列表)、棧、佇列和連結串列(及其變種)等順序資料結構。

這一節我們講講集合。集合的定義是由一組無序且唯一(即不能重複)的項組成的。不包含任何元素的集合就叫做空集。上高中那會,我們都接觸過集合,其中一些概念比如交集、並集、差集等等。

ECMAScript6也實現了集合這種資料結構——Set類。而我們用ECMAScript5來實現。也可以為看Set時做鋪墊。

首先,集合Set類的骨架是

function Set(){
    var items = {}; 
}

與之前不同的是,這裡使用的是物件而不是陣列來表示集合。因為物件和集合有一個共同點,Javascript不允許一個鍵指向兩個不同的屬性,也保證了集合裡的元素都是唯一的。

集合Set類中有一些可用的方法:
add(value):向集合新增一個新的項。
remove(value):從集合中移除一個值。
has(value):判斷集合中是否存在某個值。
clear():移除集合中所有的項。
size():返回集合中所包含元素的數量。
values():返回一個包含集合中所有值的陣列。

實現起來藉助物件也是非常easy的:

    this.has = function(value){
        return items.hadOwnProperty(value);     //return value in items;
    };
    this
.add = function(value){ if(!this.has(value)){ items[value] = value; return true; } return false; }; this.remove = function(value){ if(this.has(value)){ delete items[value]; return true; } return false
; }; this.clear = function(){ items = {}; }; // this.size = function(){ // return Object.keys(items).length; // }; this.sizeLegacy = function(){ var count = 0; for(var prop in items){ if(items.hadOwnProperty(prop)){ count++; } } return count; }; // this.values = function(){ // return Object.keys(items); // } this.valuesLegacy = function(){ var keys = []; for(var key in items){ if(items.hadOwnProperty(key)){ keys.push(key); } } return keys; };

以上程式碼值得注意的點有:在has方法中,hasOwnProperty函式會返回物件是否有某個特定屬性。有就返回true,沒有就返回false。其次在size方法中,提供了兩種方式。第一種方式是利用keys函式,它返回一個包含給定物件所有屬性的陣列。支援該方法的瀏覽器有IE9+、Firefox4+、Chrome5+、Opera12+和Safari5+。要使size方法適用所有瀏覽器,那麼就使用sizeLegacy函式。values函式同理。

瞭解完集合的基本概念和操作。下面講一講集合之間的關係及操作:
並集:對於給定的兩個集合,返回一個包含兩個集合中所有元素的新集合。
交集:對於給定的兩個集合,返回一個包含兩個集合中共有元素的新集合。
差集:對於給定的兩個集合,返回一個包含所有存在於第一個集合且不存在於第二個集合的元素的新集合。
子集:驗證一個給定集合是否是另一個集合的子集。

並集用一張圖表示:
並集

    this.union = function(otherSet){
        var unionSet = new Set();

        var values = this.values();
        for(var i = 0 ; i < values.length ; i++){
            unionSet.add(values[i]);
        }

        for(var i = 0 ; i < otherSet.length ; i++){
            unionSet.add(otherSet[i]);
        }

        return unionSet;
    };

交集用一張圖表示:
交集

this.intersection = function(){
        var intersectionSet = new Set();

        var values = this.values();
        for(var i = 0 ; i < values.length ; i++){
            if(otherSet.has(values[i])){
                intersectionSet.add(values[i]);
            }
        }
        return intersectionSet;
    };

差集用一張圖表示
差集

this.difference = function(otherSet){
        var differenceSet = new Set();

        var values = this.values();
        for(var i = 0 ; i < values.length ; i++){
            if(!otherSet.has(values[i])){
                differenceSet.add(values[i]);
            }
        }
        return differenceSet;
    };

最後一個子集:
子集

this.subset = function(otherSet){
        if(this.size() > otherSet.size()){
            return false;
        }else{
            var values = this.values();
            for(var u = 0 ; i < values.length ; i++){
                if(!otherSet.has(values[i])){
                    return false;
                }
            }
            return true;
        }
    };

集合講到這裡也就完了,還是比較簡單的一種結構。含測試程式碼