学习js数据结构与算法-集合(3)

112 阅读3分钟

这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」。

个人觉得要想进大厂,就必须学习了解算法和数据结构,经历了多次面试之后,也知道了算法和数据结构的重要性,所以,我也打算从今天开始,进入学习,下载了一下电子书,边看书,边跟着书的例子来敲一下代码,下面就开始总结一下对算法和数据结构的学习吧。

第二十天:继续学习集合

集合运算

集合事数学中基础的概念,在计算机领域也非常重要。它在计算机科学中的主要应用之一是数据库,而数据库事大多数应用程序的根据。集合呗用于查询的设计和处理。当我哦们创建一条从关系行数据库中获取一个数据集合的查询语句时,使用的就是集合运算,并且数据库也会返回一个数据集合。当我们创建一条查询命令时,可以指定时从表中获取全部的数据还是只是其中的子集。

  • 并集

    两个集合中所有的元素的新集合

image.png

union(otherSet) {
  let unionSet = new Set()
  this.values().forEach(item => unionSet.add(item))
  otherSet.values().forEach(item => unionSet.add(item))
  return unionSet
}

首先创建了一个集合数据结构,然后把原先的集合的值遍历添加到这个创建的集合中去,还需要把传入的新集合也遍历一边添加进这个集合中去,最后返回这个集合。

  • 交集

    两个集合中共用的新集合

image.png

intersection (otherSet) {
  const intersectionSet = new Set();
  for(let item of this.values()) {
    if(otherSet.has(item)) {
      intersectionSet.add(item)
    }
	}
  return intersectionSet
}

还是先创建一个新的集合实例,然后循环已有的集合,当传入的集合里面有当前值的话,就往新的集合里面添加元素。最后返回这个新的集合

我们还可以优化一下集合,比如有一个集合A:[1,2,3,4,5,6]和一集合B:[1,2],如果用上面的方法,那么我们需要循环六次集合A,判断集合B中有没有,如果我们只需要遍历两次集合B的元素就好了

intersection (otherSet) {
  const intersectionSet = new Set();
  const values = this.values(); // {2}
  const otherValues = otherSet.values(); // {3}
  let bigger = values
  let smaller = otherValues
  if(bigger.length - smaller.length < 0) {
    bigger = otherValues
    smaller = values
  }
  for(let item of smaller) {
    if(bigger.has(item)) {
      intersectionSet.add(item)
    }
	}
  return intersectionSet
}

这样我们就可以循环更少的次数来得出两个集合之间的交集了。

  • 差集

    第一个集合中存在且不存在第二个集合的元素的新集合

image.png

difference(otherSet) {
  const differenceSet = new Set()
  this.values().forEach(item => {
    if(!otherSet.has(item)) {
      differenceSet.add(item)
    }
  })
  return differenceSet
}

可以根据传入的集合有没有该元素来判断是否需要添加进新的集合,如果传入的集合没有该元素,就添加进入新的集合中,最后返回这个新的集合。

  • 子集

    一定集合是否完全包含当前集合中的元素。

image.png

isSubsetOf(otherSet) {
  if(this.sizes() > otherSet.size()) return false
  return this.values().every(item => otherSet.has(item))
}

首先需要判断当前实例的大小,如果当前集合大于传入的集合,就直接不是传入集合的子集,返回false。然后直接遍历当前集合的值是不是全部都在传入集合中,可以只用使用every方法,当有一个为false之后就不在走下去了,返回false