算法导论 2.3-5

来源:互联网 发布:网络直播乱象丛生 编辑:程序博客网 时间:2024/05/16 10:47

题目

回顾一下联系2.1-3中提到的查找问题,注意如果序列A是已排序的,就可以将该序列的中点与v进行比较。根据比较的结果,原序列中有一半就可以不用再做进一步的考虑了。二分查找就是一个不断重复这一过程的算法。写出二分查找的伪代码,可以是迭代的,也可以是递归的。说明二分查找的最坏情况运行时间是为什么是

分析

分别给出迭代形式和递归形式的分析,从分析可以看出迭代和递归是等价的,递归的解法比较直观,迭代的空间代价是较小的。

迭代形式分析

给定参数A,p,r,v,A[p...r]是排序好的序列。需要一个变量q记录中点的位置,然 后就是迭代的循环:
q被赋值为
v==A[q],找到了v,返回q值;
v>A[q],p被赋值为q+1;
v<A[q],r被赋值为q-1;
循环的终止条件是p<=r。这里必须有等号,否则对于单个数据的数组没法查找了
试着写出迭代的二分查找的循环不变式:在循环的每次迭代开始前,必然满足不等式A[p]<=v或A[r]>=v,且是排序好的。

伪代码

BINARY-SEARCH-ITERATION(A, p, r, v)costtimesif A[p] > v or A[r] < vc11    then return NILc21或0while p <= rc3ti    q <- c4ti-1    if v == A[q]
        then return q
    else if v > A[q]
                 then p <- q+1
             else r <- q-1
c5ti-1                
    if A[p] > v or A[r] < vc6ti-1        then return NILc71或0return NILc81
为满足循环不变式,加入对断点的判断

时间复杂度分析

由伪代码的分析可以看出,整个程序的运行时间由ti决定,所以,,而在最坏情况下,即v与A[p]或A[r]相等,由于每次搜索范围都是上一次的一半,所以此种情况下,while循环运行次,因此


递归形式分析

伪代码

BINARY-SEARCH-RECURSION(A, p, r, v)
1    if p <= r
2        then q <- 
3                  if A[q] == v
4                      then return q
5                      else if A[q] > v
6                                   then return BINARY-SEARCH-RECURSION(A, p, q-1, v)
7                                   else return BINARY-SEARCH-RECURSION(A, q+1, r, v)
8    retrun NIL

时间复杂度分析

使用分治法分析:
分解:这一步需要求出中点的位置,并进行比较,步骤是常数,因此
解决:递归的解决规模为n/2的子问题,所以时间为T(n/2)
合并:显然,二分查找直接返回v的位置,不需要合并,因此C(n)=0
因此,二分查找的递归式为

通过画出递归树或主定理都可以得到二分查找的最坏运行时间为

Pyhton实现

迭代

def binary_search_ite(a, p, r, v):    if a[p] > v or a[r] < v:        return None    while p <= r:        q = (p + r) / 2        if a[q] == v:            return q        elif a[q] > v:            r = q - 1        elif a[q] < v:            p = q + 1        if a[p] > v or a[r] < v:            return None    return None


递归

def binary_search(a, p, r, v):    if p <= r:        q = (p + r) / 2        if a[q] == v:            return q        elif a[q] > v:            return binary_search(a, p, q-1, v)        elif a[q] < v:            return binary_search(a, q + 1, r, v)    return None




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生气引起的短暂失忆怎么办 win10系统忘记开机密码怎么办 戴尔win10密码忘了怎么办 戴尔电脑win10密码忘了怎么办 出门忘记带身份证了怎么办 一年染了7次头发怎么办 低头久了颈椎疼怎么办 一只眼睛磨得慌怎么办 没有睡好眼睛痛怎么办 好几天没休息好怎么办 血糖高睡不好觉怎么办 眼睛感觉磨的慌怎么办 痔疮手术后大便疼肛裂痛怎么办 肛裂排便困难痛怎么办 智齿导致的牙疼怎么办 肛裂一直不愈合怎么办 孕妇肛裂拉屎疼怎么办 产后50天小肚子突出怎么办 肚子像怀孕一样大怎么办 蹲厕所拉不出来怎么办 生气导致回奶了怎么办 老公每晚要吃奶才睡觉怎么办 分分钟想把老公杀掉怎么办 老公出轨闹的厉害离家出走怎么办? 儿子故意杀人一审判死刑怎么办 被家暴时妻子杀了丈夫该怎么办 丈夫挣钱不给妻子怎么办 白色皮鞋染了色怎么办 刺扎到手里拿不出来怎么办 军官证解锁片丢了怎么办 六安市人民医院药品停用了怎么办 信无法寄到该怎么办 5个月的宝宝光有屎沫怎么办 胸牌的别针坏了怎么办 工资表税金扣多了怎么办? 装修公司不发放工程怎么办 公司不给开收入证明怎么办 装修公司不付工人工资怎么办 收入证明少500元怎么办 dnf二级输错了怎么办 如果受到法律的伤害怎么办