Chp-5 程序设计层 -7 抽象数据类型和算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

50

根节点 子节点
右子女
叶节点
左节点
这些节点中什么是唯一的 路径节点?5? 9? 7? …
51
二叉检索树
二叉检索树(BST) 二叉检索树具有语义属性,即任何节点的值都要大于 它的左子树中的所有节点的值,并且要小于它的右子树中的 所有节点的值
52
二叉检索树
Subtree的每个 节点都由左右 两个子女构成, 证明这棵树是 二叉检索树
55
二叉检索树
Trace the nodes passed as you search for 18, 8, 5, 4, 9, and 15
当你发现你各空 子树的时候有什 么特别的地方/
56
二叉检索法
Insert (current, item) If (tree is null) Put item in tree Else If (pareTo(info(current)) < 0) Insert (item, left(current)) Else Insert (item, right(current))
图 9.6 有序链式列表
21
链式实现
我们应如何实施操作?
增加项目 把一个具有info的新节点插入current 和next(current)之间 删除项目 把next(current)处的节点删除 得到下一个项目 把current设置为next(current) 多个项目 current 不等于null
43
二分检索法
图9.14 二分检索的过程
44
二分检索法
图9.1 平均比较次数
二分检索法总是较好的方法吗?
45


只能从一端访问的抽象数据类型 LIFO, 后进先出(Last In Frist Out)的缩写
插入操作叫Push ,删除操作叫Pop
请写出三个日常结构堆栈
46
队列
队列
队列中的项目从一端入,从另一端出的一种抽象数据类 型
26
无序列表
Print While (more items) Get next item Print Item Insert(item) Find where the item belongs Put the item there Increment length Know Length return length
11
逻辑实现
Think of the container as a list of items Here are the logical operations that can be applied to lists
将容器作为一列项目 适宜列出的逻辑运算 添加项目 添加项目到列表 删除项目 从名单上删除一个条目 得到下一个项目 获得(查看)下一个项目 多个项目 有更多的项目吗?
Find the item Set tempItem to first item While (pareTo(tempItem) not equal 0 Set tempItem to next item
29
排序
排序 将项目集中然后进行分类排序 排序关键 根据什么排序 排序算法 根据排序关键将项目集中记性排序的算法
38
快速排序
39
快速排序
Split Set left to first + 1 Set right to last Do Increment left until list[left] > splitVal OR left > right Decrement right until list[right] < splitVal OR left > right If (left < right) Swap list[left] and list[right] While (left <= right) Set splitPoint to right Swap list[first] and last[right]
36
快速排序
排序较少数目的项目更容易:
图 9.12 一个已经排好序的列表
Sort A…F, G…L, M…R, and S…Z and A…Z is sorted
37
快速排序
Quicksort if(there is more than one item in list[first]..list[last]) Select splitVal Split the list so that list[first]..list[splitPoint-1] <= splitVal list[splitPoint] = splitVal list[splitPoint+1]..list[last] > splitVal Quicksort the left half Quicksort the right half
27
无序列表
从应用的观点来看,如何区分有序的和无序 的列表? 算法的分解步骤必须是不同的吗?
28
其他算法步骤
Find where the items belongs (unsorted) Item belongs at the length position
Find where the items belongs (sorted) Set tempItem to the first item While (pareTo(tempItem) > 0) Set tempItem to next item Item belongs at tempItem
32
选择排序
图 9.9 选择排序的示例
33
冒泡排序
冒泡排序使用的相同策略: 查找下一个项目 放到适当的位置 但是运用了不同的策略查找下一项 从列表的最后一个元素开始,比较相邻的元素对 ,如果下面的元素小于上面的元素,就交换这两 个元素的位置
34
冒泡排序
图9.10 冒泡排序的示 例
35
算法
你可以写出选择排序和冒泡排序的算法吗? 你可以想到一种方法使冒泡排序更有效率吗?
22
链式实现
图 9.7 把info为67的节点存入current之后
23
链式实现
图 9.8 删除节点next(current)
24
列表
列表操作
自我创建 插入项目 删除项目 自我输出 知道存放的项目个数
一般数据类型(或类) 规定了操作,但却没有规定要处理的对象的类 型的数据类型
25
无序列表
Create (initialize) Set length to 0
Insert(item) Find where the item belongs Put the item there Increment length Remove(item) Find the item Remove the item Decrement length
从这三个方面描述一个文字处理器
9
数据的三个方面
复合数据类型 给定一组数据值的数据类型名称 数据结构 一种抽象数据类型中的复合数据域的实现 容器 存放和操作其他对象的对象
10
逻辑实现
两种逻辑实现的容器 基于数组的实现 用数组存储容器中的项目 链式实现 把项目和下一个项目的位置存放在一起的容器实现
你有没有玩寻宝游戏,在游戏中,每个线索 告诉你去哪里获得下一个线索?
排序为什么重要?
30
选择排序
给定一个名单,将他们按字母顺序排序 找到按字母顺序排第一的名字,把它写在另一张纸上 从原始列表中删除这个名字
继续这一循环,直到原始列表中的所有名字都被删除 ,写入了第二个列表,此时第二个列表就是有序的
31
选择排序
对手动方法稍作修改,可以免除复制空间 当从原始列表删除一个名字后,就空出了一个位置 不必把最小值写入第二个列表,把它与应该所在的位置处的 当前值交换
图 9.18 二叉检索树
53
二叉检索树
54
二叉检索树
Boolean IsThere(current, item) If (current is null) return false Else Set result to pareTo(info(current)) If (result is equal to 0) return true Else If (result < 0) IsThere(item, left(current)) Else IsThere(item, right(current))
6
数据的三个方面
逻辑(或抽象)层 是数据值和处理它们的操作集合的抽象视图 这个视图中的数据对象是具有相似的属性和行为的对象集合
7
数据的三个方面
实现层 明确表示出了存放数据项的结构,并用程序语言对 数据的操作进行编码 用明确的数据域表示对象的属性,并用代码实现的 方法进行对象的操作
8
数据的三个方面
FIFO, for First In First Out
没有标准队列术语
• Enqueue, Enque, Enq, Enter, 和 Insert 表示插入操作
• Dequeue, Deque, Deq, Delete, and Remove 表示删除操作
请写出 三个日 常结构 序列
47
栈和队列
抽象数据类型 和算法
目标
定义抽象数据类型并讨论它在算法开发中的角色 区别数据类型和数据结构 区别基于数组的实现和链式实现 区别数组和列表
2
目标
区别无序列表和有序列表 区别选择排序和冒泡排序 描述快速排序算法 对列表手动应用选择排序法、冒泡排序法和快速 排序法 应用二分检索法
3
目标
图9.15 链式结构的栈和队列
48

像列表、栈和队列这样的ADT本质上是线性的,只模拟 了一种数据关系。越复杂的关系需要越复杂的结构来表示。 你可以列举三层甚至更多的复杂结构吗?
49

二叉树 具有唯一起始节点的容器对象,其中每个节点可以有两个子 节点,根节点和每个节点之间都有且只有一条路径
一张图胜过数千个字
12
未整理容器
无序容器 容器中的项目是无序的 有序容器 在容器中某些有价值的项目领域是有序的
13
基于数组的实现
数组变量从[0] 到
[MAX-LENGTH-1]
容器中数组列表 从[0] 开始到第 [length-1]结束
1]
图9.1 一个列表
14
基于数组的实现
数组是什么? 列表是什么?
图 9.2 无序的整数列表
17
链式实现
链式实现 一节点的概念为基础 节点 一个节点有两部分数据构成
用户想存入列表的项目 指向列表中下一个节点的指针
18
链式实现
图 9.4 一个链式列表的 Figure 9.4结构图 Anatomy of a linked list
19
链式实现
图 9.5 无序链式列表
20
链式实现
40
快速排序
图 9.13 分裂算法
41
二分检索法
顺序搜索 从序列的第一个项目开始搜索,直到项目被搜索到 或者列表全部被搜索 二分检索法(有序列表) 从列表中间开始,比较操作可以找到要找的列表项 或把列表减少一半;总在目标项存在的一半中重复 此过程
再说一遍…
42
二分检索法
Boolean Binary Search (first, last) If (first > last) return false Else Set middle to (first + last)/2 Set result to pareTo(list[middle]) If (result is equal to 0) return true Else If (result < 0) Binary Search (first, middle - 1) Else Binary Search (middle + 1, last)
15
基于数组的实现
数组是什么? 列表是什么?
图9.3 有序的整数列表
16
基于数组的实现
我们应如何实施操作?
增加项目 删除项目 下一个项目 多个项目 数组中指定索引后的元素后移一个 单元,把新项目存放在索引位置 把指定索引后的元素都前移一个单 元 把用作索引的变量加1,再访问索 引位置 用作索引的变量小于length-1
区别堆栈和队列的行为 把一系列项目插入二解了它们
4
抽象数据类型
抽象数据类型 抽象数据类型是属性(数据和操作)明确地与实现分离的数 据类型
记住针对管理的复杂性最有力的工具是什么?
5
数据的三个方面
应用(或用户)层 特定问题中的数据视图 视图中的数据具有明确的属性和行为
相关文档
最新文档