数据结构课件第八章

合集下载

数据结构耿国华高教版 第8章

数据结构耿国华高教版 第8章

顺序结构有关数据类型的定义:
#define LIST_SIZE 20
typedef struct { KeyType key;
OtherType other_data;
} RecordType; typedef struct {
RecordType
r[LIST_SIZE+1];
/* r[0]为工作单元 */
基于线性表的查找法
比较式查找法 查找的基本方法:
基于树的查找法
计算式查找法-HASH(哈希)查找法
8.2 基于线性表的查找法
具有顺序查找法、折半查找法和分块查找法三种
8.2.1 顺序查找法 顺序查找法的特点是:用所给关键字与线性表中 各元素的关键字逐个比较,直到成功或失败。 顺序结构 存储结构: 链式结构
设关键字的输入顺序为:45,24,53,12,28,90, 按上述算法生成的二叉排序树的过程:
45 45
空树 插入45
45 24
插入53
24
插入24
53
45 24 12
插入12
45 53 12 24 28
插入28
45 53 12 24 28
插入90
53 90
对同样一些元素值,如果输入的顺序不同,则所建 的二叉树形态也不同。如果将上述例子中的关键字 顺序变为:24,53,90,12,28,45,则生成的二叉排序树 为:
主关键字:如果一个关键字可以唯一标识列表中的 一个数据元素,则称其为主关键字,否则为次关键 字。当数据元素仅有一个数据项时,数据元素的值 就是关键字。
查找:根据给定的关键字值,在特定的列表中确定 一个其关键字与给定值相同的数据元素,并返回该 数据元素在列表中的位置。 在查找算法中要用到三类参量,即: ①查找对象K(找什么) ②查找范围L(在哪找) ③查找的结果(K在L中的位置) 其中①、 ②为输入参量,在函数中不可缺少。 ③为输出参量,可用函数返回值表示。

数据结构课件第八章查找优秀课件

数据结构课件第八章查找优秀课件

low
mid
high
1 2 3 4 5 6 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
low mid high 1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
查找第i个元素: n+1-i
查找失败:
n+1
iii 比较次数=5
顺序查找方法的ASL
n
对含 n个 有记录的 AS表 L , pici i1
设表中每个元 概素 率的 相 pi查 等 1n找
n
则AS L
i1
pici
1 n i ni1
1n(n1) n2
n1 2
7.2.2 折半查找
1. 折半查找的基本思想 折半查找要求查找表用顺序存储结构存放且各数 据元素按关键字有序(升序或降序)排列,也就是说 折半查找只适用于对有序顺序表进行查找。
查找——也叫检索,是根据给定的某个值,在表中确定一 个关键字等于给定值的记录或数据元素
关键字——是数据元素中某个数据项的值,它可以标识一 个数据元素
查找方法评价
查找速度
占用存储空间多少
算法本身复杂程度
平均查找长度ASL(Average Search Length):为确定记 录在表中的位置,需和给定值进行比较的关键字的个 数的期望值叫查找算法的~
7.2 静态查找
正如本章第一节所述:静态查找是指在静态查找 表上进行的查找操作,在查找表中查找满足条件的数 据元素的存储位置或各种属性。本节将讨论以线性结 构表示的静态查找表及相应的查找算法。
7.2.1 顺序查找
1. 顺序查找的基本思想

数据结构课件-第八章

数据结构课件-第八章

8.3.1 顺序查找
顺序查找思想:
从表的一端开始,逐个将记录关键字与给定的 值比较。若相等,则查找成功;若所有n 个记录的 关键字值都已比较,其关键字和给定值都不相等,则 查找失败。

若要在顺序表上进行查找,其类型定义:
typedef int KeyType; //关键字类型
typedef struct
r[0].key=k;
if (i>0) return i; return -1; }/*seq_search*/
/*监视哨*/
/*查找成功*/
while (r[i]. key!=k) i--; /*元素比较*/ /*查找失败*/
算法效率分析:
(2)在平均情况下,假定各记录的查找机会均等, 即pi=1/n ,由于找第i个记录需要比较(n-i+1)次,
{ KeyType key; // other fields; //关键字 //其它数据项
} SSTable[MAXSIZE]
算法描述如下:
int Seq_Search(SSTable r,int n,KeyType k) {/*返回关键字等于k的元素在顺序表表r中的位置, n为表中元素的个数*/ int i; i=n;
二、散列函数的构造方法 1、除留余数法是最为简单常用的一种方法,它是以表长m来除关键字,取余数 作为散列地址,即 h(key) = key%m。该方法的关键就是选取m。m一般取为略大 于元素个数的第一个素数。
2、举例:如果给出一组数据(20,30,70,14,8,12,18,60,1,11),因为 一共10个数据,那么m应该选取为略大于10的素数11, 散列函数h(key) = key%11。
0 11

数据结构(8).ppt

数据结构(8).ppt
这样通过一趟处理,把待排序记录分成以支点记录 为界的独立的两部分,前面部分记录关键字小于支点记 录关键字,后面部分记录关键字大于支点记录关键字。 然后再按上面方式对每一部分进行同样的分割排序,以 达到整个序列有序(直到每一部分的记录数为1为止)。 快速排序是采用二分法的思想进行排序的方法。 快速排序也是一种交换排序。
冒泡排序算法描述
viod Bubblesort(Sqlist *L) { ElemType temp; int i,j,flag for (i= L->length-1;i>0; --i) { flag=0; for (j=0;j<i;++j) if (L->data[j].key>L.data[j+1].key) { temp=L->data[j];L->data[j]=L->data[j+1]; L->data[j+1]=temp; //交换数据元素 flag=1; //置标识 } if (!flag) break; } }
冒泡排序(续1)
结束标志:若某遍处理无数据交换,说明已排序 好,可提前结束。 若为正序,则只需进行一趟排序,只进行n-1次关 键字比较,无记录移动。 若为逆序,则需进行n-1趟排序,需进行n(n-1)/2次 比较,并做等数量级的记录移动,算法时间复杂度为 O(n2)。 算法中可设置一标志变量flag,每一遍处理开始时, 令其为0,该遍若有数据交换,则置成1。
直接插入排序--算法分析
空间分析:需要一个记录的辅助空间。 时间分析: 1、若记录关键字已按非递减排列,每趟排序插入,只需 进行一次关键字比较,则总的比较次数为n-1。算法时间复杂 度为O(n)。 2、若关键字已按非递增排列,则对第i个记录进行查找插 入时,要比较i次,移动i+1个记录。则总的比较次数为: ∑i=(n+2)(n-1)/2=(n2+n-2)/2 (i=2..n) 移动记录数为∑(i+1)=(n+4)(n-1)/2=(n2+3n-4)/2 平均比较次数=((n2+n-2)/2+n-1)/2=n2/4+3n/4-1≈n2/4 平均移动次数=((n2+3n-4)/2)/2 =n2/2+7n/2-1≈n2/2 则直接插入排序的时间复杂度为O(n2) 直接插入排序为稳定排序。

数据结构-查找分析

数据结构-查找分析

第八章查找一、填空题1.线性有序表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表中与k相等的元素,在查找不成功的情况下,最多需要检索次。

设有100个结点,用二分法查找时,最大比较次数是。

2.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素比较大小。

3. 在各种查找方法中,平均查找长度与结点个数n无关的查找方法是。

4、对线性表进行二分查找时,要求线性表必须以方式存储,且结点按关键字排列。

5.顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为_ __次;当使用监视哨时,若查找失败,则比较关键字的次数为__ 。

6.在有序表A[1..12]中,采用二分查找算法查等于A[12]的元素,所比较的元素下标依次为____ _____。

7. 在有序表A[1..20]中,按二分查找方法进行查找,查找长度为5的元素个数是_8. 已知二叉排序树的左右子树均不为空,则_______上所有结点的值均小于它的根结点值,________上所有结点的值均大于它的根结点的值。

9、中序遍历二叉排序树得到的序列是序列(填有序或无序)。

10、从有序表(10,16,25,40,61,28,80,93)中依次二分查找40和61元素时,其查找长度分别为和。

二、单项选择题()1.在表长为n的链表中进行顺序查找,它的平均查找长度为A. ASL=n; B. ASL=(n+1)/2;C. ASL=n+1; D. ASL≈log2(n+1)-1()2.折半查找有序表(4,6,10,12,20,30,50,70,88,100)。

若查找表中元素58,则它将依次与表中比较大小,查找结果是失败。

A.20,70,30,50 B.30,88,70,50C.20,50 D.30,88,50()3.对22个记录的有序表作折半查找,当查找失败时,至少需要比较次关键字。

数据结构(c言版)课件_第八章_排序_(严蔚敏、吴伟民编_清华大学出版社)

数据结构(c言版)课件_第八章_排序_(严蔚敏、吴伟民编_清华大学出版社)

算法描述
算法评价
时间复杂度
记录移动次数
最好情况:0
最坏情况:3(n-1)
比较次数: n1 (n i) 1 (n2 n)
i 1
2
T(n)=O(n²)
空间复杂度:S(n)=O(1)
Ch8_6.c
堆排序
堆的定义:n个元素的序列(k1,k2,……kn),当且仅当 满足下列关系时,称之为堆
增量序列取法 无除1以外的公因子 最后一个增量值必须为1
8.2 交换排序
冒泡排序
排序过程
将第一个记录的关键字与第二个记录的关键字进行比较,若 为逆序r[1].key>r[2].key,则交换;然后比较第二个记录与第 三个记录;依次类推,直至第n-1个记录和第n个记录比较为 止——第一趟冒泡排序,结果关键字最大的记录被安置在最 后一个记录上
二趟排序:13 4 48 38 27 49 55 65 97 76
Ch8_3.c
希尔排序特点
子序列的构成不是简单的“逐段分割”,而是将相隔某个增 量的记录组成一个子序列
希尔排序可提高排序速度,因为 分组后n值减小,n²更小,而T(n)=O(n²),所以T(n)从总体 上看是减小了
关键字较小的记录跳跃式前移,在进行最后一趟增量为1 的插入排序时,序列已基本有序
9776
7163
6257 13
4390 27
3308
38
9173 76
7267 13
6350 27
49 30
49
927 13
7360 27
65 30
65
9370 76
2977 30 76
3初0 9第7 第 第 第 第 第 始一二三四五六 关趟趟趟趟趟趟 键 字

数据结构课程讲义8ppt课件

数据结构课程讲义8ppt课件
Knuth的统计结论是,平均比较次数和 对象平均移动次数在n1.25 与1.6n1.25之间。
希尔排序的稳定性
希尔排序是一种不稳定的排序方法。 如序列 3 2 2* 5
§3 交换排序
基本原理:每一次两两比较待排序的记录 的排序码,只要是逆序的记录对,则进行 交换,直到所有的逆序对都交换完为止。
for (i=1;i<n;i++) { temp=R[i]; j=i-1; while (j>=0&&temp.key<R[j].key) {R[j+1]=R[j];j++;} R[j+1]=temp; }
}
算法中引入附加记录temp的作用:是进入 查找循环之前,它保存了R[i]的副本,使得 不至于因记录的后移而丢失R[i]中的内容。
合。
关键字(Key) 作为排序依据的数据对象中的属性
域。
主关键字 不同的数据对象若关键字互不相同,则
这种关键字称为主关键字。
排序的确切定义 使一组任意排列的对象变成一
组按关键字线性有序的对象。 用于排序测度的关键字通常称为排序码。
排序的几个基本概念
排序算法的稳定性 判断标准:排序码相同的数据对
评价排序算法好坏的标准主要有两条:算法 执行所需要的时间和所需要的附加空间。 另外,算法本身的复杂程度也是需要考虑 的一个因素。
排序算法所需要的附加空间一般都不大,矛 盾并不突出。而排序是一种经常执行的一 种运算,往往属于系统的核心部分,因此 排序的时间开销是算法好坏的最重要的标 志。
– 排序亦称分类,是计算机进行数据处理的一 种基本运算,其功能是将一个数据元素的无 序序列调整为一个有序序列。目的是达到当 计算机中的数据经过排序后,提高工作效率

《数据结构的第八讲》PPT课件

《数据结构的第八讲》PPT课件

13
图的定义
路径长度: 非带权图的路径长度是指此路径上边的条数。 带权图的路径长度是指路径上各边的权之和。
A
从A到F长度为 3 的路径
B
E {A,B,C,F}
CF
精选ppt
14
图的定义
连通图与连通分量:
在无向图中, 若从顶点v1到顶点v2有路径, 则称顶 点v1与v2是连通的。
如果图中任意一对顶点都是连通的, 则称此图是连 通图。
构造器方法重新构建了顶点数组和在常量 NUMVERTICES中指定数值的邻接矩阵。
既然数组是基于零的,所以数据成员 numVerts存储着 顶点列表内当前的数量以便于把列表初始设置为 0。
AddVertex方法会为顶点标签取走一个字符串参数,实 例化一个新的 Vertex对象,并且把它添加到顶点数组 内。
精选ppt
22
8.2 图的存储表示
精选ppt
23
邻接矩阵(Adjacency Matrix)
在图的邻接矩阵表示中,有一个记录各个顶点 信息的顶点表,还有一个表示各个顶点之间关 系的邻接矩阵。
设图 A = (V, E)是一个有 n 个顶点的图, 图的邻 接矩阵是一个二维数组 A.edge[n][n],
(vi, vp1)、(vp1, vp2)、...、(vpm, vj) 应是属于E的边。
精选ppt
8
图的定义
路径的长度:
从路径中第一个顶点到最后一个顶点的边 的数量。
讨论的图对象的限制 : (1) 自身环 不讨论.
0
1
(2) 与两个特定顶点相关联的边不
能多于一条,多重图也不讨论。
1
0 2
精选ppt
9
图中,边必须是不同的。

数据结构与算法分析第8章简明教程PPT课件

数据结构与算法分析第8章简明教程PPT课件

8.2 线性表查找
• • • • • 8.2.1 顺序查找 1. 基本思想 2.顺序查找的存储结构要求 3.具体算法 4.算法分析
8.2 线性表查找
• 8.2.2 二分查找 • 1.基本思想
• 2.具体算法
• 3.算法分析
8.2 线性表查找
• 8.2.3 分块查找 • 分块查找又称索引顺序查找。它是把顺序查找和 二分查找相结合的一种查找方法,即把线性表分 成若干块,块和块之间有序,但每一块内的结点 可以无序。分块查找的基本思想是:先确定被查 找的结点所在的块(采用二分查找法)后,对该 块中的结点采用顺序查找。 • 分块查找介于顺序和二分查找之间,其优点是: 在表中插入或删除一个记录时,只要找到该记录 所属的块,就在该块内进行插入和删除运算。分 块查找的主要代价是增加一个辅助数组的存储空 间和将初始表分块排序的运算。
8.4散列技术
• 2.散列函数的构造 • (1) 基本思想:以记录的存储位置和关键字之间确 定一种对应关系f,使每一个关键字和结构中的 一个存储位置相对应,由此只要知道关键字K, 就可以知道关键字的记录所存放的位置f(K), 从而取得记录。 • ① 除余法 • ② 平方取中法 • ③相乘取整法 • ④随机数法
8.3 二叉排序树
• 4.算法分析 • (1)二叉排序树二叉树的形态有关 • (3)二叉排序树和二分查找的比较 • (4)平衡二叉树
8.4散列技术
• 1.散列表的概念 • (1)散列(HASH)表的定义 :若一个结点在表中的位 置和该结点的关键字之间不存在确定的关系,则 在表中查找某结点时必然要进行关键字的比较, 否则不然。 • (2)散列表的冲突现象 • ①冲突 • ②安全避免冲突的条件 • ③冲突不可能完全避免 • ④影响冲突的因素

《数据结构教学课件》第08章.ppt

《数据结构教学课件》第08章.ppt

DE F
G
HI
双亲孩子表示法存储结构
(4)孩子兄弟表示法
root
A∧
B
C∧
14 of 118
A
B
C
DE F
G
HI
∧D
E
∧F∧
∧G ∧
∧H
∧I ∧
常规指针的孩子兄弟表示法
15 of 118
8.2 二叉树
1.二叉树的定义
二叉树:是n(n≥0)个结点的有限集合。n=0的树称为空 二叉树;n>0的二叉树由一个根结点以及两棵互不相交 的、分别称为左子树和右子树的二叉树组成 。
逻辑结构: 一对二(1:2) 基本特征: ① 每个结点最多只有两棵子树(不存在度大于2的结点); ② 左子树和右子树次序不能颠倒。所以下面是两棵不同
的树
16 of 118
A
B
C
A
B
C
D
左子树
G
E
F
D
E
F
G 右子树
满二叉树:在一棵二叉树中,如果所有分支结点都存在左 子树和右子树,并且所有叶子结点都在同一层上,这样的 二叉树称为满二叉树。
完全二叉树:如果一棵深度为k,有n个结点的二叉树结构与
深度为k的满二叉树的前n个结点的结构相同,那么该二叉树
称为完全二叉树。如下图所示
A
B
C
D
E
F
G
H I J K L MN O
17 of 118
A
B
C
D
E
F
G
H IJ
(b)完全二叉树
(a)满二叉树
问题:一个深度为h的完全二叉 树最多有多少个结点?最少有 多少个结点?

数据结构 第08章 课件

数据结构 第08章 课件

删除边(i,j);
(7)Degree(i)
返回顶点i的度;
(8)InDegree(i) 返回顶点i的入度;
(9)OnDegree(i) 返回顶点i的出度;
} ADT Graph
8.1图的基本概念
8.2 图的基本运算
8.5生成树与最小生成树
8.3 图的基本存储结构 8.5.1最小生成树定义
8.3.1 邻接矩阵及其实现 8.5.2 最小生成树的普利姆算法
例:图8-2
v1
v1
v2
v3
v2
v3
v4
v4
(a)无向完全图G3(b)有向完全图G4
图8.2所示的G3与G4分别是具有4个顶点的无向 完全图和有向完全图。图G3共有4个顶点6条边;图 G4共有4个顶点12条边。
若(vi,vj)是一条无向边,则称顶点vi和vj互为 邻接点 。
若<vi,vj>是一条有向边,则称vi邻接到vj,或vj 邻接于vi,并称有向边<vi,vj>关联于vi与vj,或称有 向边<vi,vj>与顶点vi和vj相关联。
V2
V3
通常,也将图G的顶点集和边集分别记为V(G) 和E(G)。E(G)可以是空集,若E(G)为空, 则图G只有顶点而没有边。
若图G中的每条边都是有方向的,则称G为有向 图。在有向图中,一条有向边是由两个顶点组成的有 序对,有序对通常用尖括号表示。例如,有序对<vi, vj>表示一条由vi到vj的有向边。有向边又称为弧,弧 的始点称为弧尾,弧的终点称为弧头。若图G中的每 条边都是没有方向的,则称G为无向图。无向图中的 边均是顶点的无序对,无序对通常用圆括号表示。例 如,(vi,vj)表示无向图中的一条无向边。

数据结构(C语言)第八章 排序

数据结构(C语言)第八章 排序

直接插入排序过程
0 21 1 25 2 49 3 4 25* 16 5 08 temp
i=1
0 21
21
1 25
25 25
2 49
49 49
3 4 25* 16
25* 16 25* 16
5 08
08 08
temp 25
i=2
21
49
21
25
25 25
49
49 25*
25* 16
25* 16 49 16
希尔排序 (Shell Sort)

基本思想设待排序对象序列有 n 个对象, 首 先取一个整数 gap < n 作为间隔, 将全部对 象分为 gap 个子序列, 所有距离为 gap 的对 象放在同一个子序列中, 在每一个子序列中 分别施行直接插入排序。然后缩小间隔 gap, 例如取 gap = gap/2,重复上述的子序列划 分和排序工作。直到最后取 gap == 1, 将所 有对象放在同一个序列中排序为止。 希尔排序方法又称为缩小增量排序。
第八章 排序
概述
插入排序
交换排序 选择排序 归并排序 基数排序 各种内排方法比较
概 述

排序: 将一个数据元素的任意序列,重新
排列成一个按关键字有序的序列。

数据表(datalist): 它是待排序数据对象的
有限集合。

主关键字(key): 数据对象有多个属性域,
即多个数据成员组成, 其中有一个属性域可用 来区分对象, 作为排序依据,称为关键字。也 称为关键字。
直接插入排序 (Insert Sort)

基本思想 当插入第i (i 1) 个对象时, 前面的 R[0], R[1], …, R[i-1]已经排好序。这时, 用 R[i]的关键字与R[i-1], R[i-2], …的关键字顺 序进行比较, 找到插入位臵即将R[i]插入, 原 来位臵上的对象向后顺移。

数据结构课件第8章

数据结构课件第8章
,操作系统中的可利用空间表属于这种类型。 若用户需求量为n,链表中仅有一块其容量m≥n,则分割 出大小为n的部分分配给用户,剩余大小为m-n的部分作为一 个结点留在链表中(只要把size改小就行)。 问题:若空闲块链表中有若干个大小不小于n的结点,该分配 哪一个?分配策略?
三种分配策略:首次拟合法;最佳拟合法;最差拟合法。
存储管理是一个既复杂而又重要的问 题。在后续课程——操作系统和编译技术 (或方法、原理)中,将对其作较深入的 研究。在数据库技术中,也涉及大量有关 存储管理的问题。本章仅就动态存储管理 方面的一些基本技术进行讨论。
返回目录
8.1 概述
● 动态存储管理的基本问题与解决途径 动态存储管理的基本问题
(1) 如何按用户提出的“请示”分配内存? (2) 如何回收那些用户不再使用而“释放”的内存,以 备新的“请示”产生时重新进行分配?
8.2 可利用空间表及分配方法
8.2.1 可利用空间表的结构形式 ● 结构形式二:建立若干个可利用空间表,同一链表中的结点
大小相同。不同链表中的结点大小,一般成倍数关系。
tag type link
示例2 有三种大小结点 (设结点大小分 别为2,4,8个字) 的可利用空间表 的结点结构及其 可利用空间表。
18,000
分配给用户的占用块
1 7,000
8.2 可利用空间表及分配方法
8.2.2 分配策略 ● 最佳拟合法:
从空闲块链表中找出能满足用户请求容 量的最小空闲块。 显然这是一种较好的方法,但为了满足某个请示分配,需要对 空闲块链表从头至尾扫描,时间开销大。 最佳空闲块 示例5 上例,若采用最佳拟合法,则可得
8.2 可利用空间表及分配方法
8.2.2 分配策略 ● 首次拟合法:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

30
30 38 ∞
9
9
22 ∞
∞ 图8.3 选出当前最小的关键字6
胜者 Ls[0] m3 m3 Ls[1] m 1 m1 m4 Ls[2] m2 Ls[3] m0 m4 Ls[4] m 3 16 m3 16 ∞ 30 9 9 m1 22 ∞ 20 20 m2 40 90 ∞
败者 树
30 8 m 38 0 ∞ 8 m4 12 ∞
//输出
//从该段补入元素
//调整
//输出段结束标志
28
自某叶结点key[q]到败者树根结点的调整算法
void adjust () { //q指示败者树的某叶结点key[q], 从该结点起到根结点进行 比较, 将最小key元素所在归并段的段号记入Ls[0]。k是叶 结点key[0..k-1]的个数。 for ( t = (k+q) / 2; t > 0; t /= 2 ) // t是q的双亲 if ( key[Ls[t]] < key[q]) {//败者记入Ls[t], 胜者记入q
最后,段结束标志MaxNum(如图中的∞)升
入Ls[0],排序完成,输出一个段结束标志。
23
Ls[0] m3 胜者
m3
Ls[1] m1 m3 Ls[2] m0 m3 Ls[4] 6 m3
6 16 ∞
m1 m2 Ls[3] 败者树 20 m1 20 m2 40 90 ∞
24
m4 8 m4 8 12 m0
}
26
for ( i = 0; i < k; i++) Ls[i] = k;
key[k] = -MaxNum;
for ( i = k-1; i; i-- )
//初始化
//调整形成败者树
adjust ( key, Ls, k, i );
while ( key[Ls[0]] != MaxNum ) { q = Ls[0];
m/2 个归并段,以后各趟将从 l (l >1) 个归并段得到
l /2 个归并段。总归并趟数为 log2m
14
• 对 4500 个记录进行排序的例子, 各种操作的
计算时间如下:
• 产生初始归并段:
• 读 18 个输入块, 内部排序6次, 写18个输出块 =6 tIS+36 tIO
15
• 归并初始归并段 R1~R6:
22
• Ls[0]存放最后的胜者。以后每选出一个当前排
序码最小的元素,将它送入输出缓冲区,然后
从它所在的归并段输入缓冲区中取出下一个参 加归并的元素,替换已经取走的最小元素,如 图8.4最左侧叶结点(排序码为16),再从叶结 点到根结点,沿某一特定路径进行调整,将下
一个排序码最小元素的归并段号调整到Ls[0]中。
R1 第一趟 第二趟 R2 R123 R123456
18
R3
R4
R5 R345
R6
• 从上例看到好像k越大越好,但是从下面的讨
论中又看到单纯增加k将导致增加内部归并的
时间。例如对n个元素的文件,做内部k路归并 时,在k个元素中选择最小者,需要顺序比较 k-1次。每趟归并产生含有u个元素的归并段时, 需要做(u-1)*(k-1)次比较,S 趟归并总共需要
4
5
为了访问某一页块, 先寻找柱面: 活动臂使读写 磁头移到指定柱面上: 寻查(seek)。再根据盘面 号选择相应读写磁头, 等待指定页块转到读写磁 头下: 等待(latency)。传输一个字符的时间为 trw, 则在磁盘组上读写一个页块的时间:

tio=tseek+tlatency+trw
外排序主要的时间开销用在信息的内、外存交换 上,内存排序所需时间可以忽略不计,因此在外排
16

归并趟数 S= logkm 增大归并路数k, 可减少归并趟数S, 从而减 少总读写磁盘次数d。

17
8.1.2 多路平衡归并 (k-way Balanced merging) • 从8.1式可以看出增大归并路数k可以减少归 并趟数S。图8.2给出对有6个初始归并段的文 件做3路平衡归并时的归并树,可以看出只 需要归并两趟。
件也放在磁盘上, 用以存放归并结果。
8
• 由于内存中可用于排序的存储区域能容纳
750 个记录, 因此内存中恰好能存3个页块的
记录.
• 在外排序一开始, 把18块记录, 每3块一组, 读
入内存。利用某种内排序方法进行内排序,
形成初始归并段, 再写回外存。总共可得到6
个初始归并段。然后一趟一趟进行归并排序。
3


当记录以文件的形式存于磁盘上时,通常是按 物理块来存放的,物理块也叫做页块。每个页 块可存放若干个记录。操作系统是按页块对磁 盘信息进行读写。 磁盘通常是指由若干片磁盘组成的磁盘组, 各个 盘片安装在同一主轴上高速旋转。各个盘面上 半径相同的磁道构成了柱面。各盘面设置一个 读写磁头,它们装在同一活动臂上,活动臂可 以直接从一个柱面移到另一个柱面上。
• 第一趟:36 tIO+4500 tmg
•第二趟:归并两个具有 1500 个记录的归并段 R12和 R34
时间为:24 tIO+3000 tmg •第三趟:将 R1234 和 R56 归并成一个归并段 • = 36 tIO+4500 tmg 合计 tES=6 tIS+132 tIO+12000 tmg
• 失败者树:所谓败者树是一棵正则的完全二叉树, 其中每个叶结点存放当前参加比较的元素;每个 非叶结点存放其子女结点中排序码大的结点(即 败者),让二者中的小排序码去参加更上一层的 比较,当到达根结点时,根中仍存放其左、右子 中较大排序码,得到的小排序码就是目前序列的 最小排序码。 21
• 设有5个初始归并段,m0=[6,16,∞]、m1=[8,12, ∞]、m2=[30,38,∞]、m3=[9,22,∞]、m4=[20, 40,,90,∞],其中∞为段结束标志MaxNum,开始 进行5路归并,每个归并段有一个排序码参加归并,每 个非叶结点中的段号为其左、右子女中的排序码大的 元素所在的段号(败者),数组Ls存放比较过程的结 果,如图8.3中,Ls[2]=0(即段m0中的排序码为当前 的败者),每个非叶结点向上分支上的段号表示比较 过程的胜者,它将参加更高一层结点的比较。
S*(u-1)*logk = logkm* (u-1) * logk
= logm * (u-1) * logk / logk = logm * (u-1)
20
• 从得到的式子可以看出总的排序码比较次数与k 无关,也就是说总的归并时间不会随k的增大而 增大。因此,只要内存空间允许,增大归并路数 k,将有效地减少归并树深度,从而减少读写磁 盘次数d,提高外部排序的速度。
度 logm。
12
• 根据2路归并树, 估计2路归并排序时间tES的
上界为:
tES = m*tis + d*tio + s*u*tmg 其中:m是初始归并段的个数;tIS 是对一个初 始归并段进行内排序的时间的均值; d 是读/写 外存页块的总次数;tIO 是对每一个页块进行读 /写的时间;S是归并趟数;tmg是对一个记录进
的比较次数为:
• S*(u-1)*(k-1) = logkm * (u-1) * (k-1)= logm
* (u-1) * (k-1) / logk
19
• 在初始归并段个数m与元素个数u一定时, logm*(u1)是一个常数,而(k-1) / logk在k增大时趋于无穷大。 因此,增大归并路数k,会使得内部归并的时间增大。 当k增加到一定程度时,可能就抵消了由于减少读写磁 盘次数而赢得的时间。 • 当然我们还可以使用下面将要讲到的“败者树”的方 法从k个归并段中选最小者,当k较大时(k 6),用 败者树选出排序码最小的元素只需比较logk次(小于 k-1次)。此时,S趟归并总共需要的比较次数为:
计算机专业本科主干基础课
数据结构与算法
DATA STRUCTURE AND ARITHMETIC
1
第8章
外部排序
8.1 外部排序的方法
8.1.1 外部排序的方法 8.1.2 多路平衡归并 8.1.3 置换-选择排序
8.2 最佳归并树
2
8.1 外部排序的方法
8.1.1 外部排序的基本过程
待排序的记录数量巨大,无法一次将待排序的 记录全部调入内存,一部分数据只能驻留在外 存上(磁带、磁盘、CD-ROM)上。不能使用 内部排序的方法进行排序。否则将引起频繁访 问外存。
图8.3 选出当前最小的关键字8
25
void k_waymerge () { r = new Element[k]; //创建元素数组
*key = new int[k+1];
*Ls = new int[k];
//创建外结点数组
//创建败者树数组
for ( i = 0; i < k; i++ ) { //传送参选排序码 InputRecord ( r[i] ); key[i] = r[i].key;

若把内存区域等份地分为 3 个缓冲区。其中 的两个为输入缓冲区, 一个为输出缓冲区, 可 以在内存中利用简单 2 路归并函数 merge( ) 实现 2 路归并。 首先, 从参加归并排序的两个输入归并段 R1 和 R2 中分别读入一块, 放在输入缓冲区1 和 输入缓冲区2 中。然后在内存中进行 2 路归 并,归并结果顺序存放到输出缓冲区中。
9
两路归并排序的归并树
初始 归并段 第一趟 归并结果 第二趟 归并结果
R1 750 R2 750 R3 750 R4 750 R5 750 R6 750
R12
1500
R34
1500
R56
1500
R1234
相关文档
最新文档