- 作者:Rockics(http://blog.youkuaiyun.com/Rockics)
- 转载请注明出处
一些学习前的准备:
首先,在windows底下编写代码,我推荐使用RJ TextEd,很不错的编辑器。Mark一下。
没有安装VC,它太庞大了,试了试cygwin,安装实在太慢,放弃了。
转而使用MinGW,以前使用过,印象很不错。简单记录一下过程:
1:下载http://www.mingw.org/
2:安装
3:相关配置。建立一个bat文件,如下:(参考 k1988的程序生活 之 MinGW介绍与使用):
@set path=C:/mingw/bin;%PATH%; @echo ---**欢迎使用MinGW(GCC)系统**--- @cmd
有了环境,开始吧。
算法研究是一门关注性能的课程。如果站在工程学的角度编写软件,相对于性能来说,还有什么比之重要的?
正确性?简单?可维护性?健壮性?用户友好性?
代价,编码时间等等(性能的一方面)?函数性?模块化?安全性,很重要。
可扩展性?
如此多的特性比性能重要,为什么我们还要研究性能?
没有什么比等待更令人沮丧了,性能是很多特性的保证。
有些事情不过不考虑性能,他将十分耗时,而变得不再实用。
可以使用性能为其他特性买单。比如说,使用java编程而不使用c编程,我们宁愿损失性能,因为java有面向对象的所用特性,异常机制等等,对工程来说很重要。
我们喜欢快哈。极品飞车?滑雪?速度的魅力无限。
插入排序之实例:
#include<stdio.h> #include<stdlib.h> int main(int argc,char **argv){ int NUM;//数组元素规模 int i,j; int *a; int temp; NUM = atoi(argv[1]); a = malloc(sizeof(int)*NUM); for(i = 0;i < NUM;i++){ a[i] = 1 + (int)(1000.0*rand()/(RAND_MAX+1.0)); } for(i = 1;i <NUM;i++){ temp = a[i]; for(j = i-1;j >=0;j--){ if(a[j] > temp) a[j+1] = a[j]; else break; } a[j+1] = temp; } for(i = 0;i < NUM;i++){ printf("%5d/t",a[i]); } printf("/n"); return 0; }
插入排序,仅仅考虑关键字,不考虑卫星数据:
基本思想:想象扑克牌,手上的牌已经是排好的,摸一张新牌,放到手上,并且排好顺序:做好通常是:
找到新牌该在的位置,插入,在其后面的牌依次往后走一下。完成一趟排序。
运行时间依赖:
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)递归式子。
递归树方法,把一层一层的时间全部相加起来,就得到
运行时间,不是仅仅计算叶子节点的时间哈,切记。
编程心得:
变量先定义再使用;
应该有返回值;
小心地使用宏定义,上代码说明问题。
#include<stdio.h> #define exch(A, B) {int t = A; A = B; B = t;} int main(){ int i,j; i = 15; j = 6; if(i > j) exch(i,j); else printf("%d 不比 %d 大",i,j); return 0; }
使用GCC编译会报错:
exam.c: In function 'main':
exam.c:11: error: expected expression before 'else'
有心的读者可以验证一下,宏要仔细使用。
算法学习与实践
1118

被折叠的 条评论
为什么被折叠?



