學習數據結構與算法之集合

本系列全部文章:
第一篇文章:學習數據結構與算法之棧與隊列
第二篇文章:學習數據結構與算法之鏈表
第三篇文章:學習數據結構與算法之集合
第四篇文章:學習數據結構與算法之字典和散列表
第五篇文章:學習數據結構與算法之二叉搜索樹javascript

集合簡介

記得高一數學第一節課學的就是集合,如今快大四了再看到它有種見了老朋友的感受。哈哈,閒話很少扯,進入正題。java

集合是由一組無序且不重複的項組成的數據結構。這裏集合的概念和高中數學相似,也有空集,交集,並集,子集等概念,只不過在這裏就沒有那麼複雜的證實題了。那麼接下來就用JavaScript實現一下集合。git

用JavaScript實現集合

老規矩,先弄一個構造函數出來github

function Set () {
  // 這裏用對象來模擬集合
  var items = {}
}

集合要實現如下方法:算法

  • add(value):向集合添加新的項
  • remove(value):從集合刪除一項
  • has(value):若是集合中存在該項則返回true,不然返回false
  • clear():清除集合中的全部項
  • size():返回集合包含元素的數量
  • values():返回集合中全部值的數組

實現has

根據hasOwnProperty判斷該元素是否屬於集合,注意:hasOwnProperty能夠檢查屬性是否屬於對象,對於原型鏈上的屬性hasOwnProperty會返回falsesegmentfault

this.has = function (value) {
  return items.hasOwnProperty(value)
}

實現add

這裏添加新的元素到集合中時,首先要保證該元素不存在於集合中。數組

this.add = function (value) {
  if (!this.has(value)) {
    items[value] = value
    return true
  }
  return false
}

實現remove

刪除前也要先判斷元素是否存在數據結構

this.remove = function (value) {
  if (this.has(value)) {
    delete items[value]
    return true
  }
  return false
}

實現values

Object.keys的做用是返回對象中全部可枚舉屬性組成的數組(不包括原型鏈上的屬性)。固然,你也能夠用for...in 來實現。函數

this.values = function () {
  return Object.keys(items)
}

實現clear和size

比較簡單,就直接貼源碼了學習

this.clear = function () {
  items = {}
}

this.size = function () {
  return Object.keys(items).length
}

實現集合操做

集合有如下操做:

  • 並集
  • 交集
  • 差集
  • 子集

具體的就很少解釋了,請看代碼

實現並集

建立一個新集合unionSet表示兩個集合的並集,以後分別遍歷兩個集合添加進unionSet,最後返回集合

this.union = function (otherSet) {
  var unionSet = new Set()
  
  var values = this.values()
  for (var i = 0; i < values.length; i++) {
    unionSet.add(values[i])
  }
  
  values = otherSet.values()
  for (var i = 0; i < values.length; i++) {
    unionSet.add(values[i])
  }
  return unionSet
}

實現交集

交集是二者都有的屬性的集合,實現思路與上面相似,只要判斷元素是否同時存在與兩個集合就好了

this.intersection = function (otherSet) {
  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
}

實現差集

差集A-B的意思是:元素只在集合A中存在,集合B中不存在,所以實現也很簡單。

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
}

實現子集

數學中A是B的子集意味着A中的全部元素都存在於B中,按照這個思路實現代碼以下

this.subSet = function (otherSet) {
  if (this.size() > otherSet.size()) {
    return false
  } else {
    var values = this.values()

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

放上源代碼,有興趣的能夠看看:

集合的實現-源代碼

小結

到目前爲止,比較簡單的數據結構基本都掌握了,後面就是字典、散列表、樹、圖以及排序算法了,都是難啃的骨頭,可是必需要啃下來。繼續加油~

相關文章
相關標籤/搜索