AlgoMooc

集合

10 / 28基础内容

数据结构动画

集合

加载中
正在加载动画引擎...

本课导读

集合是只装不重复元素的袋子,底层通常是哈希表,所以增、删、查都接近 O(1)。

你将学到
  • 自动去重、无序
  • 查存在 O(1)
  • 交集 / 并集 / 差集运算

集合是什么:不重复且无序的容器

集合(Set)就像是一个“只收独一无二物品的袋子”。你往袋子里扔东西,如果已经有相同的,袋子会自动忽略。而且袋子里的物品没有固定顺序——你扔进去的顺序和拿出来的顺序可能不一样。集合的核心特性就是:元素不重复元素无序

底层:哈希表实现

集合的底层通常用哈希表(Hash Table)实现。哈希表通过一个“哈希函数”把元素映射到一个存储位置,这样查找、插入、删除都只需要常数时间(O(1))。因为哈希表天然支持快速判断“这个元素是否存在”,所以集合能轻松保证元素不重复。你可以把哈希表想象成一个巨大的储物柜,每个元素通过哈希函数算出柜门号,直接存取。

核心操作:增删查与去重

  • 增加元素:用 add(e),如果元素已存在则什么也不做。
  • 删除元素:用 remove(e),删除指定元素。
  • 查找元素:用 contains(e)in 操作符,快速判断元素是否存在。
  • 去重:把列表转换成集合,重复元素自动消失。例如 set([1,2,2,3]) 得到 {1,2,3}

集合运算:交集、并集、差集

集合支持数学上的集合运算,非常适合处理“共同好友”、“推荐系统”等场景。

  • 交集:两个集合共有的元素,用 set1 & set2set1.intersection(set2)
  • 并集:两个集合的所有元素(去重),用 set1 | set2set1.union(set2)
  • 差集:在第一个集合但不在第二个集合中的元素,用 set1 - set2set1.difference(set2)

与数组、哈希表的区别与选用

特性集合(Set)数组(Array/List)哈希表(Map/Dict)
元素是否重复键不重复
是否有序无序有序无序(通常)
查找速度O(1)O(n)O(1)
存储内容仅元素仅元素键值对
典型用途去重、成员检查、集合运算顺序存储、索引访问键值映射、缓存

选用建议:当你只需要判断“某个东西是否存在”或“去掉重复”,用集合;当需要按顺序存储且允许重复,用数组;当需要根据键快速查找值,用哈希表。

吴师兄提示:遇到「去重 / 判断有没有出现过」就想集合。

学完练一练

把刚学的结构放进 LeetCode 题里用一次。

去图解题库实战