3.7对分查找算法及程序实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对分查找的程序结构如下(升序序列):
对分查找程序的基本框架: Private Sub Command1_Click() i = 1: j = n Do While i <= j m = (i + j) \ 2 If d(m) = Key Then '输出结果,退出查找(代码略) ElseIf Key < d(m) Then j=m-1 Else i=m+1 End If Command1点击事件结束 Loop End Sub
说明:对分查找最多次数应该是log2n,取整 后加1
使用流程图描述对分查找的算法如下图所示:
源自文库
4.对分查找算法程序的实现要点 (1)由于比较次数难以确定,所以用Do语句来实现循环; (2)在Do循环体中用If语句来判断查找是否成功; (3)若查找成功则输出查找结果,并结束循环(Exit Do); (4)若查找不成功,则判断查找键在数组的左半区间还是 右半区间,从而缩小范围。
中间位置数据d(m)的下标m的计算方法:m= (i+j)\2或m=fix((i+j)/2)。以 规模为16的递增数组d为例,观察对分查找的过程。要查找的数据key为37。
J<-M-1 i<-M+1 J<-M-1 i<-M+1
D(m)=45>key=37 取小区间
D(m)=23<key=37 取大区间
5.在有序单词序列:As、Book、Door、English、Floyd、 Good、Hello、Sun中,用对分查找法找到单词“Good”所 需要的查找次数是 ( B ) A.1 B.2 C.3 D.4 6.某8位男生的肺活量数据放在数组元素a(l)到a(8)中,其数 据依次为“3205、3408、3471、3498、3621、3829、4233 、4540”。使用对分查找,设定查找键key,若第一个被访 问到的数据是3498,小于key值,则第二个被访问到的数据 是 ( B ) A.3408 B.3829 C.4233 D.4540
( D )
2.某网站报名参加免费三亚游的会员序列号有:101、135、 238、342、450、558、633、708、846、910。采用对分查 找,查找序列号为846号网友信息的过程中,依次被访问 的序列号是 ( A ) A.450、708、846 B.450、708、910、846 C.558、708、846 D.558、708、910、846
'Command1_Click()过程用于统计参加过这两次考试的学生信息 Private Sub Command1_Click() Dim i As Integer, bot As Integer, top As Integer, m As Integer For i =1 To 300 '① bot = 1 top = 300 Do While bot <= top m = Fix((bot + top) / 2) If a(m) = b(i) Then list3.AddItem a(m) Exit Do ElseIf a(m) > b(i) Then m=bot - 1 '② Else 请回答下列问题: bot = m + 1 (1)流程图中虚线框部分所采用的查找算法 End If 对分查找算法 名称是____________ 。 Loop (2)加框①处代码有错,应改为 Next i For i=1 to 100。 ___________ End Sub (3)加框②处代码有错,应改为 top=m-1 。 ___________
10. 在一行数据(1、23、6、2、4、5、6、18、5、19)中,存在连续递增的数据序列(1、23)、(6)、(2 、4,5、6、18)、(5、19),其序列长度分别为2、1、5、2,则连续递增的数据序列长度最大值 max=5。寻找max的方法如下:从第二个数据开始,将该数与它的前一个数比较,如果该数大 于它的前一个数,则k←k+1,否则k←1,……;直到最后一个数据处理完成为止。在此过程 中将k的最大值保存在变量max中。依据上述算法描述编写的VB程序如下,但加框处代码有错 ,请改正。 Const n = 10 Dim a(1 To n) As Integer 'Text1_KeyPress 过程用于输入数据并将数据依次存放到数组a中 Private Sub Text1_KeyPress(KeyAscii As Integer) '该过程代码略 End Sub Private Sub Command1_Click() Dim i As Integer Dim k As Integer '连续递增的数据序列长度 Dim max As Integer '连续递增的数据序列长度最大值 max = 1 k=1 For i = 2 To n If a(i) > a(i+1) Then k = k + 1 Else k = 1 '(1) If k > max Then k=max '(2) a(i-1) Next i (1)加框①处应填入______________。 Text2.Text = Str(max) End Sub max=k (2)加框②处应填入______________ 。
Command1点击事件开始
设置第一数和第n数 求中间数
5. 查找次数的估算
对规模为n的数组进行对分查找时,无论是否找到,至 多进行 log2n+1( log2n表示大于或等于 log2n的最小整数)次 查找就能得到结果,而使用顺序查找算法,在最坏的情况下 (查找键在最后一个或没找到),需要进行n次查找,最好的
D(m)=37=key=37 找到
D(m)=32<key=37 取大区间
3.对分查找算法的表示 使用对分查找在数组变量d中查找key,用自然语言描述 的算法如下: (1)(确定初始查找范围)i←1,j←n。 (2)(是否能继续查找?)如果i≤j,那么转到(4)。 (3)(找不到)输入出结果0,算法结束。 (4)(计算中点位置)m←(i+j)\2。 (5)(相等?)如果d(m)=key,那么转到(7)。 (6)(修改查找范围)如果key<d(m),那么j←m-1;否则 i←m+1,转到(2)。 (7)(找到)输出结果m,算法结束。
3.某电子图书馆网站有10万本图书记录(已索引排序),假设 从中取出一条记录并与待查找项进行比较所花时间为10毫 秒,则用对分法在该系统中查找任意一本指定图书最多花 费的时间约为 ( D ) A.100万毫秒 B.50万毫秒 C.10毫秒 D.170毫秒 4.某数组有7个元素,依次为158、234、369、478、552、 697、748。若采用对分查找法在该数组中查找数据748, 需要查找的次数是 ( C ) A.1 B.2 C.3 D.4
12.某中学2009年下半年和2010年上半年各有300名和100名学生参 加信息技术高考,下列VB程序用于统计参加过这两次考试的学 生信息,其中Command1_Click过程的算法流程图如下所示:
VB程序代码如下所示: Dim a(1 To 300) As String '用于存放2009年下半年考 试学生的身份证号码 Dim b(1 To 100) As String '用于存放2010年上半年考 试学生的身份证号码 'Form Load过程用于进行一些初始化准备工作 Private Sub Form_Load() '将参加2009年下半年考试学生的身份证号码放在数组a中 '将参加2010年上半年考试学生的身份证号码放在数组b中 '将数组a中数据升序排列 '将数组a和数组b中的数据分别显示在列表框List1和List2中 '代码略 End Sub
7.使用对分查找在已排序的数组d(数组元素d(l)≤d(2) ≤…≤d(n))中查找key的算法流程图如下。其中①、②框中的 内容分别是 ( C )
A.①j←m+1 ②i←m+1 B.①j←m—1 ②i←m-1 C.①j←m-1 ②i←m+1 D.①j←m + 1 ②i←m-1
8.有两组数据: ①54、31、43、12、8、73、56、34、89、60、23、67 ②87、83、75、70、63、59、55、37、33、21、17、7 下列有关查找方法描述不正确的是 ( C) A.①可以直接使用顺序查找 B.②可以直接使用对分查找 C.①可以直接使用对分查找 D.②可以直接使用顺序查找 9.某查找算法的部分VB程序代码如下: t = False i=0 Do While i < 7 And t = False i=i+1 If d(i) = Key Then t = True Loop If t = False Then i = 0 数组元素d(1)到d(7)的数据依次为“8、9、5、8、4、7、 8”,当变量key的值为8时,运用该算法处理后,变量i的 值是 ( A ) A.1 B.2 C.4 D.7
n 1 情况是一次查找(查找键在第一个),平均查找次数是 2 。
本节的学习要求掌握对分查找算法的基本思想,掌 握对分查找算法的程序实现要点,学会编写简单的对分 查找的程序。掌握对顺序查找与对分查找次数的估算。 对分查找算法在历次考试中出现的概率为90%以上,考 查方式为选择题与填空题。
1.下列有关查找的说法,正确的是 A.顺序查找时,被查找的数据必须有序 B.对分查找时,被查找的数据不一定有序 C.顺序查找总能找到要查找的关键字 D.一般情况下,对分查找的效率较高
3.7 对分查找算法及程序实现
1.对分查找的概念 对分查找又称二分查找,是一种高效的查找方法。对分 查找的前提是,被查找的数据序列是有序的(升序或降序)。 对分查找的基本思想是在有序的数列中,首先将要查找 的数据与有序数列内处于中间位置的数据进行比较,如果两 者相等,则查找成功;否则就根据数据的有序性,再确定该 数据的范围应该在数列的前半部分还是后半部分;在新确定 的缩少范围内,继续按上述方法进行查找,直到找到要查找 的数据,即查找成功,如果要查找的数据不存在,即查找不 成功。
Dim xm(1 To 1000) As String Dim phone(1 To 1000) As String Const n As Integer = 1000 Private Sub Command1_Click() 请阅读代码并问答下列问题。 Dim x As String 顺序查找算法 (1)解决此问题的算法是_______________________ 。 Dim find As Boolean 在程序①和②划线处填入适当的语句或表达式,将 Dim i As Integer 程序补充完整: x = Text1.Text i=i+1 (2)程序中①划线处应填入_____________________ 。 i=0 x=xm(i) (3)程序中②划线处应填入_____________________ 。 find = False 注:该示例程序在素材文件夹下vb33文件夹中。 Do While (i < n) And find = False ① If ② Then find = True Loop If find = True Then Label2.Caption = “该学生家长联系电话为:” + phone(i) Else Label2.Caption = “未找到该学生” End If End Sub Private Sub Form_Load() ' 学生姓名及家长电话数组赋初值语句,忽略 End Sub
11. 某学校把每个学生的姓名和家长联系电话保存到计算机中, 以便遇到紧急情况时可以及时通知学生家长。每个学生的姓 名和家长联系电话已经保存在数组xm和phone(都为字符串类 型)中。现在要设计一个根据输入的学生姓名查询该学生家 长的联系电话的程序。程序运行时的界面如下图所示: 完善程序:下列程序运行时, 在Text1中输入学生姓名,单 击“查询家长电话”按钮 Command1后,在标签Label2 中显示对应的学生家长电话, 若找不到则显示“未找到该学 生”。程序代码如下:
2.对分查找的过程 若key为查找键,数组d存放n个已按升序排序的数据。在使用 对分查找时,把查找范围[i,j]的中间位置上的数据d(m)与查找键 key进行比较,结果必然是如下三种情况之一: (1)若key<d(m),查找键小于中点d(m)处的数据。由数组d中的 数据的递增性,可以确定:在(m,j)内不可能存在值为key的数据 ,必须在新的范围(i,m-1)中继续查找; (2)key=d(m),找到了需要的数据; (3)key>d(m),由与(1)相同的理由,必须在新的范围(m+1,j) 中继续查找。 这样,除了出现情况(2),在通过一次比较后,新的查找范围 将不超过上次查找范围的一半。