110 likes | 200 Vues
对分查找. 将查找键与有序数组内处于中间位置的元素进行比较 , 如不同 , 根据数组元素的有序性 , 确定在数组的前半部分还是后半部分 ; 在新确定的范围内 , 继续按上述方法进行查找 , 直到获得最终结果. 任务一. 打开对分查找 .swf 文件,选择“单步执行”模式,单击“随机生成”按钮,并单击“排序”,输入某一个要查找的数字,单击“开始运行”后观察演示过程并完成 学习任务单上的 问题 ,完成后两人为一小组讨论并交流这些问题。. 任务一问题. 1 、对分查找的前提是在 数据中进行查找。(填有序或无序) 2 、查找范围由哪两个变量控制 ?
E N D
对分查找 将查找键与有序数组内处于中间位置的元素进行比较,如不同,根据数组元素的有序性,确定在数组的前半部分还是后半部分;在新确定的范围内,继续按上述方法进行查找,直到获得最终结果.
任务一 打开对分查找.swf文件,选择“单步执行”模式,单击“随机生成”按钮,并单击“排序”,输入某一个要查找的数字,单击“开始运行”后观察演示过程并完成学习任务单上的问题,完成后两人为一小组讨论并交流这些问题。
任务一问题 1、对分查找的前提是在数据中进行查找。(填有序或无序) 2、查找范围由哪两个变量控制? 3、中点位置如何计算?(请写出具体的VB表达式) 有序 i , j ( i + j ) \ 2 Int ( ( i + j ) / 2 ) Fix ( ( i + j ) / 2 )
任务一问题 4、若key ≠ d(m),则应重新确定新的查找范围。 若Key>d(m) 则新的查找范围在中点位置的半部分(填上或下),应修改哪个变量的值?怎么修改? 若Key<d(m) 则新的查找范围在中点位置的半部分(填上或下),应修改哪个变量的值?怎么修改? 5、查找结束的判定条件是什么(两种)? 下 i = m + 1 上 j = m - 1 Key=d(m) 或者 i > j
对分查找 将查找键与有序数组内处于中间位置的元素进行比较,如不同,根据数组元素的有序性,确定在数组的前半部分还是后半部分;在新确定的范围内,继续按上述方法进行查找,直到获得最终结果.
练习:使用对分查找算法,在某校报名参加竞选学生会主席的学号列表20080101、 20080135、20080238、20080342、20080450、20080558、20080633、20080708、20080846、20080910中查找学号为20080846学生,需要经过几次查找才能找到该学生?查找过程中依次被访问到的学号是哪些? 3次 20080450、 20080708、 20080846
i1 jn 计算中点m Y d(m)=key? 输出找到的信息 Y N N 开始 N i<=j ? Y 输出“未找到” d(m)<key im+1 结束 jm-1 对分查找流程图
下列程序的功能是使用对分查找算法根据学号查找该学生的语文成绩,数组StudentID和Score分别保存某班1号到50号同学的学号和成绩。例如: StudentID(1)和Socre(1)中存放的数据分别是“100101” 、62 Private Sub Command1_Click() Dim Key As String Dim i As Integer, j As Integer, m As Integer Key = Text1.Text i = 1 j =_______ Do While i <= j ________________ If Key = StudentID(m) Then lblResult.Caption = "查找结果:" + Str(Score(i)) Exit Do ElseIf Then i = m + 1 Else ____________ End If Loop If I > j Then lblResult.Caption = "查找结果:未找到该学号" End If End Sub 50 m = Int((i + j) / 2) Key > StudentID(m) j = m - 1
本课小结 1)对分查找算法中要注意的问题: 对分查找的前提: 中点位置的计算: 新的查找范围的确定: 查找结束的判定条件: 数据必须是有序排列的 (i+j)\2 i=m+1 或者 j=m-1 找到数据 或者 i>j
本课小结 2)对分查找算法的最多查找次数 由于对分查找过程中的每次比较都能使得搜索范围减半,在n个数中查找,n/2^k<1,最多需要k次找到目标值。 k=
本课小结 3)对分查找算法的实际意义(高效性): 一个包含一百万个人名的电话簿中找一个名字,二分查找可以让你不超过20次就能找到指定的名字。 将全国13亿人按身份证号排列后,你可以在31次比较后找到这个人的信息。