师:今天我们要学习教科版信息技术第四单元第三小节非数值计算的分治策略与二分查找的算法支持。上一节我们学了数值计算,像计算函数、求解方程、数列求和等数学问题。这一节我们主要学算法知识,今天先学第三小节的分治策略与二分查找,递归知识留到第二课时。下面明确这节课的学习目标。第一,了解算法设计的分治策略;第二,了解什么是二分查找;第三,运用二分查找解决实际问题。
首先,什么是分治策略?分治的设计思想,就是把难以直接解决的大问题,分割成若干个较小的同类问题,每个子问题用同样方法解决,最终达到解决问题的目的。分治策略应用广泛,比如求2的8次幂,很多同学会把它分割成若干小部分,用同样方法求解,很快就能得出答案,这正是运用分治策略完成求解的。
那什么是二分查找呢?二分查找是查找的一种方法、一种算法,有实施前提和查找流程。它的前提要求是,待查序列必须有序,可以是升序,也可以是降序。二分查找的查找流程是,先找出中点位置,以待查序列的中点位置元素作为比较对象。以递增序列为例,如果查找目标跟中点位置元素相等,查找完成;如果查找目标比中点位置元素小,待查序列缩窄为左半部分;否则,缩窄为右半部分。循环执行以上查找流程,直到查找完成。
分治策略和二分查找有什么联系呢?分治策略是把大问题分割成若干同类子问题,每个子问题用同样方法解决,实现解决问题的目的。二分查找是分治策略的典型应用,它通过与中点位置元素比较,把大序列逐渐转为同类小序列,每个小序列用同样方法查找和对折,直到完成查找任务。
接下来,我们运用学到的算法知识解决实际问题。今天用二分法模拟翻字典的过程,这个过程用到二分查找算法。查字典首先要明确查找范围,编程时需确定两个变量,分别表示起始页码和终止页码。这里设定flag1作为存储左边界的变量,flag2作为存储右边界的变量,初值分别为1和1000。用二分法查找页码,要先求中点位置,设置变量MID,MID等于左边界加右边界的和整除2。
每次查找都要对折数列,这个过程可用一组语句完成。当查找目标跟中点位置元素相等,就找到对象;如果查找目标比中点位置元素小,缩窄为原来的1/2,这个过程用if语句完成。查找过程何时结束呢?当查找的页码范围缩窄到只有一张页码时,就能找到问题的解。这个条件的表示是整个循环最难写的语句,它是循环执行二分查找的关键语句,说明何时终止二分查找,何时继续执行,是整个程序的关键难点。
怎么表示查找条件呢?显然,查找在flag1到flag2的序列区间内,只要这个区间不为空,就必须继续循环查找;如果序列空了,就不用查找。flag1和flag2存在什么关系呢?大家想想,在平时关系表达式里,只有大于、小于、不等于,或者它们存在函数关系。在查找过程中,待查序列不断收缩,flag1和flag2不断变化,当查找序列缩窄到只有一个元素时,意味着搜索完这个元素,查找序列结束,不用往下查找。此时左边界和右边界相等,即flag1和flag2相等,意味着查完最后一个元素,查找序列为空,不用继续查找。综合这两点,普通情况下左边界小于右边界,所以用flag1小于右边界的关系式表示它们的关系;当查找序列缩窄到最后一个元素时,flag1和flag2相等。因此,把循环语句写成flag1小于等于flag2,这样就能很好地表示在flag1小于等于flag2的条件下,反复进行二分查找;当flag1不小于等于flag2时,意味着查找区间为空,不用继续查找,这是程序里很关键重要的语句。
明确这些关键信息后,进行程序补全。第一个空填循环查找的条件,就是flag1小于等于flag2。接下来求中点位置,是flag1加flag2的和整除2,然后给次数赋值,次数初值为0,查找一次就增加一次,所以step赋值为step加1。
最后是一组if语句。当查找目标x小于中点位置的值时,查找序列要缩窄为左半部分,右边界前移,FLAG2等于mid减1;如果x大于mid,大于中点位置的值,意味着查找序列要缩窄为右边,左边界往后移,移成flag1等于中点位置加1。else语句虽没让我们填写,但要明确它的功能,它是查找到的分支语句,意味着查找目标跟中点位置的值相等,执行break语句,结束整个查询,然后输出查找次数的信息。
