数据结构(C语言版)第11章 文件与外部排序
《数据结构C语言版》----第11章

ASL
n
i=1
Pi × C
i
其中,Pi是要查找数据元素出现的概率,Ci是查 找相应数据元素的比较次数。 定义要查找数据元素的结构体为:
typedef struct { KeyType key; } DataType;
11.2 静态查找表
静态查找表主要有三种结构:
顺序表
有序顺序表
索引顺序表
1.顺序表
下图所示就是一棵二叉排序树
381
12
410
9
40
394
540
35
190
476
760
146
445
600
800
二、二叉排序树的查找算法
int Search(BiTreeNode *root, DataType item) { BiTreeNode *p; if(root != NULL) { p = root; while(p != NULL) { if(p->data.key == item.key) return 1; if(item.key > p->data.key) p = p->rightChild; else p = p->leftChild; } } return 0;
索引表结构图
相关术语
完全索引表:和主表项完全相同,但只包含索引关键字和该数 据元素在主表中位置信息的索引表
二级索引表:当主表中的数据元素个数非常庞大时,按照建立 索引表的同样方法对索引表再建立的索引表。二级以上的索引 结构称作多级索引结构 等长索引表:索引表中的每个索引项对应主表中的数据元素个 数相等;反之称为不等长索引表。不等长索引表中的索引长度 可随着动态插入和动态删除过程改变,因此不仅适用于静态查 找问题,而且也适用于动态查找问题。
数据结构-_外部排序

1
5
2
3
5
9
4
5
6
7
5
7
29
9
输5
7
29
9
入 16
12
38
22
缓 49
25
57
47
52
84
66
48
冲
78
91
71
59
区
1234567 5 5 9 5 7 29 9
输5 出 缓 冲 区
注意:挑出冠军 需要进行 k-1 次 比较,此处需要 比较 3 次。 5
EXST
6 物料管理
3、多路平衡归并的实现
Algorithms and DataStructures:EXSORT
区
注意:挑出冠军
输
5
需要进行 k-1 次
出
比较,此处需要
缓
比较 3 次。
冲
区
7
EXST
8 物料管理
3、多路平衡归并的实现
Algorithms and DataStructures:EXSORT
tseck :找道时间 tla :等待时间 twm :传输时间/ 字符,n 字符数。
2
EXST
3 物料管理
2、外部排序的方法
Algorithms and DataStructures:EXSORT
1、步骤: • 生成合并段(run):读入文件的部分记录到内存 -> 在内存中进行内部排序 -> 将排好序的这些记录写入外存,形成合并段 -> 再读入该文件 的下面的记录,往复进行,直至文件中的记录全部形成合并段 为止。 7、15、19 8、11、13 16、23、31 5、12
C++语言程序设计第11章

最
升
38888
大
的
初第 第 第 第
始一 二 三 四
状趟 趟 趟 趟
态结 结 结 结
果 果果果
12
起泡排序函数模板
例10.3(10-3.h)
13
小结
排序的基本思想; 冒泡排序;
14
7
选择排序的基本思想
每次从待排序序列中选择一个关键字最小的元素, (当需要按关键字升序排列时),顺序排在已排序序列的 最后,直至全部排完。
初始状态:
[5 4 10 20 12 3]
3 [4 10 20 12 5]
3 4 [10 20 12 5]
3
4
5 [20 12 10]
... ...
第 i 次选择后,将选出的那个记录与第 i 个记录做交换。 8
5 10] 20 12 3 5 10 20] 12 3 5 10 12 20] 3
5 [3] [3
4
5 10 12 20]
6
直接插入排序
在插入排序过程中,由于寻找插入位置 的方法不同又可以分为不同的插入排序 法,这里我们只介绍最简单的直接插入 排序法。
例10.1 直接插入排序函数模板(10-1.h)
在排序过程中需要完成两种基本操作: 比较两个数的大小 调整元素在数组中的位置
3
内部排序与外部排序
内部排序:待排序的数据元素存放在计 算机内存中进行的排序过程。
外部排序:待排序的数据元素数量很大, 以致内存存中一次不能容纳全部数据, 在排序过程中尚需对外存进行访问的排 序过程。
4
内部排序方法
C++语言程序设计
第十一章 群体数据的组织
本章主要内容
文件外部排序与外部搜索

直接存取文件 (Direct Access File)
•
•
•
又叫散列文件。利用散列技术组织文件。处理 类似散列法,但它是存储在外存上的。 文件记录的逻辑顺序与物理顺序不一定相同。 通过记录的关键码可直接确定该记录的地址。 使用散列函数把关键码集合映射到地址集合时, 往往会产生地址冲突,处理冲突有两种处理方 式: 按桶散列 可扩充散列
7
•
•
•
在磁带设备上读写一块信息所用时间 tIO = ta + tb 其中,ta 是延迟时间,即读写磁头到达待读写 块开始位臵所需花费的时间,它与当前读写磁 头所在位臵有关。tb是对一个块进行读写所用 时间,它等于数据传输时间加上IBG时间。 磁带设备只能用于处理变化少,只进行顺序存 取的大量数据。
12
2. 选定盘片组后再选定某个柱面,并移动动 臂把磁头移到此柱面上。这是机械动作, 速度较慢。这称为“寻查(seek)”。 3. 选定柱面后,要进一步确定磁道,即确定 由哪个读写磁头读写,由电子线路实现。 4. 确定磁道后,还要确定所要读写数据在磁 盘上的位臵(如在哪一个扇区)。这实际 上就是在等待要读写的扇区转到读写磁头 下面。这是机械动作。这段时间一般称为 旋转延迟(rotational delay)时间。 5. 真正进行读写时间。
经过时间 物理记录
传输完成
停止位臵
IBG 0.3~0.75英寸
IBG 0.3~0.75英寸
6
•
•
如果每个逻辑记录是 80个字符,IRG为 0.75英 寸,则对存储密度为 1600BPI 的磁带,一个 逻辑记录仅占 80/1600 = 0.05英寸。每传输一 个逻辑记录磁带走过 0.05英寸,接着磁带要走 过一个IRG占0.75英寸。结果大部分时间都花 费在走空带上,存储利用率只有1/16。 如果将若干逻辑记录存放于一个块,将IRG变 成IBG,可以提高存储利用率。例如,将50个 有80个字符的逻辑记录放在一个块内,此块的 长度将达到5080/1600 = 2.5英寸,存储利用率 达到0.77。因此在磁带上采用按块读写。
第十一章 外部排序

2
b1 9 9 18 20 . b2 20
3 4
b4 12 12 37 48 .
10
10 15 16 .
20 22 40 .ຫໍສະໝຸດ §11.4 置换-选择排序
• 问题: 是否可以不用内部排序构造初始归并段? • 例:若初始文件含有24个记录,其的关键字为: 51,49,39,46,38,29,14,61,15,1,48,52, 3,63,27,4,1389,24,46,58,33,76。 假设内存工作区可容纳6个记录,则可得如下4个初始 归并段: • RUN1:29,38,39,46,49,51 • RUN2:1,14,15,30,48,61 • RUN3:3,4,13,27,52,63 • RUN4:24,33,46,58,76,89
§11.3 多路平衡归并的实现
• 例:
3 1
胜利者
失败者
0
b0 b3 6 6 15 25
.
2
b1 9 9 18 20 . b2 20
4
b4 12 12 37 48 .
10
10 15 16 .
20 22 40 .
§11.3 多路平衡归并的实现
• 例:
1 3 0 1
胜利者
失败者
4 0
b0 b3 15 15 25
15,30,1,48,52,3,63,27,4,… 30,1,48,52,3,63,27,4,…
30,1,48,52,3,63,27,4,… 1,48,52,3,63,27,4,… 48,52,3,63,27,4,… 52,3,63,27,4,…
FO
29,38,39,46,49,51,61
WA
48,1,15,30,52,14 3,63,27,4,…
数据结构-文件与外部排序

2 记录的插入
首先根据待插入记录的关键字查找到相应位置;然 后将该磁道中插入位置及以后的记录后移一个位置(若 溢出,将该磁道中最后一个记录存入同一柱面的溢出区, 并修改磁道索引) ;最后将记录插入到相应位置。
3 记录的删除
只需找到要删除的记录,对其做删除标记,不移动 记录。当经过多次插入和删除操作后,基本区有大量被 删除的记录,而溢出区也可能有大量记录,则周期性地 整理ISAM文件,形成一个新的ISAM文件。
2 文件的有关操作
文件是由大量记录组成的线性表,因此,对文件的 操作主要是针对记录的,通常有:记录的检索、插入、 删除、修改和排序,其中检索是最基本的操作。
⑴ 检索记录
根据用户的要求从文件中查找相应的记录。 ① 查找下一个记录:找当前记录的下一个逻辑记录; ② 查找第k个记录:给出记录的逻辑序号,根据该序 号查找相应的记录; ③ 按关键字查找:给出指定的关键字值,查找关键字 值相同或满足条件的记录。对数据库文件,有以下四 种按关键字查找的方式:
图11-1 索引结构的基本形式
对于稠密索引,可以根据索引项直接查找到记录的 位置。若在索引表中采用顺序查找,查找时间复杂度为 O(n) ;若采用折半查找,查找时间复杂度为O(㏒2n) 。 对于稠密索引,索引项数目与数据表中记录数相同, 当索引表很大时,检索记录需多次访问外存。 对于非稠密索引,查找的基本思想是: 首先根据索引找到记录所在块,再将该块读入到内 存,然后再在块内顺序查找。 平均查找长度由两部分组成:块地址的平均查找长 度Lb,块内记录的平均查找长度Lw,即ASLbs=Lb+Lw 若将长度为n的文件分为b块,每块内有s个记录,则 b=n/s 。设每块的查找概率为1/b,块内每个的记录查找 概率为1/b,则采用顺序查找方法时有:
c数据结构h11

长度为l的子文件或段,依次读入内存并利用有效的内部排 序方法对它们进行排序,并将排序后得到的有序子文件重 新写入外存,通常这些有序子文件称为归并段或顺串(run); 然后对这些归并段进行逐趟归并,使归并段逐渐由小变大, 直至得到整个有序文件为止。 假设有一个10000个记录的文件,首先通过10次内部 排序得到10个初始归并段R1~R10,其中每一段都含1000 个记录。然后对它们作如下的两两归并,直至得到一个有 序文件为止。 R1 R2 R1’ R1’’ R1’’’ 有序文件 R3 R2’ R4 R5 R3’ R2’’ R6 R7 R4’ R8 R9 R5’ R3’’ R2’’’ R10
一个10 500*10ms + 4*14ms = 5056 ms。 由此可见,要想提高外排的效率关键在于减少外存信 息读写的次数d。 若对上例采用5-路平衡归并,则可以得到下图,此时 只需进行两趟归并,外排时总的读/写次数便减少为2×100 +100=300。 R1 R2 R3 R1’ 有序文件 R4 R5 R6 R7 R8 R2’ R9 R10
数据结构( 语言描述 语言描述) 数据结构(C语言描述)
11.1外部排序 外部排序
是对大文件的排序,即待排序的记录存储在外存 储器上。
1。外存信息的存取 。
磁带:顺序存取,主要用于处理变化少,只进行 顺序存取的大量数据。 磁盘:随机存取。读取时间包括寻道时间、等待 时间和传输时间。
2。外部排序的方法 。
由上图可见,由10个初始归并段得到一个有序文件,共 进行了四趟归并,该法称为2-路平衡归并。 对于外部排序一般情况下所需的总的时间为: 内部排序(产生初始归并段)所需时间 m * tis +外存信息读写的时间 d * tio +内部归并所需的时间 s * utmg 其中,tis是得到一个初始归并段进行内部排序所需时间 的均值;tio是进行依次外存读或写时间的均值;utmg是 对u个记录进行内部归并所需的时间;m为经过内部排序 之后得到的初始归并段的个数;s为归并的趟数;d为总 的读/写次数。 于是对上面的10000个记录的所需的总时间为: 10 * tis + 500 * tio + 4 * 10000 tmg 其中tio一般在10ms,而10000tmg的时间为O(10000* log210000),约为140000 * 100ns = 14ms。10*tis约相当于
严蔚敏《数据结构》(第2版)章节题库-第11章 外部排序【圣才出品】

第11章 外部排序一、选择题1.下列排序算法中,其中()是稳定的。
A.堆排序,起泡排序B.快速排序,堆排序C.直接选择排序,归并排序D.归并排序,起泡排序【答案】D2.若需在O(nlog2n)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()。
A.快速排序B.堆排序C.归并排序D.直接插入排序【答案】C【解析】稳定排序有:插入排序、起泡排序、归并排序、基数排序。
不稳定排序有:快速排序、堆排序、shell排序。
时间复杂度平均为O(nlog2n)的有:归并排序、堆排序、shell排序、快速排序。
3.在下面的排序方法中,辅助空间为O(n)的是()。
A.希尔排序B.堆排序C.选择排序D.归并排序【答案】D4.下列排序算法中,占用辅助空间最多的是()。
A.归并排序B.快速排序C.希尔排序D.堆排序【解析】归并排序的辅助空间为O(n),快速排序所占用的辅助空间为O(logn),堆排序所占用的辅助空间为O(1)。
5.将两个各有N个元素的有序表归并成一个有序表,其最少的比较次数是()。
A.N B.2N-1 C.2N D.N-1【答案】A【解析】归并排序基本思想:归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。
最简单的归并是直接将两个有序的子表合并成一个有序的表。
归并排序最好情况下的复杂度为O(n)。
6.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为()排序法。
A.插入B.选择C.希尔D.二路归并【答案】A【解析】解此题需要熟知各种排序方法的基本思想。
插入排序的基本思想是:假设待排序的记录存放在数组R[0..n-1]中,排序过程的某一中间时刻,R被划分成两个子区间R[0..i-1]和R[i..n-1],其中:前一个子区间是已排好序的有序区,后一个子区间则是当前未排序的部分,不妨称其为无序区。
将当前无序区的第1个记录R[i]插入到有序区R[0..i-1]中适当的位置上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
每个控制区间存放一个或多个逻辑记录,记录是按 关键字值顺序存放在控制区间的前端,尾端存放记录的 控制信息和控制区间的控制信息,如图11-5所示。
R1 R2 … Rn
未用的 R n的 R1的 控制区间的 … 控制信息 控制信息 自由空间 控制信息
图11-5 控制区间的结构
顺序集是由B+树索引结构的叶子结点组成。每个结 点存放若干个相邻控制区间的索引项,每个索引项存放 一个控制区间中记录的最大关键字值和指向该控制区间 的指针。顺序集中的每个结点及与它所对应的全部控制 区间组成一个控制区域。 顺序集中的结点之间按顺序链接成一个链表,每个 结点又在其上层建立索引,并逐层向上按B+树的形式建 立多级索引。则顺序集中的每一个结点就是B+树的叶子 结点;在顺序集之上的索引部分称为索引集。 在VSAM文件上既可以按B+树的方式实现记录的查 找,又可以利用顺序集索引实现记录顺序查找。
◆ 若控制区域中没有空白控制空间:则开辟一个新 的控制区域,进行控制区间域分裂和相应的顺序集中 的结点分裂。也可按B+树的分裂方法进行。
2 记录的删除
先找到要删除的记录,然后将同一控制区间中比删 除记录关键字大的所有记录逐个前移,覆盖要删除的记 录。当一个控制区间的记录全部删除后,需修改顺序集 中相应的索引项。
◆ 简单匹配:查找关键字的值与给定的值相等的 记录; ◆ 区域匹配:查找关键字的值在某个区域范围内 的记录; ◆ 函数匹配:给出关键字的某个函数,查找符合 条件的记录; ◆ 组合条件匹配:给出用布尔表达式表示的多个 条件组合,查找符合条件的记录。
⑵ 插入记录
将给定的记录插入到文件的指定位置。插入是首先 要确定插入点的位置(检索记录),然后才能插入。
柱面 扇区
…
…
盘面
…
图11-2 一个磁盘组结构形式
பைடு நூலகம்
在每个柱面上,还开辟了一个溢出区,存放从该柱 面的磁道上溢出的记录。同一磁道上溢出的记录通常由 指针相链接。 ISAM文件为每个磁道建立一个索引项,相同柱面 的磁道索引项组成一个索引表,称为磁道索引,由基本 索引项和溢出索引项组成,其结构是:
关键字 指针 关键字 指针
11.2.2
索引文件
索引技术是组织大型数据库的一种重要技术,索引 是记录和记录存储地址之间的对照表。索引结构(称为 索引文件)由索引表和数据表两部分,如图11-1所示。 ◆ 数据表:存储实际的数据记录; ◆ 索引表:存储记录的关键字和记录(存储)地址之 间的对照表,每个元素称为一个索引项。 如果数据文件中的每一个记录都有一个索引项,这 种索引称为稠密索引,否则,称为非稠密索引。 对于非稠密索引,通常将文件记录划分为若干块, 块内记录可以无序,但块间必须有序。若块内记录是有 序的,称为索引顺序文件,否则称为索引非顺序文件。 对于索引非顺序文件,只需对每一块建立一个索引项。
关键字 指针 263 275 386 593 681 … … 1046 索引表 关键字 指针 263 386 681 … …
关键字 其他域 386 1046 681 263 275 … … 593 数据表
(a) 稠密索引文件
关键字 其他域 386 … … 681 263 275 索引表 数据表 (b) 非稠密索引文件
图11-1 索引结构的基本形式
对于稠密索引,可以根据索引项直接查找到记录的 位置。若在索引表中采用顺序查找,查找时间复杂度为 O(n) ;若采用折半查找,查找时间复杂度为O(㏒2n) 。 对于稠密索引,索引项数目与数据表中记录数相同, 当索引表很大时,检索记录需多次访问外存。 对于非稠密索引,查找的基本思想是: 首先根据索引找到记录所在块,再将该块读入到内 存,然后再在块内顺序查找。 平均查找长度由两部分组成:块地址的平均查找长 度Lb,块内记录的平均查找长度Lw,即ASLbs=Lb+Lw 若将长度为n的文件分为b块,每块内有s个记录,则 b=n/s 。设每块的查找概率为1/b,块内每个的记录查找 概率为1/b,则采用顺序查找方法时有:
基本索引项
溢出索引项
◆ 基本索引项:关键字域存放该磁道上的最大关键 字;指针域存放该磁道的首地址。
◆ 溢出索引项:是为插入记录设置的。关键字域存 放该磁道上溢出的记录的最大关键字;指针域存放溢 出记录链表的头指针。 在磁道索引的基础上,又为文件所占用的柱面建立 一个柱面索引,其结构是:
关键字 指针
基本区 溢出区
… R31 柱面Cn …
┇ ┇
76
┇
3760
348
┇
768
┇
2340
┇
R2340
┇
3760
3760
…
溢出区
R3760
图11-3 ISAM文件结构示意图
1 ISAM文件的检索
根据关键字查找时,首先从主索引中查找记录所 在的柱面索引块的位置;再从柱面索引块中查找磁道索 引块的位置;然后再从磁道索引块中查找出该记录所在 的磁道位置;最后从磁道中顺序查找要检索的记录。
69 124 246
22 38 12 20 24 31 69 38 …… …… 198 246
索 引 集 246 顺序集
B+ 树
212 228
6 14 8 17 12 20 控制区域
┇ ┇ ┇ 控制区间
……
203 213 233 208 218 238 数据集 212 228 246
图11-4 VSAM文件结构示意图
文件存储在外存上,通常是以块(I/O读写的基本单 位,称为物理记录)存取。 物理记录和逻辑记录之间的关系是:
① 一个物理记录存放一个逻辑记录;
② 一个物理记录包含多个逻辑记录; ③ 多个物理记录存放一个逻辑记录。 ⑶ 文件(File):大量性质相同的数据记录的集合。文 件的所有记录是按某种排列顺序呈现在用户面前,这种 排列顺序可以是按记录的关键字,也可以是按记录进入 文件的先后等。则记录之间形成一种线性结构(逻辑上 的),称为文件的逻辑结构;文件在外存上的组织方式 称为文件的物理结构。基本的物理结构有:顺序结构, 链接结构,索引结构 。
4 ISAM文件的特点
◆ 优点:节省存储空间,查找速度快; ◆ 缺点:处理删除记录复杂,多次删除后存储空间 的利用率和存取效率降低,需定期整理ISAM文件。
11.2.4 VSAM文件
VSAM(Virtual Storage Access Method,虚拟存取 方法),也是一种索引顺序文件组织方式,利用OS的虚 拟存储器功能,采用的是基于B+树的动态索引结构。 文件的存取不是以柱面、磁道等物理空间为存取单 位,而是以逻辑空间——控制区间(Control Interval)和 控制区域(Control Range)为存取单位。 一个VSAM文件由索引集、顺序集和数据集组成, 如图11-4所示。 文件的记录都存放在数据集中,数据集又分成多个 控制区间;VSAM进行I/O操作的基本单位是控制区间, 由一组连续的存储单元组成,同一文件的控制区间大小 相同;
11.2.3 ISAM文件
ISAM(Indexed Sequential Access Method,顺序索 引存取方法),是专为磁盘存取设计的一种文件组织方 式,采用静态索引结构,是一种三级索引结构的顺序文 件。图11-2是一个磁盘组的结构图。 ISAM文件由基本文 磁道 件、磁道索引、柱面索引 和主索引组成。 基本文件按关键字的 值顺序存放,首先集中存 放在同一柱面上,然后再 顺序存放在相邻柱面上; 对于同一柱面,则按盘面 的次序顺序存放。
11.2 文件的组织方式
文件的组织方式指的是文件的物理结构。
11.2.1 顺序文件
记录按其在文件中的逻辑顺序依次进入存储介质。 在顺序文件中,记录的逻辑顺序和存储顺序是一致的。 ⑴ 根据记录是否按关键字排序:可分为排序顺序文 件和一般顺序文件; ⑵ 根据逻辑上相邻的记录的物理位置关系:可分为 连续顺序文件和链接顺序文件。 顺序文件类似于线性表的顺序存储结构,比较简单, 适合于顺序存取的外存介质,但不适合随机处理。
2 文件的有关操作
文件是由大量记录组成的线性表,因此,对文件的 操作主要是针对记录的,通常有:记录的检索、插入、 删除、修改和排序,其中检索是最基本的操作。
⑴ 检索记录
根据用户的要求从文件中查找相应的记录。 ① 查找下一个记录:找当前记录的下一个逻辑记录 ; ② 查找第k个记录:给出记录的逻辑序号,根据该序 号查找相应的记录; ③ 按关键字查找:给出指定的关键字值,查找关键 字值相同或满足条件的记录。对数据库文件,有以下 四种按关键字查找的方式:
2 记录的插入
首先根据待插入记录的关键字查找到相应位置;然 后将该磁道中插入位置及以后的记录后移一个位置(若 溢出,将该磁道中最后一个记录存入同一柱面的溢出区, 并修改磁道索引) ;最后将记录插入到相应位置。
3 记录的删除
只需找到要删除的记录,对其做删除标记,不移动 记录。当经过多次插入和删除操作后,基本区有大量被 删除的记录,而溢出区也可能有大量记录,则周期性地 整理ISAM文件,形成一个新的ISAM文件。
⑷ 文件的分类
⑴ 按记录类型,可分为操作系统文件和数据库文件: ① 操作系统文件(流式文件) : 连续的字符序列 (串)的集合; ② 数据库文件: 有特定结构(所有记录的结构都相 同)的数据记录的集合。 ⑵ 按记录长度,可分为定长记录文件和不定长记录 文件: ① 定长记录文件:文件中每个记录都有固定的数 据项组成,每个数据项的长度都是固定的; ② 不定长记录文件:与定长记录文件相反。
⑶ 删除记录
从文件中删除给定的记录。记录的删除有两种情况: ① 在文件中删除第k个记录; ② 在文件中删除符合条件的记录。
⑷ 修改记录
对符合条件的记录,更改某些属性值。修改时首先 要检索到所要修改的记录,然后才能修改。