算法学习笔记(1)

算法学习与实践

一些学习前的准备:

首先,在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'

有心的读者可以验证一下,宏要仔细使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值