- 作者:Rockics(http://blog.csdn.net/Rockics )
- 转载请注明出处
一些学习前的准备:
首先,在windows底下编写代码,我推荐使用RJ TextEd,很不错的编辑器。Mark一下。
没有安装VC,它太庞大了,试了试cygwin,安装实在太慢,放弃了。
转而使用MinGW,以前使用过,印象很不错。简单记录一下过程:
1:下载http://www.mingw.org/
2:安装
3:相关配置。建立一个bat文件,如下:(参考 k1988的程序生活 之 MinGW介绍与使用):
有了环境,开始吧。
算法研究是一门关注性能的课程。如果站在工程学的角度编写软件,相对于性能来说,还有什么比之重要的?
正确性?简单?可维护性?健壮性?用户友好性?
代价,编码时间等等(性能的一方面)?函数性?模块化?安全性,很重要。
可扩展性?
如此多的特性比性能重要,为什么我们还要研究性能?
没有什么比等待更令人沮丧了,性能是很多特性的保证。
有些事情不过不考虑性能,他将十分耗时,而变得不再实用。
可以使用性能为其他特性买单。比如说,使用java编程而不使用c编程,我们宁愿损失性能,因为java有面向对象的所用特性,异常机制等等,对工程来说很重要。
我们喜欢快哈。极品飞车?滑雪?速度的魅力无限。
插入排序之实例:
插入排序,仅仅考虑关键字,不考虑卫星数据:
基本思想:想象扑克牌,手上的牌已经是排好的,摸一张新牌,放到手上,并且排好顺序:做好通常是:
找到新牌该在的位置,插入,在其后面的牌依次往后走一下。完成一趟排序。
运行时间依赖:
1. 输入情况,比如有序程度
2. 输入规模
对于性能,我们希望知道运行时间上界upper bounds,对用户保证
算法复杂度分析类型:
1. 最坏情况(WORST-CASE)
T(n) = max time on any input of size n
2. 平均情况(AVERAGE-CASE)
T(n) = expected time over all inputs of size n
这里使用到概率上知识,需要做一些假设,比如说,输入服从什么样的分布,最简单的就是均匀分布。但是也存在其他分布的可能性。
3. 最好情况(BEST-CASE)-----伪造的(bogus)
欺骗嫌疑
插入排序的的最坏情况θ(n方),算术级数1+2+3+···+n;这里首先初略的使用了θ符号。
运行的计算机情况;(相对速度,绝对速度)
对于讨论算法的课程来说,尽量不要涉及到硬件的讨论。
要忽略掉和机器相关的一些参数;
(重要思想)研究运行时T(n)随着n趋近与无穷大时候的增长情况。
渐近线符号:
θ:忽略低阶,忽略常系数。
O,Ω,θ。符号不好打,略过。这些符号,大多是描述符号,而不是操作符号(比如说:莱布尼兹的微积分符号)。
从工程学的角度来考虑问题,我们很多时候不得不处理
输入规模很大额情况,所以忽略低阶项还有常系数是合理的。
合并排序,实践中,合并排序比插入排序更优:
思想:如果规模n=1,结束排序,常数时间θ(1);
递归排序前半部分还有后半部分;
合并这两部分θ(n),线性;
合并排序的时间复杂度分析:θ(nlgn)递归式子。
递归树方法,把一层一层的时间全部相加起来,就得到
运行时间,不是仅仅计算叶子节点的时间哈,切记。
编程心得:
变量先定义再使用;
应该有返回值;
小心地使用宏定义,上代码说明问题。
使用GCC编译会报错:
exam.c: In function 'main':
exam.c:11: error: expected expression before 'else'
有心的读者可以验证一下,宏要仔细使用。