算法导论实战(一)(算法导论习题第一到四章)

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀算法启示录

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 

前言

算法导论的知识点学习将持续性更新在算法启示录_十二月的猫的博客-CSDN博客,欢迎大家订阅呀(反正是免费的哦~~)

实战篇也将在专栏上持续更新,主要目的是强化对理论的学习(题目来源:山东大学孔凡玉老师推荐)

第二章

2.3-7

描述一个运行时间为 Θ(𝑛lg⁡𝑛) 的算法,给定n个整数的集合S 和另一个整数x, 该算法能确定S中是否存在两个其和刚好为x 的元素。

题解:

步骤一:首先对整数集合排序,利用归并排序完成,时间复杂度为 O(𝑛lg⁡𝑛)。

//归并算法的主程序
MERGE-SORT(A,s,e)
    q=(s+e)/2
    MERGE-SORT(A,s,q)
    MERGE-SORT(A,q+1,e)
    MERGE(A,s,q,e)
//将两个有序子数组合并为一个有序数组
MERGE(A,s,q,e)
    l1=q-s+1
    l2=e-q
    let L[1..l1+1]、R[1..l2]be new arrays
    for i=1 to l1
        L[i]=A[s+i-1]
    for j=1 to l2
        L[i]=A[q+j]
    i=1
    j=1
    for k=s to e
        if L[i]<=R[j]
            A[k]=L[i]
            i++;
        else
            A[k]=R[j]
            j++;

步骤二:得到已经排好序的数组A,新建两个指针mi、ma,前者指向数组开头,后者指向数组结尾。将指针值相加得到t,分两种情况:

1、t>x:ma指针向前移动一位

2、t<=x:mi指针向后移动一位

终止条件:每次移动后若是状态发生变化(小于变大于/大于变小于)则算法停止,找不到,返回false;若是状态变化为等于0,则找到,返回true

步骤二共花费O(𝑛)时间复杂度

第三章

3.1-2

证明:对任意实常量a 和b, 其中b>0, 有

(n+a)^b=\Theta (n^b)

 题解

3.1-4 

2^{n+1}=O(2^n)成立吗?2^{2n}=O(2^n)成立吗?

题解:

思考题3-4(c、d、e、g较难)

题解:

第四章 

4.1-1

FIND-MAXIMUM-SUBARRAY()返回什么,当A所有元素都是负数时?

题解:

它将会返回A数组中最大的元素

4.1-5(较难)

题解:

题目分析:

 首先看到这个题要求:记录到目前为止出现的最大子数组+A[1..j+1]由A[1..j]拓展得到

 可以猜测本题是在要求我们利用动态规划的思想解决这个问题,又看到非递归显然是利用从底向上的动态规划方法解决该题

动规可行性分析:

最优子结构:当整体取到最大子数组时,必然是左边子数组取到最大子数组,右边子数组取到最大子数组,跨越左右边子数组取到最大子数组时,三者中的最大值

重叠子问题:跨越左右边子数组取到最大子数组这个子问题和左边子数组取到最大子数组以及右边子数组取到最大子数组这两个子问题有明显的重叠

综上,可以使用动态规划思想来解决此问题

 定义:maxEnd[i]为在i处结束的最大子数组

初始值:maxEnd[1]=A[1]

转移方程:maxEnd[i]=max(maxEnd[i-1]+A[i] ,A[i])

maxSubArray(A)
    n=A.length
    start=1
    length=1
    maxEnd[1]=A[1]
    for j=2 to n
        if(maxEnd[j-1]+A[j]>A[j])
            maxEnd[j]=maxEnd[j-1]+A[j]
            length++
        else
            maxEnd[j]=A[j]
            start=j
            length=1
    return maxEnd,start,length

4.3-1

证明:𝑇(𝑛)=𝑇(𝑛−1)+𝑛的解是 𝑂(𝑛^2)

题解:

题目分析

求解递归表达式的方法主要有三种:

一、代入法:猜一个答案,然后代入用数学归纳法验证(证明题YYDS,自己猜有点难)

二、递归树法:构造递归树来求解递归表达式(相当通用的一个方法)

三、主方法:无脑简单,但是存在使用限制

本题是证明题,代入法就是YYDS!

求解流程:

1、根据证明结论知道T(n)=𝑂(𝑛^2),所以可以猜T(n)<=cn^2

2、利用数学归纳法去证明

        a.当n=1时,T(1)=T(0)+1<=c由于c是任意常数,所以不等式成立

        b.假设T(n-1)<=c(n-1)^2成立,那么有如下推导

\begin{aligned} T(n) & \leq c(n-1)^{2}+n \\ & =c n^{2}-2 c n+c+n \\ & =c n^{2}+n(1-2 c)+c \\ & \leq c n^{2} \end{aligned}

        只要c>1/2则成立

        c.结合a、b两个,证毕!

4.3-7

 题解:

a.利用主方法求解得到正确结果,并根据结果进行猜测

b.利用猜测结果代入法验证,发现验证结果不对

c.将放缩条件缩的更小(上界变得更紧),结果反倒正确

总结: 

1、如果上界证明失败了,可以将猜测变得更准确(猜测的更疯狂),再去证明新的猜测。因为我们证明一个更弱的界,代表我们在验证中也只能用更弱的界,这不利于我们的证明,可能会导致我们证明失败

2、观察原本猜测验证失败的地方在哪里来确定如何减去一个低阶项。本题中T(n)验证多了一个n,所以给他减去一个dn低阶项;课本中的例子多了一个1,所以给它减去一个d低阶项

4.4-1

 题解:

a.递归树结果

b.代入法验证 

4.4-5 

对递归式T ( n ) = T ( n − 1 ) + T ( n / 2 ) + n ,利用递归树确定一个好的渐近上界,用代入法进行验证。

题解:

4.5-1 

题解:

注意:

1、主方法使用需要满足多项式意义上的渐进小于/渐进大于,不是简单的渐进小于大于。

2、多项式意义就是需要相差n^x因子,这个x取值是任意的正常数 

4.5-4

题解: 

总结

本文到这里就结束啦~~

本篇文章的撰写花了本喵三个多小时

如果仍有不够希望大家多多包涵~~如果觉得对你有帮助,辛苦友友点个赞哦~

知识来源:《算法导论》课后习题、山东大学孔凡玉老师ppt。不要用于商业用途转发哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十二月的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值