《刘大有数据结构》 chapter 10 查找
(完整word版)《数据结构》习题集:第9章_查找

(完整word版)《数据结构》习题集:第9章_查找第九章查找1.若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为( )A. 1,2,3B. 9,5,2,3C. 9,5,3D. 9,4,2,32.设二叉排序树中有n个结点,则在二叉排序树的平均平均查找长度为()。
A. O(1)B. O(log2n) C. O(n) D. O(n2) 5.设有序表中有1000个元素,则用二分查找查找元素X最多需要比较()次。
A. 25B. 10C. 7D. 16.顺序查找不论在顺序线性表中还是在链式线性表中的时间复杂度为()。
A. O(n)B. O(n2)C. O(n1/2)D. O(1og2n) 8.()二叉排序树可以得到一个从小到大的有序序列。
A. 先序遍历B.中序遍历C. 后序遍历D. 层次遍历9.设一组初始记录关键字序列为(13,18,24,35,47,50,62,83,90,115,134),则利用二分法查找关键字90需要比较的关键字个数为()。
A. 1B. 2C. 3D. 410.设某散列表的长度为100,散列函数H(k)=k % P,则P通常情况下最好选择()。
A. 99B. 97C. 91D. 9311.在二叉排序树中插入一个关键字值的平均时间复杂度为()。
A. O(n)B. O(1og2n) C. O(nlog2n) D. O(n2)12.设一个顺序有序表A[1:14]中有14个元素,则采用二分法查找元素A[4]的过程中比较元素的顺序为( )。
A. A[1],A[2],A[3],A[4]B.A[1],A[14],A[7],A[4]C.A[7],A[3],A[5],A[4]D. A[7],A[5] ,A[3],A[4]13.设散列表中有m个存储单元,散列函数H(key)= key % p,则p最好选择()。
A. 小于等于m的最大奇数B.小于等于m的最大素数C. 小于等于m的最大偶数D. 小于等于m的最大合数14.设顺序表的长度为n,则顺序查找的平均比较次数为()。
《刘大有数据结构》 chapter 1 绪论

数据元素是组成数据的基本单位,在不同情况 数据元素是组成数据的基本单位, 是组成数据的基本单位 下,数据元素可以有元素、结点或者顶点等不 数据元素可以有元素、 同的名称。一个数据元素可以由若干个域(或 同的名称。一个数据元素可以由若干个域( 曰字段)组成。 曰字段)组成。
数据结构指的是数据之间的相互关系,它主要包含 数据结构指的是数据之间的相互关系, 指的是数据之间的相互关系 三部分内容: 三部分内容: (1)数据的逻辑结构,也就是数据元素之间的逻 )数据的逻辑结构, 辑关系。 辑关系。 (2)数据的存储结构,也就是数据元素及其相互 )数据的存储结构, 关系(逻辑结构)在存储器中的实现方式。 关系(逻辑结构)在存储器中的实现方式。 ( 3 ) 对数据需要施加的操作。 对数据需要施加的操作。 主要包括:查找、插入、删除、修改和排序等。 主要包括:查找、插入、删除、修改和排序等。
赋给变量Width的新值 无 将矩形的宽度值修改为新值 无 矩形宽度值被修改 无 无 计算矩形面积 返回矩形面积值 无 无 无 计算矩形周长 返回矩形周长值 无
1.3 算法概念和算法描述语言
让计算机完成解题任务,除了要选取适当的数 让计算机完成解题任务, 据结构外,还需要我们制定出解决问题的切实 据结构外, 可行的方法和步骤,这就是所谓的计算机算法. 可行的方法和步骤,这就是所谓的计算机算法 计算机算法
1.2 面向对象程序设计 面向对象程序设计OOP与抽象数据类型 与抽象数据类型 ADT
根据面向对象程序设计的思想, 根据面向对象程序设计的思想,可以将每 种数据结构都视为一个抽象类型,它定义数据 种数据结构都视为一个抽象类型, 的组织方式,且给出数据上的基本操作, 的组织方式,且给出数据上的基本操作,这种 结构称为抽象数据类型( 结构称为抽象数据类型(Abstract Data Type, 抽象数据类型 , 简称ADT). ) 简称
数据结构答案第10章排序学习与指导 (1)

第10章排序10.1 知识点分析1.排序基本概念:(1)排序将数据元素的任意序列,重新排列成一个按关键字有序(递增或递减)的序列的过程称为排序。
(2)排序方法的稳定和不稳定若对任意的数据元素序列,使用某个排序方法,对它按关键字进行排序,若对原先具有相同键值元素间的位置关系,排序前与排序后保持一致,称此排序方法是稳定的;反之,则称为不稳定的。
(3)内排序整个排序过程都在内存进行的排序称为内排序,本书仅讨论内排序。
(4)外排序待排序的数据元素量大,以致内存一次不能容纳全部记录,在排序过程中需要对外存进行访问的排序称为外排序。
2.直接插入排序直接插入排序法是将一个记录插到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。
3.二分插入排序二分插入排序法是用二分查找法在有序表中找到正确的插入位置,然后移动记录,空出插入位置,再进行插入的排序方法。
4.希尔排序希尔排序的基本思想是:先选取一个小于n的整数d1作为第一个增量,把待排序的数据分成d1个组,所有距离为d1的倍数的记录放在同一个组内,在各组内进行直接插入排序,每一趟排序会使数据更接近于有序。
然后,取第二个增量d2,d2< d1,重复进行上述分组和排序,直至所取的增量d i=1(其中d i< d i-1 < ……< d2< d1),即所有记录在同一组进行直接插入排序后为止。
5.冒泡排序冒泡法是指每相邻两个记录关键字比大小,大的记录往下沉(也可以小的往上浮)。
每一遍把最后一个下沉的位置记下,下一遍只需检查比较到此为止;到所有记录都不发生下沉时,整个过程结束。
6.快速排序快速排序法是通过一趟排序,将待排序的记录组分割成独立的两部分,其中前一部分记录的关键字均比枢轴记录的关键字小;后一部分记录的关键字均比枢轴记录的关键字大,枢轴记录得到了它在整个序列中的最终位置并被存放好。
第二趟再分别对分割成两部分子序列,再进行快速排序,这两部分子序列中的枢轴记录也得到了最终在序列中的位置而被存放好,并且它们又分别分割出独立的两个子序列……。
《数据结构》陈慧南 第10章

n( n − 1 ) ∑i = 2 i =1
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
9.2.3 冒泡排序
(48,36,68,72,12,48,02) 48,36,68,72,12,48,02) 36,48,68,72,12,48,02) (36,48,68,72,12,48,02) 36,48,68,72,12,48,02) (36,48,68,72,12,48,02) 36,48,68,72,12,48,02) (36,48,68,72,12,48,02) 36,48,68,12,72,48,02) (36,48,68,12,72,48,02) (36,48,68,12,48,72,02) 36,48,68,12,48,72,02) 36,48,68,12,48,02,72) (36,48,68,12,48,02,72)
南京邮电大学计算机学院 陈慧南 2006年9月 2006年
序列中两个元素R 序列中两个元素 i和Rj (i<j),且Ki=Kj,若 , 排序后仍保持p(i)<p(j),即Ri 仍然排在 j之 仍然排在R 排序后仍保持 , 则称所用的排序算法是稳定的。 反之, 前 , 则称所用的排序算法是稳定的 。 反之 , 称该排序算法是不稳定的。 称该排序算法是不稳定的。 如果待排序元素总数相对于内存而言较小, 如果待排序元素总数相对于内存而言较小 , 整个排序过程可以在内存中进行, 整个排序过程可以在内存中进行 , 则称之 为内部排序; 反之, 为内部排序 ; 反之 , 如果待排序元素总数 较多, 不能全部放入内存, 较多 , 不能全部放入内存 , 排序过程中需 访问外存, 则称之为外部排序。 访问外存 , 则称之为外部排序 。 本章讨论 内部排序。 内部排序。
第10章 搜索 数据结构(北师大)C++版

令
Δpi= ∑wj-∑wj
j=i+1
h
i-1
j=l
取最小值: Δpi=min{Δpj: l≤j≤h}
以ai为根, al+1,··,ai-1为左子树 ·· ··
右转:
65
p lc
13
38
将p作lc的右子结点
49
lc
13
65
10 10
p
38
左重加左——右转
结点p左重,还要加一个左结点 不平衡
右转:将p作lc的右子结点, 将lc的右子树接成p的左子树 p 38 lc lc
13 40 13
p
10
38
10
20 4 20 40
4
右重加右——左转
结点p右重,还要加一个右结点 不平衡
45 45
12 57
不 平 衡 8
平 衡
12
20
8
20
50
60
3
11
3
11
59
同一个数组的二叉排序树和二叉平衡树
20 30 80 40 10 60 50 70
49 20 49 30 13 65 10 49 30
80 27
40 13 10 97
20
40 13
49 60 13 65
80 27
60
50 50 97 70 49 70 49
以下序列中查找元素10的过程(比较4次) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
数据结构第10章

蔡之华主讲
6 24
第一次排序:
{5
7
64}
89
6
24
第二次排序:
{5
7
89
6
24
第三次排序:
{5
7
64
89}
6
24
第四次排序:
ቤተ መጻሕፍቲ ባይዱ{5
6
7
64
89}
24
第五次排序:
{5
6
7
24
64
89}
直接插入排序过程
计算机学院 蔡之华主讲 2.希尔(shell)排序(又称缩小增量排序)
(1)基本思想:把整个待排序的数据元素分成若干个小组,对同
计算机学院
蔡之华主讲
第10章 排序
主 要 知 识 点
排序的基本概念 插入排序 选择排序 交换排序归并排序 基数排序 性能比较
计算机学院
蔡之华主讲
10.1 排序的基本概念
排序是对数据元素序列建立某种有序排列的过程,是把一个数 据元素序列整理成按关键字递增(或递减)排列的过程。 关键字是要排序的数据元素集合中的一个域,排序是以关键字 为基准进行的。 主关键字:数据元素值不同时该关键字的值也一定不同,是能 够惟一区分各个不同数据元素的关键字;不满足主关键字定义 的关键字称为次关键字。 内部排序是把待排数据元素全部调入内存中进行的排序。 外部排序是因数量太大,把数据元素分批导入内存,排好序后 再分批导出到磁盘和磁带外存介质上的排序方法。
for(m = 0; m < numOfD; m++) //共numOfD次循环 { span = d[m]; //取本次的增量值 for(k = 0; k < span; k++) //共span个小组 { //组内是直接插入排序,区别是每次不是增1而是增span for(i = k; i < n-span; i = i+span) { temp = a[i+span]; j = i; while(j > -1 && temp.key <= a[j].key) { a[j+span] = a[j]; j = j-span; } a[j+span] = temp; } } } }
数据结构第九、十章 作业答案
第九章 查找一、填空题1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是 顺序查找(线性查找) 。
2. 线性有序表(a 1,a 2,a 3,…,a 256)是从小到大排列的,对一个给定的值k ,用二分法检索表中与k 相等的元素,在查找不成功的情况下,最多需要检索 8 次。
设有100个结点,用二分法查找时,最大比较次数是 7 。
3. 假设在有序线性表a[1..20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ,其下标从小到大依次是1,3,6,8,11,13,16,19______,平均查找长度为 3.7 。
解:显然,平均查找长度=O (log 2n )<5次(25)。
但具体是多少次,则不应当按照公式)1(log 12++=n n n ASL 来计算(即(21×log 221)/20=4.6次并不正确!)。
因为这是在假设n =2m -1的情况下推导出来的公式。
应当用穷举法罗列:全部元素的查找次数为=(1+2×2+4×3+8×4+5×5)=74; ASL =74/20=3.7 !!!4.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素 28,6,12,20 比较大小。
5. 在各种查找方法中,平均查找长度与结点个数n 无关的查找方法是 散列查找 。
6. 散列法存储的基本思想是由 关键字的值 决定数据的存储地址。
7. 有一个表长为m 的散列表,初始状态为空,现将n (n<m )个不同的关键码插入到散列表中,解决冲突的方法是用线性探测法。
如果这n 个关键码的散列地址都相同,则探测的总次数是 n(n-1)/2=( 1+2+…+n-1) 。
(而任一元素查找次数 ≤n-1)8、设一哈希表表长M 为100 ,用除留余数法构造哈希函数,即H (K )=K MOD P (P<=M ), 为使函数具有较好性能,P 应选( 97 )9、在各种查找方法中,平均查找长度与结点个数无关的是哈希查找法10、对线性表进行二分查找时,要求线性表必须以 顺序 方式存储,且结点按关键字有序排列。
《数据结构教学课件》第11章.ppt
if(S.list[mid].key == x. key)
return mid;
//查找成功
else if (S.list[mid].key < x.key)
low = mid + 1;
else
high = mid - 1;
}
return -1;
//查找失败
}
算法效率分析
15 of 151
1次比较就查找成功的元素有1个(20),即中间值; 2次比较就查找成功的元素有2个(21),即1/4处(或3/4)处; 3次比较就查找成功的元素有4个(22),即1/8处(或3/8)处… 4次比较就查找成功的元素有8个(23),即1/16处(或3/16)处…
ASL
n i 1
PiCi
n i 1
1i n
(n 1) / 2
13 of 151
2.有序顺序表
有序顺序表上的查找算法主要有顺序查找和折半查找两种方法。 一、顺序查找
有序顺序表上的顺序查找算法和顺序表上的查找算法方法类同
二、二分查找(又称折半查找) 算法的基本思想:先给数据排序(例如按升序排好),形成 有序表,然后再将key与正中元素值相比,若key小,则缩小 至前半部内查找;再取其中值比较,每次缩小1/2的范围,直 内查找。
动态查找表
静态查找表
5 of 151
查找算法效率
平均查找长度:查找过程所需进行的关键字比较
次数的平均值, 其数学定义为:
n
ASL pi Ci
成功的平均 查找长度
i 1
查找的第i个数据 元素出现的概率
查找的第i个数据元素所 需的关键字比较次数
该指标是衡量查找算法效率的最主要标准,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10. 1 线性表查找 10. 2 二叉查找(搜索)树 10. 3 数字查找树
10. 4 杂凑
10. 5 (a,b)-树、B树和B+树
查找(又称检索),简单地说就是查表. 一个查找过程, 就是对于给定的变元K,去找出表中哪个记录的关键词域 之值等于K;待查找完成后有两种可能,或者查找成功, 已确定一个其关键词域之值等于K的记录之所在,或者查 找失败,即已确定关键词为K的记录不在表中. 在查找失 败之后,有时还希望把一个关键词域之值为K的新记录插 入到表中,这样的过程称为查找与插入操作. 决定查找操作的是关键词,查找是许多重要计算机程序 中最耗费时间的部分,查找算法的优劣密切关系到查找操 作的速度,从而对包含查找算法的程序的效率影响极大, 因此对查找算法应着重加以研究.
10. 2 二叉查找(搜索)树
前一节我们假定表的逻辑结构是线性结构并给出了几种 查找算法 ,数据存储在数组中;本节我们介绍二叉查找树, 该结构非常适合线性表的链接结构。 定义10.1 一棵二叉查找树(或称为二叉搜索树)是一棵可 能为空的二叉树形,一棵非空的二叉查找树中的所有结点 在中根次序下按其关键词由小到大排序,并且关键词各不 相同.
m阶Fibonacci树形,则Tm的递归定义如下: (1) 当m=0,1时,Tm为空树; (2) 当m>1时,二叉判定树的根结点是有序表中序号为Fm的 记录,根结点的左子树是与有序表R1,R2,… , RFm-1相对 应 的 二 叉 判 定 树 , 根 结 点 的 右 子 树 是 与 有 序 表 RFm+1 , RFm+2,… ,RFm+1 -1相对应的二叉判定树.
这是一个递归构造的过程,例如,T(1,10)如下图所示.
5 2
8 3
1
6
9
4
7
10
引理10.1 设算法B对n个记录的成功查找是等概率的,且对不成 功的查找也是等概率的,则成功查找的关键词比较的平均次 数 Sn=1+In/n , 不 成 功 查 找 的 关 键 词 比 较 的 平 均 次 数 Un=En/(n+1),其中In,En为T(1,n)的内、外通路长度.
2 斐波那契(Fibonacci)查找 对半查找方法对表的分划是均匀的,考虑其他的分划方法. Fibonacci 序列向我们提供了一种对半查找的替代方案: 0,1,1,2,3,5,8,13,21,34,… 这种序列可以定义为F0=0,F1=1,以及 Fj=Fj-1+Fj-2 ,j≥2 假定表中元素的个数是某个Fibonacci数减1,即n=FK-1 .不 妨设m= FK-1 ,KK=Km Fibonacci查找是把关键词K与KK作首 次比较,从而产生如下的结果: (a)K<KK ,在这种情况下,查找1到FK-1-1的子表,此时 表中元素的个数正好是一个 Fibonacci数减 1; (b)K= KK ,则查找成功; (C)K> KK,这时查找从FK-1+1到FK-1的子表,且表的元 素个数是 (FK-1) - (FK-1+1)+1=FK-FK-1-1=FK-2-1 即一个 Fibonacci数减1 .
我们现在的问题是对给定的αi 和βi ,如何决定一棵最优 (最小)加权通路长度的二叉查找树(这里所出现的问题 类似于构造Huffman树的问题).
10.1 线性表查找
1 顺序查找 查找算法中,最简单的莫过于顺序查找. 简单地说,就 是从线性表的起始结点开始,逐个检查其后继结点,或 者找到关键词Ki = K,或者以i > n(i为表中记录的下标, n为线性表的元素个数)查找失败告终. 算法SS(R,n,K.i) SS1 [初始化] i←l .Kn+1←K . SS2 [比较关键词] WHILE K≠Ki DO i←i+1 ▌
算法B(R,n,K. found) // 对半查找算法,表中元素R1,R2,…,Rn相应的关键 //词满足K1≤K2≤…≤Kn B1 [初始化] s←1 .e←n .found←false . B2 [查找] WHILE s≤e DO (i←(s+e)/2 . // 找中间元素 IF K<Ki THEN e←i-1 . IF K=Ki THEN (found←true.RETURN). IF K>Ki THEN s←i+1 )▌
二叉查找树的查找算法很容易实现,首先让变元K与根结 点的关键词进行比较,如果结果相等,则查找成功;如果K 小于根结点的关键词,则递归处理其左子树形,否则处理 其右子树形. 算法BST(T . found) BST1 [由根结点开始] P←T . found←false . BST2 [比较] WHILE P≠Λ AND NOT(found) DO CASE DO (K<KEY(P):P←LLINK(P). K>KEY(P):P←RLINK(P). K=KEY(P):found←true)▌ 设表中元素的关键词K1<K2<…<Kn,则查找成功应该终 止于Ri(内结点),而查找失败应终止在n+1个记录间隔 (或者称外结点,即Ki<K<Ki+1的情形).
查找算法主要有以下四个方面的特征: 1) 内外有别:分为内查找和外查找(同排序的内外之 分). 内查找是在内存能够容纳全部n个记录,且查找算 法能够运行. 2) 静态动态:静态查找时,表的内容不变;动态查找 时,频繁地把新记录插入到表中,或者从表中删除记录, 即表中的内容不断地变化. 3) 原词变词:原词系指用原来的关键词,变词系指使 用经过变换的关键词. 4) 数字文字:指进行比较的时候,是否用数字的性质 (这里出现的情形类似于用数字的性质进行分布排序).
3 插值查找 我们在所期望的地址(在字典的很靠后的地方)附近开 始查找,我们称这样的查找为插值查找.
假定表中记录的关键词是数字类型,且K1<K2<…<Kn 在 (K0,Kn+1)区间上呈均匀分布. 变元K给定,且K0<K<Kn+1 , 则由均匀分布的假定,我们可用线性插值来决定K的期望 地址n(K-K0)/(Kn+1-K0).
如果规定关键词比较为基本运算,顺序查找成功的平均 查找次数为(n+1)/2. 表中元素的不同排列(按元素发生的概率Pi)将影响顺 序查找算法的时间复杂性. 我们希望表中元素以其发生概率的递减次序排列. 把经常出现的元素(它的发生概率较大)自动向表的前 端移动,把不经常出现的元素自动向表的后端移动,并称 以该方式组织的表为自组织表 . MOVE-AHEAD-ONE MOVE-TO-FRONT
由定义我们看到,对二叉查找树中的任一结点P,它的左 子树中结点的关键词都小于KEY(P),而右子树中结点的 关键词都大于KEY(P),并且结点P的左右子树也都是二 叉查找树,其中KEY(P)表示结点P的关键词域.
例如下图所示的增长树就是一棵二叉查找树.
O E U
A
I
ቤተ መጻሕፍቲ ባይዱ
为讨论算法的方便性,我们设二叉查找树中结点的结构为 ( LLINK , KEY , DATA , RLINK ) , 其 中 LLINK 和 RLINK是链接字段,KEY为该结点的关键词.
算法Fibonacci (m . found) Fib1 [初始化] i←Fm .p←Fm-1 . q←Fm-2 . found←false . Fib2 WHILE i≠0 DO (IF K<Ki THEN IF q=0 THEN RETURN ELSE ( i←i-q . t←p . p←q . q←t-q ) . IF K=Ki THEN(found←true .RETURN) IF K>Ki THEN IF p=1 THEN i←0 ELSE (i←i+q . p←p-q . q←q-p ) ) ▌
2 有序表的查找 线性表查找中,如果诸记录已经按照其包含的关键词的递 增次序排好了顺序,则顺序查找就更加简便. 算法SO(R,n,K.i) SO1 [初始化] i←l .Kn+1←+∞ . SO2 [顺序与表中各元素比较] WHILE K>Ki DO i←i+l . SO3 [若未找到,设i←n+1 ] IF K≠Ki THEN i←n+1 ▌
引理10.2 对半查找二叉判定树T(s,e)的高度是log2(e-s+2) .
引理10.3 设 T(1,n)是n个结点的二叉查找判定树,则T(1, n)是n个内结点的完全平衡二叉树. 定理10.1 算法B在最坏情况下的关键词比较次数为「log2(n+ 1) ,且期望复杂性等于O(log2n) .
算法成功结束时1≤i≤n,否则i=n+1.与算法SS相比较, 对于成功的查找,算法SO与算法SS的期望复杂性相同; 而对于不成功的查找,算法SO比算法SS大约快一倍.
通过观察就能发现,当K>Ki 时,K不是K1 ,K2 ,…, Ki 中的任何一个;同样如果K<Ki ,即说明K不是Ki , Ki+1,…,Kn中任何一个元素. 基于上述观察我们给出算 法SO的三种改进方法.
对半查找过程,通常用一个二叉判定树来表示. 二叉判定树T(s,e)的递归定义如下: (1) 当e - s+10时,T(s,e)为空树; (2) 当e -s+1>0时,二叉判定树的根结点是有序表中序号为 (e+s)/2的记录,根结点的左子树是与有序表Rs,Rs+1,…, R(e+s)/2 -1相对应的二叉判定树,根结点的右子树是与有序 表R(e+s)/2+1,R(e+s)/2+2,…,Re相对应的二叉判定树.
1 对半(折半,二分)查找 对半查找(Binary Search)的基本思想是,首先K与表 中间(记录)的关键词 Kn/2比较,其结果有三种情况: (K<Kn/2 ,K= Kn/2 ,K>Kn/2 );然后根据比较结 果就能确定下一次应该到表的哪一半中去查找(或查找成 功),并对确定了的这一半重复上述过程,如此下去直到 表的长度递减为1 .