本系列全部文章:
第一篇文章:學習數據結構與算法之棧與隊列
第二篇文章:學習數據結構與算法之鏈表
第三篇文章:學習數據結構與算法之集合
第四篇文章:學習數據結構與算法之字典和散列表
第五篇文章:學習數據結構與算法之二叉搜索樹javascript
記得高一數學第一節課學的就是集合,如今快大四了再看到它有種見了老朋友的感受。哈哈,閒話很少扯,進入正題。java
集合是由一組無序且不重複的項組成的數據結構。這裏集合的概念和高中數學相似,也有空集,交集,並集,子集等概念,只不過在這裏就沒有那麼複雜的證實題了。那麼接下來就用JavaScript實現一下集合。git
老規矩,先弄一個構造函數出來github
function Set () { // 這裏用對象來模擬集合 var items = {} }
集合要實現如下方法:算法
根據hasOwnProperty
判斷該元素是否屬於集合,注意:hasOwnProperty
能夠檢查屬性是否屬於對象,對於原型鏈上的屬性hasOwnProperty
會返回falsesegmentfault
this.has = function (value) { return items.hasOwnProperty(value) }
這裏添加新的元素到集合中時,首先要保證該元素不存在於集合中。數組
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 }
Object.keys
的做用是返回對象中全部可枚舉屬性組成的數組(不包括原型鏈上的屬性)。固然,你也能夠用for...in 來實現。函數
this.values = function () { return Object.keys(items) }
比較簡單,就直接貼源碼了學習
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 } }
放上源代碼,有興趣的能夠看看:
到目前爲止,比較簡單的數據結構基本都掌握了,後面就是字典、散列表、樹、圖以及排序算法了,都是難啃的骨頭,可是必需要啃下來。繼續加油~