二分法查找

二分法查找
二分法查找

【二分查找法】

【二分查找法】

二分查找又称折半查找,它是一种效率较高的查找方法。

【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。

【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除比较困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,

则进一步查找前一子表,否则进一步查找后一子表。

重复以上过程,直到找到满足条件的记录,此时查找成功,或直到子表不存在为止,此时查找不成功。

二分查找又叫折半查找,但是有一个前提条件,就是你要查找的数据必须是按顺序储存,以关键字大小来排列的。

例如

如果是整形数组,存放0~9这10个数,数组必须按0到9(升序)或者9到0(降序)挨个储存。

如果你数组的元素之字符串,字符串的首字母就得按

a~z或者z~a挨个储存,当最高位相同时比较次高位。当你保证数组有序后,就可以开始执行二分查找了。举个例子

1,3,6,8,9,10,11,15

如果你要查找的数字是10,查找过程如下

由于一共有7个元素,比较最中间的元素,即第四个,10>9,由于是升序排列,选择9的右边三个数进行比较,,这就将比较次数缩短了一半。在右半部分再去中间元素,即11,10<11,选取11左边部分进行比较,即和10进行比较,得到要找的元素。

当然也存在找不到的情况,比如找12,先与9比,范围缩小至右半部分,跟11比,在此基础上再缩小至现有右半部分,只剩一个15,不相等,即没找到想要的元素。

这就是一个递归缩小范围的过程

C语言代码

int halfSearch(SeqList * R,int n , KeyType K ){ //在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1

int low=0,high=n-1,mid;//置当前查找区间上、下界的初值

if(R[low].key==K)

{

return 0 ;

}

while(low<=high){ //当前查找区间R[low..high]非空

mid=low+((high-low)/2);//使用(low + high) / 2 会有整数溢出的问题

if(R[mid].key==K)

{

return mid;//查找成功返回

}

if(R[mid].key>K)

high=mid-1; //继续在R[low..mid-1]中查找

else

low=mid+1;//继续在R[mid+1..high]中查找

}

return -1;//当low>high时表示查找区间为空,查找失败

}

Java代码:

/**

* 二分查找算法

*

* @param srcArray 有序数组

* @param target 被查找的元素

* @return 找到元素target的数组下标,如果没有找到则返回-1 */

public class Search {

public static int halfSearch(int[] srcArray, int target)

{

int low = 0;

int high = srcArray.length-1;

while(low <= high) {

int middle = (low + high)/2;

if(target == srcArray[middle]) {

return middle;

}else if(target

high = middle - 1;

}else {

low = middle + 1;

}

}

return -1;

}

public static void main(String[] args)

{

int[] src = new int[] {0,1, 3, 5, 7, 8, 9}; System.out.println(halfSearch(src, 8));//output 5 }

}

数据结构第7章-答案

一、单选题 C01、在一个图中,所有顶点的度数之和等于图的边数的倍。 A)1/2 B)1 C)2 D)4 B02、在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。 A)1/2 B)1 C)2 D)4 B03、有8个结点的无向图最多有条边。 A)14 B)28 C)56 D)112 C04、有8个结点的无向连通图最少有条边。 A)5 B)6 C)7 D)8 C05、有8个结点的有向完全图有条边。 A)14 B)28 C)56 D)112 B06、用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。 A)栈 B)队列 C)树 D)图 A07、用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。 A)栈 B)队列 C)树 D)图 A08、一个含n个顶点和e条弧的有向图以邻接矩阵表示法为存储结构,则计算该有向图中某个顶点出度的时间复杂度为。 A)O(n) B)O(e) C)O(n+e) D)O(n2) C09、已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是。 A)0 2 4 3 1 5 6 B)0 1 3 6 5 4 2 C)0 1 3 4 2 5 6 D)0 3 6 1 5 4 2 B10、已知图的邻接矩阵同上题,根据算法,则从顶点0出发,按广度优先遍历的结点序列是。 A)0 2 4 3 6 5 1 B)0 1 2 3 4 6 5 C)0 4 2 3 1 5 6 D)0 1 3 4 2 5 6 D11、已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是。 A)0 1 3 2 B)0 2 3 1 C)0 3 2 1 D)0 1 2 3 A12、已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是。 A)0 3 2 1 B)0 1 2 3 C)0 1 3 2 D)0 3 1 2 A13、图的深度优先遍历类似于二叉树的。 A)先序遍历 B)中序遍历 C)后序遍历 D)层次遍历 D14、图的广度优先遍历类似于二叉树的。 A)先序遍历 B)中序遍历 C)后序遍历 D)层次遍历 B15、任何一个无向连通图的最小生成树。 A)只有一棵 B)一棵或多棵 C)一定有多棵 D)可能不存在 A16、对于一个具有n个结点和e条边的无向图,若采用邻接表表示,则顶点表的大小为,所有边链表中边结点的总数为。 A)n、2e B)n、e C)n、n+e D)2n、2e C17、判断有向图是否存在回路,可以利用___算法。 A)关键路径 B)最短路径的Dijkstra C)拓扑排序 D)广度优先遍历 A18、若用邻接矩阵表示一个有向图,则其中每一列包含的“1”的个数为。 A)图中每个顶点的入度 B)图中每个顶点的出度 C)图中弧的条数 D)图中连通分量的数目

数据结构 第九章 查找 作业及答案

第九章查找 一、填空题 1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是。 2. 线性有序表(a 1,a 2 ,a 3 ,…,a 256 )是从小到大排列的,对一个给定的值k,用二分法检索 表中与k相等的元素,在查找不成功的情况下,最多需要检索次。设有100个结点,用二分法查找时,最大比较次数是。 3. 假设在有序线性表a[1..20]上进行折半查找,则比较一次查找成功的结点数为1;比较两 次查找成功的结点数为 2 ;比较四次查找成功的结点数为 ,其下标从小到大依次是 ____,平均查找长度为。 4.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素比较大小。 5. 在各种查找方法中,平均查找长度与结点个数n无关的查找方法是。 6. 散列法存储的基本思想是由决定数据的存储地址。 7. 有一个表长为m的散列表,初始状态为空,现将n(n

数据结构作业系统第七章答案

7.22③试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。注意:算法中涉及的图的基本操作必须在此存储结构上实现。 实现下列函数: Status DfsReachable(ALGraph g, int i, int j); /* Judge if it exists a path from vertex 'i' to */ /* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/ 图的邻接表以及相关类型和辅助变量定义如下:Status visited[MAX_VERTEX_NUM]; typedef char VertexType; typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; } ArcNode; typedef struct VNode { V ertexType data; ArcNode *firstarc; } VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum, arcnum; } ALGraph; Status DfsReachable(ALGraph g, int i, int j) /* Judge if it exists a path from vertex 'i' to */ /* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/ { int k; ArcNode *p; visited[i]=1; for(p=g.vertices[i].firstarc;p;p=p->nextarc) { if(p) { k=p->adjvex; if(k==j)return 1; if(visited[k]!=1)

excel模糊查找二分法详细解析(版权寥若_晨星2013)

二分法的概念 数学方面牛顿二分法 一般地,对于函数f(x),如果存在实数c,当x=c时,若f(c)=0,那么把x=c叫做函数f(x)的零点。 解方程即要求f(x)的所有零点。 假定f(x)在区间(x,y)上连续 先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2], 现在假设f(a)<0,f(b)>0,a0,则在区间(a,(a+b)/2)内有零点,(a+b)/2赋给b,从①开始继续使用中点函数值判断。 这样就可以不断接近零点。当区间小于一定值时,结束迭代过程。 通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。 从以上可以看出,每次运算后,区间长度减少一半,是线性收敛。另外,二分法不能计算复根和重根。 Excel中二分法的应用 明白了上面二分法的意思,那运用在excel中match、lookup……等的模糊查找就好理解了。但在excel中的应用又和数学方面有些不同。 一、EXCEL和数学方面二分法的不同 1、这第一点的不同是在excel中所有能模糊查找的函数的第二个参数找不到零点,所以用中间值代替。 中间值等于数组最中间那个值。 偶数数组的中间值=数据个数/2 的值=counta(数组)/2的值。 奇数数组的中间值=(数据个数+1)/2的值= counta(数组)/2+1/2的值。 2、这第二点的不同是excel中数组中包含文本值、逻辑值、错误值。这些在模糊查找时会被忽略。 3、如果不规定取数精度的话,数学方面的二分法是永远查找不到值的,只能无限循环下去,有些专家就在说二分法是错误的(这里就不做讨论),在excel里面就没有这方面的考虑。 二、Excel中二分法的具体算法 (这里就不做流程图了) Exce中的二分法也和数学牛顿二分法的查找方式一样(线性迭代),用excel的查找值(函数第一个参数)与目标值(中间值)进行比较,这里就涉及到4种情况。

9.二分法查找数据

“二分法查找数据”教学案例 一、教学设计 [教学分析]: 程序设计中经常需要进行数据的查找与存储,设计查找算法时,往往要考虑算法的实现是否方便、快捷,而引入数组的使用,及在数组中查找数据的基本方法,即顺序查找与二分法查找等。 本课是教科版《算法与程序设计》选修第三章《算法的实现》的第3节第2课时,主要要求学生在理解什么是数组,如何定义数组及给数组赋值,掌握在使用顺序法在数组中查找数据的基础上继续学习二分法查找,并比较两种基本方法查找数据的特点,由于本课是本章的学习难点,为了激发学生的学习兴趣,更好掌握二分法的算法思想,本人设计了一个“人与电脑竞猜商品价格PK”的游戏,通过该游戏让学生学习什么是二分法算法,并通过上机实现该游戏的程序,完成了本课的教学。建议使用1课时。 [教学目标]: 1. 知识目标:理解二分法查找算法思想,学会使用二分法查找解决问题。 2. 能力目标:通过学习二分法查找数据及应用,提高学生分析与解决问题的能力。 3. 情感态度与价值观:通过上机完成“人与电脑竞猜商品价格PK”等VB程序设计,让学生体验编程快乐、感受成功的喜悦。 [教学重难点]: 重点:二分法的算法基本思想及相关的程序实现。 难点:如何使用二分法在数据组中查找数据,及解决一些实际的的问题(如使用二分法求数学方程的近似解等)。 [教学策略]: “任务驱动”教学法、讲授法、讨论法、游戏体验法、案例分析法等多种教学方法的有机结合,并整合多媒体网络教学手段、课程学习网站,组织学生自主探究学习、合作交流等完成本节课的教学。 [学情分析]: 通过上一节课的学习,学生学会VB中数组的声明及与使用及顺序查找的算法思想,由于本校的学生全部来自于农村,以前从未接触程序设计,在上一节课的学习时,本人使用教材中的“英文字母的加密与解密”例子引导学生学习顺序查找算法,学习效果不甚理想,因此,本课的二分法查找的学习,本人决定不使用教材中的“英文字母的加密与解密”的例子,而采用自己设计的“人与电脑竞猜商品价格PK”的实例,让学生从玩到程序的实现及相关知识的梳理完成了本课的学习。 [教学流程] (复习数组的声明及使用) (运行事先设计的“人与电脑竞猜商品价格PK”VB程序,是一个猜1至100元内的商品价格,程序分“人猜”与“电脑猜”两部分,总分100分,猜错1次扣10分,猜对时得分最高获胜。)(同学们是如何猜价格,引入二分法查找的算法。)

数据结构习题汇编07第七章图试题

第七章图试题 一、单项选择题 1.在无向图中定义顶点的度为与它相关联的()的数目。 A. 顶点 B. 边 C. 权 D. 权值 2.在无向图中定义顶点 v i与v j之间的路径为从v i到达v j的一个()。 A. 顶点序列 B. 边序列 C. 权值总和 D. 边的条数 3.图的简单路径是指()不重复的路径。 A. 权值 B. 顶点 C. 边 D. 边与顶点均 4.设无向图的顶点个数为n,则该图最多有()条边。 A. n-1 B. n(n-1)/2 C. n(n+1)/2 D. n(n-1) 5.n个顶点的连通图至少有()条边。 A. n-1 B. n C. n+1 D. 0 6.在一个无向图中,所有顶点的度数之和等于所有边数的 ( ) 倍。 A. 3 B. 2 C. 1 D. 1/2 7.若采用邻接矩阵法存储一个n个顶点的无向图,则该邻接矩阵是一个 ( )。 A. 上三角矩阵 B. 稀疏矩阵 C. 对角矩阵 D. 对称矩阵 8.图的深度优先搜索类似于树的()次序遍历。 A. 先根 B. 中根 C. 后根 D. 层次 9.图的广度优先搜索类似于树的()次序遍历。 A. 先根 B. 中根 C. 后根 D. 层次 10.在用Kruskal算法求解带权连通图的最小(代价)生成树时,通常采用一个()辅助结构, 判断一条边的两个端点是否在同一个连通分量上。 A. 位向量 B. 堆 C. 并查集 D. 生成树顶点集合 11.在用Kruskal算法求解带权连通图的最小(代价)生成树时,选择权值最小的边的原则是该边不能 在图中构成()。 A. 重边 B. 有向环 C. 回路 D. 权值重复的边 12.在用Dijkstra算法求解带权有向图的最短路径问题时,要求图中每条边所带的权值必须是 ()。 A. 非零 B. 非整 C. 非负 D. 非正 13.在一个连通图中进行深度优先搜索得到一棵深度优先生成树,树根结点是关节点的充要条件是它至少 有()子女。

c语言二分法查找法的图形演示程序

电子实习报告 这次电子实习的目的是为了提高我们的编程能力,与上次的电工实习一样重要,要成为一名合格的大学本科毕业生,这是一个不可或缺的环节,所以我们要把握好这次机会,全力以赴,做到更好。 (一)需求分析 这次实习,每个同学的题目都不一样,这才能考验学生的水平嘛,我的题目是:编写二分法查找法的图形演示程序,用箭头跟踪指示出二分查找过程中的查找位置。当我刚拿到题目的时候,顿时吃了一惊,这也太难了,让我用二分法查找一个数还说的过去,那个我们学过,可是要用箭头跟踪指示出来可就让我大伤脑筋,用C语言绘图我们压根就没学过,我还想跟指导老师好好商量商量,让她多给点提示,可是仔细一想,要是我学过,这两个星期都花上面都不合算,这也就是实习的目的所在啊,就的现学现用,顺便培养一下我们的自学能力,真是一箭双雕啊。 接着,还是在指导老师的指点下,我先去图书馆找找相关的资料,用是碰钉子了, C语言这方面的书是少之又少,而且也是盲目的在那翻阅,见与绘图有关的书都翻翻,还是没有头绪,最后借了本C语言精彩编程。接着我又借了一本C图象处理编程,只有这两本书的紧密结合才能编出我那程序。 首先我的想法是只在Borland C++这个环境下完成,先把头绪给理清一遍,从我这题目中可以看到,要编出来主要有两大步:二分法和跟踪箭头。这二分法查找要求被查找的数据是按照某种顺序排列的有序序列,因此应该先将数据排序,再用二分法查找要查找的数据。二分法查找又称折半查找,是一种效率高的有序顺序表上的查找方法,下面讨论一下二分查找的实现方法:设顺序表存储在一维数组S中,设置三个变量low,high和mid,它们分别指向当前查找范围的下界,上界和中间位置。初始化时,令low=0,high=n-1,设置待查找数据元素的关键字为key. (1)mid=[low+high/2]. (2)比较Key与s[mid].key值的大小,若s[mid].key= Key,则查找成功, 结束查找,若s[mid].key〈Key,表明关键字为Key的记录可能在于 记录s[mid]的后半部分,修改查找范围,令下界指示变量low= mid+1, 上界指示变量high的值保持不变。若s[mid].key〉Key,表明关键字 为Key的记录只可能存在于s[mid]的前半部,修改查找范围,令high = mid-1,变量low保持不变。 (3)当前变量low与high的值,若low 〈=high,重复执行第(1)步和 第(2)步,若low 〉high,表明整个表已经查找完毕,表中不村在 关键字为的Key记录。 当然这里边也用到了冒泡排序法,所谓的冒泡排序就是指按增加或减少的顺序对一组类似的信息重新进行安排的过程。一般来说,当对信息进行排序时,只有信息中的某一小部分被用作排序的关键字,根据关键字对各元素进行比较。当必须要进行比较时,彼此交换的则是整个元素。 以上是对数据的查找方法的分析,下面就具体说说跟踪箭头的问题:

数据结构第7章习题答案

第7章 《图》习题参考答案 一、单选题(每题1分,共16分) ( C )1. 在一个图中,所有顶点的度数之和等于图的边数的 倍。 A .1/2 B. 1 C. 2 D. 4 ( B )2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的 倍。 A .1/2 B. 1 C. 2 D. 4 ( B )3. 有8个结点的无向图最多有 条边。 A .14 B. 28 C. 56 D. 112 ( C )4. 有8个结点的无向连通图最少有 条边。 A .5 B. 6 C. 7 D. 8 ( C )5. 有8个结点的有向完全图有 条边。 A .14 B. 28 C. 56 D. 112 ( B )6. 用邻接表表示图进行广度优先遍历时,通常是采用 来实现算法的。 A .栈 B. 队列 C. 树 D. 图 ( A )7. 用邻接表表示图进行深度优先遍历时,通常是采用 来实现算法的。 A .栈 B. 队列 C. 树 D. 图 ( C )8. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是 ( D )9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是 A . 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2 C. 0 4 2 3 1 6 5 D. 0 1 2 34 6 5 ( D )10. 已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是 ( A )11. 已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是 A .0 2 4 3 1 5 6 B. 0 1 3 6 5 4 2 C. 0 1 3 4 2 5 6 D. 0 3 6 1 5 4 2 ??? ? ?? ? ? ? ? ? ???????????0100011101100001011010110011001000110010011011110A .0 1 3 2 B. 0 2 3 1 C. 0 3 2 1 D. 0 1 2 3

图解数据结构4-二分法查找法

六、二分法查找(Binary Search) 如何从数组里找一个元素的位置?如果排列是无序的,我们只能从头到尾找,但如果排列是有序的,我们则可以用别的更好的方法,二分查找法就类似我们在英汉词典里找一个单词的方法。如下图所示(假如我们要查找的数字是“88”): 下面我给出了一段demo代码,来演示二分查找法比顺序查找快多少,代码为了方便起见,初始化有序表的时候填入的数字都是均匀的,而事实上数字可以不均匀。你可以调整一下代码中TABLE_SIZE的值,从500,调到5000,再调到10000,再调到30000……你会发觉两者差距越来越明显。我在第一篇的地方提到二分查找法的复杂度为Ο(logn),而顺序查找的复杂度

为Ο(n),当n越来越大时候,Ο(logn)的优势也就越来越明显,当然了,前提是“有序”,才可用二分查找法。 #include "stdio.h" #include "time.h" #define TABLE_SIZE 50000 //returns the position, -1 means failed. int SequenceSearch(int *pArray, int iArraySize, int iVal) { int i; for(i=0; i pArray[iMiddle])

数据结构-第7章习题答案教学提纲

数据结构-第7章习 题答案

第7章《图》习题参考答案 一、单选题(每题1分,共16分) (C)1. 在一个图中,所有顶点的度数之和等于图的边数的倍。 A.1/2 B. 1 C. 2 D. 4 (B)2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。 A.1/2 B. 1 C. 2 D. 4 (B)3. 有8个结点的无向图最多有条边。 A.14 B. 28 C. 56 D. 112 (C)4. 有8个结点的无向连通图最少有条边。 A.5 B. 6 C. 7 D. 8 (C)5. 有8个结点的有向完全图有条边。 A.14 B. 28 C. 56 D. 112 (B)6. 用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。 A.栈 B. 队列 C. 树 D. 图 (A)7. 用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。 A.栈 B. 队列 C. 树 D. 图

( C )8. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是 ( D )9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是 A . 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2 C. 0 4 2 3 1 6 5 D. 0 1 2 34 6 5 ( D )10. 已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是 ( A )11. 已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是 ( A )12. 深度优先遍历类似于二叉树的 A .先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历 A .0 2 4 3 1 5 6 B. 0 1 3 6 5 4 2 C. 0 1 3 4 2 5 6 D. 0 3 6 1 5 4 2 ??? ? ?? ? ? ? ? ? ???????????0100011101100001011010110011001000110010011011110A .0 1 3 2 B. 0 2 3 1 C. 0 3 2 1 D. 0 1 2 3 A .0 3 2 1 B. 0 1 2 3 C. 0 1 3 2 D. 0 3 1 2

大数据结构实验 二分查找

课程题目: 数据结构实验 学院: 班级: 姓名: 学号:

●实验题目:查找的应用 ●实验内容:二分查找 ●实验目的:掌握查找法的工作原理及应用过程,利用其工作原理完成上述实验题目中的内容。 ●实验要求:为了使学生更好的掌握与理解课堂上老师所讲的概念与原理,实验前每个学生要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可) 以便在实验课中完成老师所布置的实验内容。 ●实验学时:4学时 ●设计原理:二分查找(Binary Search) 又称折半查找,它是一种效率比较高的查找方法。但是,这种查找方法的前提是:“已经排序好的线性表”。我们的一维数组就是线性表。一位数组中的成员数据必须已经排序好了,才能用二分法来进行查找操作。排序可以是升序,也可是降序。 二分查找法也是一种通过关键字比较的查找方法。他的原理就是用关键字与被查找数据集(如一维数组)的中间位置(以下均是指下标)的数据比较。我们假设有一个20个数据的一位数组,升序。[a1,a2,a3,........,a20] 我们要查找的数据值为Key 。中间位置的计算方法为:mid=(首+尾)/2的底。“首”是指第一个数组成员的下标数组成员的下标值,“尾”在易语言自然是命令“取数组成员数(数组)”的值。“底”相当于易语言中的“取整”命令如本例mid=(1+20)/2=10.5 取底mid=10 则首先Key与数组的第10个

成员进行比较。如果Key>a10,那么我们要找的数据就可能在数组的第11到20成员之间,反之,Key #include #include #include #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量typedefstruct { int *elem; //存储空间基址 int length; //当前长度 int listsize; //当前分配的存储空间(以sizeof(ElemType)为单位) }Sqlist; void initlist_sq(Sqlist &l) { l.elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int)); l.length=0; //空表长度为0 l.listsize=LIST_INIT_SIZE; //初始存储容量

数据结构第七章参考答案

习题7 1.填空题 (1)由10000个结点构成的二叉排序树,在等概率查找的条件下,查找成功时的平均查找长度的最大值可能达到(___________)。 答案:5000.5 (2)长度为11的有序序列:1,12,13,24,35,36,47,58,59,69,71进行等概率查找,如果采用顺序查找,则平均查找长度为(___________),如果采用二分查找,则平均查找长度为(___________),如果采用哈希查找,哈希表长为15,哈希函数为H(key)=key%13,采用线性探测解决地址冲突,即d i=(H(key)+i)%15,则平均查找长度为(保留1位小数)(___________)。 答案:6,3,1.6 (3)在折半查找中,查找终止的条件为(___________)。 答案:找到匹配元素或者low>high? (4)某索引顺序表共有元素275个,平均分成5块。若先对索引表采用顺序查找,再对块元素进行顺序查找,则等概率情况下,分块查找成功的平均查找长度是(___________)。 答案:31 (5)高度为8的平衡二叉树的结点数至少是(___________)。 答案: 54 计算公式:F(n)=F(n-1)+F(n-2)+1 (6)对于这个序列{25,43,62,31,48,56},采用的散列函数为H(k)=k%7,则元素48的同义词是(___________)。 答案:62 (7)在各种查找方法中,平均查找长度与结点个数无关的查找方法是(___________)。 答案:散列查找 (8)一个按元素值排好的顺序表(长度大于2),分别用顺序查找和折半查找与给定值相等的元素,平均比较次数分别是s和b,在查找成功的情况下,s和b的关系是(___________);在查找不成功的情况下,s和b的关系是(___________)。 答案:(1)(2s-1)b=2s([log2(2s-1)]+1)-2[log2(2s-1)]+1+1 (2)分两种情况考虑,见解答。 解: (1)设所有元素的个数为n,显然有s=n*(n+1)/(2n),则 n=2s-1 设折半查找树高度为k,则前k-1层是满二叉树,最后一层的节点数为 n-(2k-1 -1) 因此,总比较次数 nb=20*1+21*2+22*3+…+2k-2*(k-1)+(n-(2k-1 -1))*k, 而 20*1+21*2+22*3+…+2k-2*(k-1)=2k-1*k-2k+1 因此 nb=2k-1*k-2k+1+(n-(2k-1-1))*k=(n+1)k-2k+1 又k=[log2n]+1,n=2s-1,所以有 (2s-1)b=2s([log2(2s-1)]+1)-2[log2(2s-1)]+1+1 (2)查找不成功,对于顺序查找有:s=n。对于折半查找,找不到的情况有n+1种,查找

用二分法求方程在区间[0,1]内的根,精确到3位有效数字

计算方法实验报告 实验内容: 用二分法求方程0sin 2=--x e x 在区间[0,1]内的根,精确到3位有效数字。 实验前预备内容: 1. 计算机基础知识 2. 熟悉变成基本思想 3. 熟悉常见基本函数 实验程序: #include #include #define eps 5e-6 #define delta 1e-6 float Bisection(float a,float b,float(*f)(float)) { float c,fc,fa=(*f)(a),fb=(*f)(b); int n=1; printf("二分次数\t\tc\t\t f(c)\n"); while(1) { if(fa*fb>0) { printf("不能用二分法求解"); break; } c=(a+b)/2,fc=(*f)(c); printf("%d\t\t%f\t\t%f\n",n++,c,fc); if(fabs(fc)

} int main(int argc,char *argv[]) { float a=0,b=1; float x; x=Bisection(a,b,f); printf("|n方程的根为%0.4f",x); return 0; }计算过程: 运行1次 根的值为:x = 0.500 运行2次 根的值为:x = 0.750 运行3次 根的值为:x = 0.875 运行4次 根的值为:x = 0.937 运行5次 根的值为:x = 0.906 运行6次 根的值为:x = 0.921 运行7次 根的值为:x = 0.914 运行8次 根的值为:x = 0.917 运行9次 根的值为:x = 0.919 运行10次 根的值为:x = 0.920 运行11次 根的值为:x = 0.921 根的最终值为:x = 0.921 Press any key to continue 最终运算结果: 根的最终值为:x = 0.921

数据结构作业系统_第七章答案

③试基于图的深度优先搜索策略写一算法, 判别以邻接表方式存储的有向图中是否存在由顶 点vi到顶点vj的路径(i≠j)。注意:算法中涉及 的图的基本操作必须在此存储结构上实现。 实现下列函数: Status DfsReachable(ALGraph g, int i, int j); /* Judge if it exists a path from vertex 'i' to */ /* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/ 图的邻接表以及相关类型和辅助变量定义如下:Status visited[MAX_VERTEX_NUM]; typedef char VertexType; typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; } ArcNode; typedef struct VNode { VertexType data; ArcNode *firstarc; } VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum, arcnum; } ALGraph; Status DfsReachable(ALGraph g, int i, int j) /* Judge if it exists a path from vertex 'i' to */ /* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/ { int k; ArcNode *p; visited[i]=1; for(p=[i].firstarc;p;p=p->nextarc) { if(p) { k=p->adjvex; if(k==j)return 1; if(visited[k]!=1)

哈希表和二分查找等高效查找法(数的Hash,串的Hash)

3349Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 22532 Accepted: 5874 Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Your program will read information about a collection of snowflakes, and search for a pair that may be identical. Each snowflake has six arms. For each snowflake, your program will be provided with a measurement of the length of each of the six arms. Any pair of snowflakes which have the same lengths of corresponding arms should be flagged by your program as possibly identical. Input The first line of input will contain a single integer n, 0 < n≤ 100000, the number of snowflakes to follow. This will be followed by n lines, each describing a snowflake. Each snowflake will be described by a line containing six integers (each integer is at least 0 and less than 10000000), the lengths of the arms of the snow ake. The lengths of the arms will be given in order around the snowflake (either clockwise or counterclockwise), but they may begin with any of the six arms. For example, the same snowflake could be described as 1 2 3 4 5 6 or 4 3 2 1 6 5. Output If all of the snowflakes are distinct, your program should print the message: No two snowflakes are alike. If there is a pair of possibly identical snow akes, your program should print the message: Twin snowflakes found. Sample Input 2 1 2 3 4 5 6 4 3 2 1 6 5 Sample Output

数据结构第8章 查找 答案

第8章查找测试题及答案一、填空题 1. 在数据的存放无规律而言的线性表中进行检索的最佳方法是顺序查找(线性查找)。 2. 线性有序表(a,a,a,…,a)是从小到大排列的,对一个给定的值k,用二分法检索表中与k相123256等的元素,在 查找不成功的情况下,最多需要检索8 次。设有100个结点,用二分法查找时,最大比较次 数是7。 3. 假设在有序线性表a[20]上进行折半查找,则比较一次查找成功的结点数为1; 比较两次查找成功的结点数为 2;比较四次查找成功的结点数为 8;平均查找长度为 3.7。 5解:显然,平均查找长度=O(logn)<5次(2)。但具体是多少次,则不应当按照公式2m来计算(即 (21×log21)/20=4.6次并不正确!)。因为这是在假设n=2-1的情况下22n推导出来的公式。应当用穷举法罗列:全部元素的查找次数为=(1+2×2+4×3+8×4+5×5)=74; ASL=74/20=3.7 !!!4.【计研 题2000】折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20, 它将依次与表中元素 28,6,12,20比较大小。 5. 在各种查找方法中,平均查找长度与结 点个数n无关的查找方法是散列查找。 6. 散列法存储的基本思想是由关键字的值决定数 据的存储地址。 7. 有一个表长为m的散列表,初始状态为空,现将n(n

二分法查找

【二分查找法】 【二分查找法】 二分查找又称折半查找,它是一种效率较高的查找方法。 【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。 【优缺点】折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除比较困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 【算法思想】首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字, 则进一步查找前一子表,否则进一步查找后一子表。 重复以上过程,直到找到满足条件的记录,此时查找成功,或直到子表不存在为止,此时查找不成功。 二分查找又叫折半查找,但是有一个前提条件,就是你要查找的数据必须是按顺序储存,以关键字大小来排列的。 例如 如果是整形数组,存放0~9这10个数,数组必须按0到9(升序)或者9到0(降序)挨个储存。 如果你数组的元素之字符串,字符串的首字母就得按

a~z或者z~a挨个储存,当最高位相同时比较次高位。当你保证数组有序后,就可以开始执行二分查找了。举个例子 1,3,6,8,9,10,11,15 如果你要查找的数字是10,查找过程如下 由于一共有7个元素,比较最中间的元素,即第四个,10>9,由于是升序排列,选择9的右边三个数进行比较,,这就将比较次数缩短了一半。在右半部分再去中间元素,即11,10<11,选取11左边部分进行比较,即和10进行比较,得到要找的元素。 当然也存在找不到的情况,比如找12,先与9比,范围缩小至右半部分,跟11比,在此基础上再缩小至现有右半部分,只剩一个15,不相等,即没找到想要的元素。 这就是一个递归缩小范围的过程 C语言代码 int halfSearch(SeqList * R,int n , KeyType K ){ //在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1

数据结构作业系统_第七章答案

数据结构作业系统_第七章答案7.22? 试基于图的深度优先搜索策略写一算法, 判别以邻接表方式存储的有向图中是否存在由顶 点vi到顶点vj的路径(i?j)。注意:算法中涉及 的图的基本操作必须在此存储结构上实现。 实现下列函数: Status DfsReachable(ALGraph g, int i, int j); /* Judge if it exists a path from vertex 'i' to */ /* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/ 图的邻接表以及相关类型和辅助变量定义如下: Status visited[MAX_VERTEX_NUM]; typedef char VertexType; typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; } ArcNode; typedef struct VNode { VertexType data; ArcNode *firstarc; } VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices;

int vexnum, arcnum; } ALGraph; Status DfsReachable(ALGraph g, int i, int j) /* Judge if it exists a path from vertex 'i' to */ /* vertex 'j' in digraph 'g'. */ /* Array 'visited[]' has been initialed to 'false'.*/ { int k; ArcNode *p; visited[i]=1; for(p=g.vertices[i].firstarc;p;p=p->nextarc) { if(p) { k=p->adjvex; if(k==j)return 1; if(visited[k]!=1) if(DfsReachable(g,k,j))return 1; } } return 0; } 7.23? 同7.22题要求。试基于图的广度优先搜索策略写一算法。实现下列函数:

相关文档
最新文档