Python及C++中的集合


1. Python 中的集合(set

1.1 特性

  • 无序性:集合中的元素没有顺序,不能通过索引访问。
  • 唯一性:集合中的元素不能重复,如果尝试添加重复的元素,集合会自动忽略。
  • 可变性:集合是可变的,可以添加或删除元素。
  • 基于哈希表实现:集合的底层是哈希表,因此查找、插入和删除操作的平均时间复杂度都是 O(1)

1.2 创建集合

# 创建空集合
my_set = set()

# 通过列表创建集合
my_set = set([1, 2, 3, 4, 4])  # 结果为 {1, 2, 3, 4},自动去重

1.3 常见操作

  • 添加元素
    my_set.add(5)  # 添加一个元素
    
  • 删除元素
    my_set.remove(3)  # 删除元素 3,如果元素不存在会抛出 KeyError
    my_set.discard(3)  # 删除元素 3,如果元素不存在不会报错
    
  • 查找元素
    if 2 in my_set:
        print("2 is in the set")
    
  • 集合运算
    • 并集
      set1 = {1, 2, 3}
      set2 = {3, 4, 5}
      union_set = set1.union(set2)  # 或者 set1 | set2
      print(union_set)  # 输出 {1, 2, 3, 4, 5}
      
    • 交集
      intersection_set = set1.intersection(set2)  # 或者 set1 & set2
      print(intersection_set)  # 输出 {3}
      
    • 差集
      difference_set = set1.difference(set2)  # 或者 set1 - set2
      print(difference_set)  # 输出 {1, 2}
      
    • 对称差集
      symmetric_difference_set = set1.symmetric_difference(set2)  # 或者 set1 ^ set2
      print(symmetric_difference_set)  # 输出 {1, 2, 4, 5}
      

1.4 应用场景

  • 去重:将列表转换为集合可以快速去除重复元素。
  • 快速查找:利用集合的 O(1) 查找特性,可以高效地判断某个元素是否存在。
  • 集合运算:用于处理集合之间的并集、交集、差集等操作,常用于图论、组合数学等问题。

2. C++ 中的集合(std::setstd::unordered_set

2.1 std::set

  • 特性
    • 有序性:集合中的元素会自动按照升序排列。
    • 唯一性:集合中的元素不能重复。
    • 基于红黑树实现:查找、插入和删除操作的时间复杂度为 O(log n)
  • 创建集合
    #include <set>
    std::set<int> my_set;
    
  • 常见操作
    • 添加元素
      my_set.insert(5);
      
    • 删除元素
      my_set.erase(3);
      
    • 查找元素
      if (my_set.find(2) != my_set.end()) {
          std::cout << "2 is in the set" << std::endl;
      }
      
    • 遍历集合
      for (int num : my_set) {
          std::cout << num << " ";
      }
      

2.2 std::unordered_set

  • 特性
    • 无序性:集合中的元素没有顺序。
    • 唯一性:集合中的元素不能重复。
    • 基于哈希表实现:查找、插入和删除操作的平均时间复杂度为 O(1)
  • 创建集合
    #include <unordered_set>
    std::unordered_set<int> my_unordered_set;
    
  • 常见操作
    • 添加元素
      my_unordered_set.insert(5);
      
    • 删除元素
      my_unordered_set.erase(3);
      
    • 查找元素
      if (my_unordered_set.find(2) != my_unordered_set.end()) {
          std::cout << "2 is in the set" << std::endl;
      }
      

2.3 应用场景

  • 快速查找std::unordered_set 的 O(1) 查找特性适合需要快速判断元素是否存在的场景。
  • 有序操作std::set 的有序特性适合需要对元素进行排序或二分查找的场景。
  • 去重:两种集合都可以用于去除重复元素。

3. 总结

  • Python 的 set
    • 无序、唯一、基于哈希表实现。
    • 查找、插入、删除操作的平均时间复杂度为 O(1)。
    • 适合快速查找、去重和集合运算。
  • C++ 的 std::set
    • 有序、唯一、基于红黑树实现。
    • 查找、插入、删除操作的时间复杂度为 O(log n)。
    • 适合需要有序操作的场景。
  • C++ 的 std::unordered_set
    • 无序、唯一、基于哈希表实现。
    • 查找、插入、删除操作的平均时间复杂度为 O(1)。
    • 适合快速查找和去重。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱看烟花的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值