21 Set的定义和创建

简介: Set的定义和创建

Set的定义和创建

Set的概念

  • Set是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。其中,构成Set的这些对象则称为Set的元素


集合的三个特性

  • 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一
  • 互斥性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次
  • 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的


Swift里面的集合

  • Swift的集合类型写做Set,这里的Element是Set要储存的类型。不同与数组,集合没有等价的简写


创建Set

  • 使用初始化器语法来创建一个确定类型的空Set
  • 使用数组字面量创建Set
  • image.png

Set类型的哈希值

  • 为了能让类型储存在Set当中,他必须是可哈希的--就是说类型必须提供计算它自身哈希值的方法
  • 所有Swift的基础类型(比如String,Int,Double,和Bool)默认都是可哈希的,并且可以用于Set或者Dictionary的键

image.png

  • 自定义类型需要实现Hashable协议

image.png

访问和修改


Set的遍历

  • 可以使用For-In遍历Set
  • 因为Set是无序的,如果要顺序遍历Set,使用sorted()方法

image.png

访问Set

  • 使用count获取Set里元素个数
  • 使用isEmpty判断Set是否为空


image.png

添加元素

  • insert(_:)添加一个元素到Set
  • update(with:)如果已经有相等的元素,替换为新元素。如果Set中没有,则插入


image.png


移除元素

  • filter(_:)返回一个新的Set,新Set的元素是原始Set符合条件的元素


image.png


  • remove(_:)从Set当中移除一个元素,如果元素是Set的成员就移除它,并且返回移除的值,如果合集没有这个成员就返回nil
  • removeAll()移除所有元素

image.png

  • removeFirst()移除Set的第一个元素,因为Set是无序的, 所以第一个元素并不是放入的第一个元素


image.png


执行Set计算和判断

基本Set操作


image.png


基本Set操作的定义

  • intersection(_:)交集,由属于A且属于B的相同元素组成的集合,记作A∩B(或B∩A)
  • union(_:)并集,由所有属于集合A或属于集合B的元素所组成的集合,记作A∪B(或B∪A)
  • symmetricDifference(_:)对称差集,集合A与集合B的对称差集定义为集合A与集合B中所有不属于A∩B的元素的集合
  • subtracting(_:)相对补集,由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记作A-B或A\B


image.png


Set判断方法

  • isSubset(of:)判断是否是另一个Set或者Sequence的子集
  • isSuperset(of:)判断是否是另一个Set或者Sequence的超集
  • isStrictSubset(of:)和isStrictSuperset(of:)判断是否是另一个Set的子集或者超集,但是又不等于另一个Set
  • isDisjoint(with:)判断两个Set是否有公共元素,如果没有返回true,如果有返回false


image.png


实现自己的集合算法

  • 给定一个集合,返回这个集合所有的子集
  • 思路:解这道题的思想本质上就是元素选与不选的问题,于是我们就可以想到用二进制来代表选与不选的情况。”1“代表这个元素已经选择,而”0“代表这个元素没有选择。假如三个元素A B C,那么101就代表B没有选择,所以101代表的子集为AC


image.png

//上方的方法名定义应为funcgetSubsetsOfSet<T>(_set: Set<T>) ->Array<Set<T>> {}
//上面方法的限制, set.count如果超出64位//则就超出所以平台限制


思路:如果只有一个元素,那么它的子集有两个,分别是本身和空集,然后在已经有一个元素的子集的基础上,第二个元素有两种选法,那就是加入到前面的子集里面或者不加入到前面的子集里面,也就是选与不选的问题。而前面的子集一共有两个,对每一个子集都有来自于下一个元素的加入和不加入两种选法。那么就可以得出两个元素的子集一共有四个。以此类推,就可以得出n的元素所有子集(这里n个元素的子集一共有2n个,非空子集一共有2n-1个)


image.png


//上面方法名修正funcgetSubsets2<T>(_set: Set<T>) ->Array<Set<T>> {}
funcgetSubsets3<T>(_elements: Array<T>, index: Int, count:Int) ->Array<Set<T>>{}


练习

  • 将思路二的递归改成迭代


底层实现探究


从Set的insert说起


image.png

_NativeSet的find方法


image.png

HashTable


image.png


image.png

线性探测的开放寻址法


image.png

_NativeSet的insertNew


image.png

HashTable的insertNew


image.png

_NativeSet的uncheckedInitialize


image.png







目录
相关文章
TypeError: Cannot set properties of undefined (setting ‘resdata‘),res定义数据出现的问题,定义的方法用this换成that
TypeError: Cannot set properties of undefined (setting ‘resdata‘),res定义数据出现的问题,定义的方法用this换成that
|
SQL 分布式计算 DataWorks
使用`SET`语句来定义变量并为其赋值
使用`SET`语句来定义变量并为其赋值
242 4
|
SQL 分布式计算 DataWorks
可以使用SET语句来定义变量并为其赋值
可以使用SET语句来定义变量并为其赋值
66 2
|
C++ 容器
<C++>快速掌握set 容器|去重的底层原因|使用仿函数定义排序规则(下)
<C++>快速掌握set 容器|去重的底层原因|使用仿函数定义排序规则
208 0
|
C++ 容器
<C++>快速掌握set 容器|去重的底层原因|使用仿函数定义排序规则(上)
<C++>快速掌握set 容器|去重的底层原因|使用仿函数定义排序规则
232 0
|
1月前
|
存储 JavaScript 前端开发
Set、Map、WeakSet 和 WeakMap 的区别
在 JavaScript 中,Set 和 Map 用于存储唯一值和键值对,支持多种操作方法,如添加、删除和检查元素。WeakSet 和 WeakMap 则存储弱引用的对象,有助于防止内存泄漏,适合特定场景使用。
|
2月前
|
存储 Java API
【数据结构】map&set详解
本文详细介绍了Java集合框架中的Set系列和Map系列集合。Set系列包括HashSet(哈希表实现,无序且元素唯一)、LinkedHashSet(保持插入顺序的HashSet)、TreeSet(红黑树实现,自动排序)。Map系列为双列集合,键值一一对应,键不可重复,值可重复。文章还介绍了HashMap、LinkedHashMap、TreeMap的具体实现与应用场景,并提供了面试题示例,如随机链表复制、宝石与石头、前K个高频单词等问题的解决方案。
37 6
【数据结构】map&set详解
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
36 1
|
2月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
36 5
|
2月前
|
存储 JavaScript 前端开发
js的map和set |21
js的map和set |21

热门文章

最新文章

下一篇
无影云桌面