網上的相關教程非常多,基礎知識自行搜索即可。 習題主要選自Orelly出版的《數據結構與演算法javascript描述》一書。 參考代碼可見: "https://github.com/dashnowords/blogs/tree/master/Structure/Set" [TOC] 集合的基本知識 ...
目錄
網上的相關教程非常多,基礎知識自行搜索即可。
習題主要選自Orelly出版的《數據結構與演算法javascript描述》一書。
參考代碼可見:https://github.com/dashnowords/blogs/tree/master/Structure/Set
集合的基本知識
定義:
集合
Set
是一種不包含不同元素的數據結構,主要特性包括無序性和單一性,即集合中的成員是無序的,同時也是不重覆的。
基本練習
實現一個自定義的cSet
類(避免與原生的Set
類衝突),包含以下方法:
dataStore
-類屬性,用於存儲集合中的成員,用數組實現即可。
add(value)
- 向集合中加入成員。
remove(value)
- 從集合中移除成員。
union(cSetInstance)
- 求並集
intersect(cSetInstance)
求交集
difference(cSetInstance)
求差集
show( )
-顯示集合成員
課後習題(書中第九節習題)
1.修改Set
類,使得裡面的元素按順序存儲,並寫一段代碼測試該修改。
2.修改Set
類,將存儲方式從數組替換為鏈表,並寫一段代碼測試該修改。
3.為Set
類增加一個higher(element)
方法,該方法返回比傳入元素大的元素中最小的一個,並寫一段代碼來測試該功能。
4.為Set
類增加一個lower(element)
方法,該方法返回比傳入元素小的元素中最大的一個,並寫一段代碼來測試該功能。
習題思路
1.add(value)
方法中檢測完重覆性後,使用插入排序演算法和splice(i,0,value)
方法將成員直接插入正確位置。
2.將前述章節中實現的List.js
類引入,使用一個新的類繼承Set
類並覆寫其構造函數及相關方法即可。
3.習題1中已經實現了插入排序,higher(element)
只需要在Set
中找到element應該插入的位置,該位置後一個元素即滿足查找條件。
4.思路同上,不再贅述。
ES6新特性
阮一峰的ES6教程:http://es6.ruanyifeng.com/#docs/set-map
ES6
中原生實現了Set
,Map
,WeakSet
,WeakMap
跟集合相關的類型,和數據結構中的集合不完全一致,數據結構中的集合主要是一種數學概念的表現,而ES6
中的集合擁有一些針對特定問題的開發相關的特性。
1.數組去重
藉助集合可以實現js中最簡潔的數組去重方式:
//實現了Iterable介面的數據結構都可以作為初始化Set的參數
cosnt uniqueArr = [...new Set(arr)];
2.集合遍歷
keys()
,values()
,entries()
方法分別返回不同類型的遍歷器,可供for...of
迴圈結構消費。
3.數學特性
原生Set
類並沒有定義集合的數學運算操作方法,因為可以很方便的直接實現:
//並集
let union = new Set([...a,...b]);
//交集
let intersect = new Set([...a].filter(x=>b.has(a)));
//差集
let difference = new Set([...a].filter(x=>!b.has(a)));
4.WeakSet
WeakSet
的成員變數只能是對象,被放入其中的對象都是弱引用,在其他引用都解除後,垃圾回收機制不會考慮WeakSet
對該對象的持有。上面的教程中提到WeakMap
的主要用途是用於DOM節點的存儲,防止DOM節點移除後造成記憶體泄漏。基礎知識可以參考這篇博文《Javascript中4種常見的記憶體泄漏陷阱》。
5.WeakMap
WeakMap
的設計目的,在於當在某個DOM對象上存放一些數據時,會形成對這個對象的引用,影響垃圾回收機制,典型應用場景是在DOM元素上添加數據,當DOM元素被清除時,對應的WeakMap
記錄也會被自動清除。