c语言集合和字典的存储结构,算法与数据结构(c语言)集合与字典.ppt

算法与数据结构(c语言)集合与字典

第六章 集合与字典 目录 6.1集合及其抽象数据类型 6.1.1基本概念 6.1.2主要运算 6.1.3抽象数据类型 6.2集合的实现 6.2.1集合的位向量表示 6.2.2集合的单链表表示 6.3字典及其抽象数据类型 6.3.1基本概念 6.3.2抽象数据类型 6.4字典的顺序表示 6.4.1存储结构 6.4.2算法的实现 6.4.3有序顺序表 与二分法检索 6.5字典的散列表示 6.5.1基本概念 6.5.2散列函数 6.5.3碰撞的处理 6.5.4散列文件 6.1 集合及其抽象数据类型6.1.1 基本概念 6.1.2 主要运算 集合也可以定义测试一个元素是否存在于集合中、增加一个元素、删除一个元素等运算,但集合更加关心下面的一些运算。 求并集: 求交集: 求差集: 子集: A是B的子集 如果集合A是B的子集,反过来也称集合B是A的超集。 相等: 例如:若A={a,b,c},B={b,d},则有A∪B={a,b,c,d},A∩B={b},A-B={a,c}。另外,A不等于B,同时A和B相互都不是子集关系。 …… 上面集合间的运算,都可以通过增加元素、删除元素和成员测试等运算来实现。 例如: 已知集合A和B,求它们的并集,只要以集合A(或B)为基础,把集合B(或A)的元素逐个插入。 如果要求两个集合的交集,只要从A(或B)出发,检查各元素是否在B(或A)中出现,把那些也在另一个集合里出现的元素插入(初态为空集)的集合中即可。 求A与B的差集A?B时,只要以A为基础,对每个B中的元素做删除运算即可。 6.1.3 抽象数据类型 6.2 集合的实现 位向量表示 单链表表示 6.2.1 位向量表示 存储结构 算法实现 位运算 假设x和y都是8位的字符,其值分别是: X= Y= 对x和y做各种字位运算,得到的结果如下: ~x x & y x ^ y x | y x << 3 y >> 5 空集合的创建 与空顺序表的的创建类似,不同之处在于这里省略了每个集合中实际元素个数的变量: BitSet * createEmptySet (int n) 将整数index的元素插入集合 将值为index的元素插入集合S的过程,通过将位向量中下标为index的位置为1来完成: int insert (BitSet * s, int index) 将整数index的元素从集合中删除 通过将位向量中下标为index的位置为0来完成: int delete(BitSet * s, int index) 判断整数index的元素是否属于集合 通过判断位向量中下标为index的位是否为1来完成: int member(BitSet * s, int index) 集合与集合的并 利用按位的“或”运算实现: int union (BitSet * s0, BitSet * s1, BitSet * s2) 集合与集合的交 这个运算很容易通过位“与”操作实现。 int intersection(BitSet * s0, BitSet * s1, BitSet * s2) 集合与集合的差 将第一个集合与第二个集合的逆做与运算,就可以达到这个目的。 int difference(BitSet * s0, BitSet * s1, BitSet * s2) 6.2.2 单链表表示 存储结构 链表中的每个结点表示集合中的一个元素,具体方式与第二章单链表的结点struct Node类似。 不同之处在于:线性表的单链表中,link字段表示线性表元素之间的逻辑后继关系,而在这里仅仅是把属于同一集合的所有元素链接成一个整体。 因为我们讨论的是有序集,如果将集合中的所有元素按“<”关系排序构造有序链表,给集合的某些运算会带来方便。 求单链表表示集合的交集 集合的赋值 int assignLink (LinkSet s0,LinkSet s1) 赋值运算将集合s0拷贝成集合s1,注意这一运算不能简单地将s0的表头结点置成s1的表头结点,因为若这样处理,则对s1的改变将会带来s0的改变。 程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值