js實現數據結構及算法之集合(Set)

集合(Set)

集合是一種包含不一樣元素的數據結構編程

不少編程語言中,集合並非一種數據類型,可是若是你須要建立一個數據結構用來保存一些獨一無二的元素時,集合就變得頗有用
bash

集合的成員是無序的數據結構

集合中不容許相同成員存在編程語言

集合(Set)是由一組無序但彼此之間又有必定關係性的成員構成,集合中的元素稱爲成員
ui

不包含任何成員的集合稱爲空集,包含一切可能成員的集合稱爲全集
this

若是兩個集合裏的成員都徹底相同,則稱兩個集合相等
spa

若是一個集合全部成員都包含於另外一個集合,則前一集合稱爲後一集合的一個子集code

  • 並集:將兩個集合中的成員進行合併,獲得一個新的集合
  • 交集:將兩個集合中共同存在的成員組成的一個新的集合
  • 補集:屬於一個集合而不屬於另外一個集合的成員組成的新的集合

js實現

/**
   * 一個簡單的集合
   * @constructor
   */
  function Set() {
    this.dataStore = [];            // 數據存儲
    this.add = add;                 // 添加成員
    this.remove = remove;           // 刪除成員
    this.show = show;               // 顯示當前集合
    this.size = size;               // 集合元素個數
    this.union = union;             // 集合求並集
    this.intersect = intersect;     // 集合求交集
    this.subset = subset;           // 判斷一個集合是不是另外一集合的子集
    this.difference = difference;   // 集合求補集
    this.contains = contains;       // 判斷某成員是否屬於該集合
  }

  //添加成員
  function add(data) {
    if (this.dataStore.indexOf(data) < 0) {
      this.dataStore.push(data)
    } else {
      return false
    }
  }

  //刪除成員
  function remove(data) {
    var pos = this.dataStore.indexOf(data);
    if (pos > -1) {
      this.dataStore.splice(pos, 1)
    } else {
      return false
    }
  }

  // 顯示當前集合
  function show() {
    return this.dataStore
  }
  // 顯示集合個數
  function size() {
    return this.dataStore.length
  }

  // 集合求並集
  function union(set) {
    var tempSet = new Set()
    for (var i = 0; i < this.dataStore.length; i++) {
      tempSet.add(this.dataStore[i])
    }
    for (var i = 0; i < set.dataStore.length; i++) {
      if (!tempSet.contains(set.dataStore[i])) {
        tempSet.add(set.dataStore[i])
      }
    }
    return tempSet
  }

  // 集合求交集
  function intersect(set) {
    var tempSet = new Set()
    for (var i = 0; i < this.dataStore.length; i++) {
      if (set.contains(this.dataStore[i])) {
        tempSet.add(this.dataStore[i])
      }
    }
    return tempSet
  }

  //集合求補集
  function difference(set) {
    var tempSet = new Set()
    for (var i = 0; i < this.dataStore.length; i++) {
      if (!set.contains(this.dataStore[i])) {
        tempSet.add(this.dataStore[i])
      }
    }
    return tempSet
  }



// 集合求子集
function subset(set) {
    if(set.size() > this.size())  return false
  for(var i = 0; i < set.dataStore.length; i++) {
      if(!this.contains(set.dataStore[i])) {
        return false
      }
  }
  return true
}

// 判斷某成員是否屬於該集合
function contains(data) {
  return this.dataStore.indexOf(data) > -1 ? true : false
}

var set = new Set()
set.add('1')
set.add('1')
set.add('13')
set.add('14')
set.add('15')
set.remove('15')
console.log(set.show())
var set2 = new Set()
set2.add('1')
set2.add('21')
set2.add('213')
set2.add('14')
  console.log(set2.show())
console.log('=====並集====')
console.log(set.union(set2).show())
console.log('=====交集====')
console.log(set.intersect(set2).show())
console.log('=====補集====')
console.log(set.difference(set2).show())
  var set3 = new Set()
  set3.add('1')
  set3.add('13')
  set3.add('14')
  console.log('=====set3是set子集====')
 console.log(set.subset(set3))
  console.log('=====set2是set子集====')
  console.log(set.subset(set2))複製代碼
相關文章
相關標籤/搜索