【前端數據結構基本】鳩合

媒介

鳩合是一種包括差別元素的數據構造。鳩合最主要的兩個特徵是:起首,鳩合中的成員是無序的;其次,鳩合中不允許雷同成員存在。

一、關於鳩合

鳩合的定義

我們必需要相識以下關於鳩合的定義:

  • 不包括任何成員的鳩合稱為空集全集則是包括統統能夠成員的鳩合。
  • 假如兩個鳩合的成員完全雷同,則稱兩個鳩合相稱。
  • 假如一個鳩合中一切的成員都屬於別的一個鳩合,則前一鳩合稱為後一鳩合的子集

鳩合的操縱

對鳩合的操縱有以下幾種:

  • 並集:將兩個鳩合中的成員舉行兼并,獲得一個新鳩合。
  • 交集:兩個鳩合中配合存在的成員構成一個新的鳩合。
  • 補集:屬於一個鳩合而不屬於另一個鳩合的成員構成的鳩合。

二、組織鳩合數據構造

我們將運用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章 鳩合

因為書上的源代碼湧現了毛病,因而代碼依據現實運轉效果做了響應修正。

    原文作者:Miyang
    原文地址: https://segmentfault.com/a/1190000015260417
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞