算法学习笔记(1)

来源:互联网 发布:哈尔滨编程培训学校 编辑:程序博客网 时间:2024/05/01 23:38

  • 作者: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'

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

 

原创粉丝点击