媒介
鳩合是一種包括差別元素的數據構造。鳩合最主要的兩個特徵是:起首,鳩合中的成員是無序的;其次,鳩合中不允許雷同成員存在。
一、關於鳩合
鳩合的定義
我們必需要相識以下關於鳩合的定義:
- 不包括任何成員的鳩合稱為空集,全集則是包括統統能夠成員的鳩合。
- 假如兩個鳩合的成員完全雷同,則稱兩個鳩合相稱。
- 假如一個鳩合中一切的成員都屬於別的一個鳩合,則前一鳩合稱為後一鳩合的子集。
鳩合的操縱
對鳩合的操縱有以下幾種:
- 並集:將兩個鳩合中的成員舉行兼并,獲得一個新鳩合。
- 交集:兩個鳩合中配合存在的成員構成一個新的鳩合。
- 補集:屬於一個鳩合而不屬於另一個鳩合的成員構成的鳩合。
二、組織鳩合數據構造
我們將運用JavaScript完成鳩合構造,各部分功用運用解釋申明。
存儲數據我們運用的是數組。
/**
* Set() 定義鳩合類
*/
function Set () {
this.dataStore = []
this.add = add
this.remove = remove
this.size = size
this.union = union
this.intersect = intersect
this.subset = subset
this.difference = difference
this.show = show
this.contains = contains
}
/**
* add() 該要領用於為鳩合類增加值
* @param {*} data
*/
function add (data) {
if (this.contains(data)) {
return false
} else {
this.dataStore.push(data)
return true
}
}
/**
* remove() 該要領用於為鳩合類刪除值
* @param {*} data
*/
function remove (data) {
let pos = this.dataStore.indexOf(data)
if (pos > -1) {
this.dataStore.splice(pos, 1)
return true
} else {
return false
}
}
/**
* show() 該要領用於顯現鳩合中的一切元素
*/
function show () {
return this.dataStore
}
/**
* size() 該要領用於獵取鳩合的長度
*/
function size () {
return this.dataStore.length
}
/**
* union() 該要領用於求兩個鳩合的並集
* @param {*} set
*/
function union (set) {
let tempSet = new Set()
// 將當前鳩合中的元素到場到暫時鳩合中
for (let i = 0; i < this.size(); i++) {
tempSet.add(this.dataStore[i])
}
// 推斷第二個鳩合中的元素在暫時鳩合中是不是存在,若不存在,則到場該元素
for (let i = 0; i < set.size(); i++) {
if (!tempSet.contains(set.dataStore[i])) {
tempSet.add(set.dataStore[i])
}
}
return tempSet
}
/**
* intersect() 該要領用於求兩鳩合的交集
* @param {*} set
*/
function intersect (set) {
let tempSet = new Set()
// 遍歷set
for (let i = 0; i < set.size(); i++) {
// 當該鳩合中存在此元素,則將該元素插進去至tempSet
if (this.contains(set.dataStore[i])) {
tempSet.add(set.dataStore[i])
}
}
return tempSet
}
/**
* subset() 該要領用於推斷當前鳩合是不是為set鳩合的子集
* @param {*} set
*/
function subset (set) {
// 當該鳩合的長度大於set鳩合的長度,則該鳩合不能夠為set鳩合的子集
if (this.size() > set.size()) {
return false
}
for (let i of this.dataStore) {
if (!set.contains(i)) {
return false
}
}
return true
}
/**
* difference() 該要領用於返回屬於該鳩合但不屬於set鳩合的成員
* @param {*} set
*/
function difference (set) {
let tempSet = new Set()
for (let i of this.dataStore) {
if (!set.contains(i)) {
tempSet.add(i)
}
}
return tempSet
}
/**
* contains() 該要領用於推斷元素是不是存在於鳩合中
* @param {*} data
*/
function contains (data) {
if (this.dataStore.indexOf(data) > -1) {
return true
} else {
return false
}
}
以上代碼,個人認為非常主要的要領就是indexOf()
來推斷數組中是不是存在該元素,經由過程該要領來推斷當前可否向鳩合中增加元素。
結束語
運用JavaScript完成鳩合數據構造相對來說比較簡單。
參考資料:數據構造與算法JavaScript形貌 第9章 鳩合
因為書上的源代碼湧現了毛病,因而代碼依據現實運轉效果做了響應修正。