1. 程式人生 > 其它 >⑥ 資料結構之“集合”

⑥ 資料結構之“集合”

資料結構之“集合”

一、 理論

1. 集合簡介

  • 一種 無序且唯一 的資料結構
  • es6中有集合Set
  • 集合的常用操作:去重、判斷某元素是否在集合中、求交集

1.1 去重

// set
const arr = [1, 1, 2, 2]
const arr2 = [...new Set(arr)]

1.2 判斷元素是否在集合中

const set = new Set(arr)
set.has(1)
set.has(2) // true
set.has(3) // false

1.3 求交集

const set2 = new Set([2, 3])
const set3 = new Set([...set].filter(item => set2.has(item)))

二、刷題

1. 兩個陣列的交集(349)

1.1 題目描述

  • 給定兩個陣列,編寫一個函式來計算它們的交集
  • 說明
    • 輸出結果中的每個元素一定是唯一的
    • 我們可以不考慮輸出結果的順序

1.2 解題思路

輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]

  • 求交集且無序唯一

1.3 解題步驟

  • 用集合對nums1去重
  • 遍歷nums1,篩選出nums2也包含的值
function intersection(nums1, nums2) {
  return [...new Set(nums1)].filter(n => nums2.includes(n))
}

1.4 時間複雜度&空間複雜度

  • 時間複雜度:O(n*m)
  • 空間複雜度:O(n)

2. 使用ES6的Set(前端與集合)

  • 使用Set操作:new、add、delete、has、size
  • 迭代Set:多種迭代方法、Set與Array互轉、求交集差集

2.1 add操作

// set
let mySet = new Set()
mySet.add(1)
mySet.add(5)
mySet.add(5)
mySet.add('hello world')
let  o = { a: 1, b: 2 }
mySet.add(o)
mySet.add({ a: 1, b: 2 })

2.2 has操作

const has = mySet.has('hello world')
const has2 = mySet.has({ a: 1, b: 2 })
const has3 = mySet.has(o)

2.3 delete操作

mySet.delete(5)

2.4 迭代

  • for...of
for(let item of mySet) console.log(item)
for(let item of mySet.keys()) console.log('keys', item)
for(let item of mySet.values()) console.log('values', item)
for(let [key, value] of mySet.entries()) console.log('values', key, value)

2.5 Set與Array互轉

  • Set轉Array
const myArr = [...mySet]
const myArr = Array.from(mySet)
  • Array轉Set
const mySet2 = new Set([1, 2, 3, 4])

2.6 求交集

const intersection = new Set([...mySet].filter(x => mySet2.has(x)))

2.7 求差集

const difference = new Set([...mySet].filter(x => !mySet2.has(x)))

三、總結 -- 技術要點

  • 集合是一種 無序且唯一 的資料結構
  • es6中有集合Set
  • 集合的常用操作:去重、判斷某元素是否在集合中、求交集...