算法导论总结——第二章

第二章—“算法入门”,这章以插入排序和合并排序为例子,讲述以下几个比较重要的概念

1、循环不变式: 一般而言,用这个式子表示希望得到的结果,如果在循环的每一步,这个式子都是正确的,那么循环结束后,这个式子也正确,并得到了期望的结果.

三个性质:

初始化:它在循环第一次迭代开始之前,应该是正确的;

保持:如果在循环的某一次迭代开始之前它是正确的,那么在下一次迭代开始之前它也应该保持正确。

终止:但循环结束时,不变式给了我们有用的一个性质,它有助于表明算法的正确性。

咋一看,咋这么像数学归纳法呢?好吧,那就类比数学归纳法来理解它吧。

到现在还是是感觉怪怪的,比如要证明插入排序的正确性,每次从后面找一个最小的元素插到对应位置,循环结束以后本来就是有序的啊,但是为什么还要证明呢?可能刚开始吧,还没有体会到它的重要性,对于循环不变式的存在以后我会慢慢体会。因为存在即是合理的。

插入排序的C++实现参见:一天一小步(排序——1)

2、伪代码:在课本P11-P12介绍了伪代码的一些约定,对这些约定应该认真读一读,对以后运用和理解为代码很有帮助。

3、算法分析:对一个算法所需的资源进行预测。

一般来说,算法所需的时间与输入规模同步增长的。输入规模的概念又与具体问题有关。所以再分析一个算法时应从最好情况,最坏情况、平均情况三个方面进行分析。最坏情况即是任何输入下运行时间的一个上界。

4、分治法把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

分治法在每一层递归上都有三个步骤:
分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;

合并:将各个子问题的解合并为原问题的解。

合并排序的C++实现参见一天一小步(排序——2)

5、冒泡排序:在 思考题2-2中提到了,这里也顺便贴出来

冒泡排序的C++实现参见:一天一小步(排序——3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值