极客技术与极客人

极客技术与极客人

定义:

算法是指对特定问题求解步骤的一种描述。

 

 

特性:

(1)有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止。

(2)确定性:每条语句有确定的含义,无歧义。

(3)可行性:算法在当前环境条件下可以通过有限次运算实现。

(4)输入输出:有零个或多个输入,一个或多个输出。

 

 

“好”算法的标准如下:

(1)正确性:正确性是指算法能够满足具体问题的需求,程序运行正常,无语法错误,能够通过典型的软件测试,达到预期的需求。

(2)易读性:算法遵循标识符命名规则,简洁易懂,注释语句恰当适量,方便自己和他人阅读,便于后期调试和修改。

(3)健壮性:算法对非法数据及操作有较好的反应和处理。例如,在学生信息管理系统中登记学生年龄时,若将21岁误输入为210岁,系统应该提示出错。

 

(4)高效性:高效性是指算法运行效率高,即算法运行所消耗的时间短。算法时间复杂度就是算法运行需要的时间。现代计算机一秒钟能计算数亿次,因此不能用秒来具体计算算法消耗的时间,由于相同配置的计算机进行一次基本运算的时间是一定的,我们可以用算法基本运算的执行次数来衡量算法的效率。因此,将算法基本运算的执行次数作为时间复杂度的衡量标准。

(5)低存储性:低存储性是指算法所需要的存储空间低。对于像手机、平板电脑这样的嵌入式设备,算法如果占用空间过大,则无法运行。算法占用的空间大小称为空间复杂度。

 

 

算法的两大分类:

一个是数据结构(数据对象)数、矩阵、集合、串、排列、图、表达式、分布等。

另一个是算法策略贪心、分治、动态规划、线性规划、搜索等。

 

这两条线索是相互独立的:同一个数据对象(比如图)上有不同的问题(如单源最短路径和多源最短路径),就可以用到不同的算法策略(例如贪婪和动态规划);而完全不同的数据对象上的问题(如排序和整数乘法),也许就会用到相同的算法策略(如分治)。

 

 

如何学习算法(个人想法):

(1)HACK精神:对这个事物拥有这极高的热情,对这个事物有一种快速掌握的渴望,对这个事物不断问为什么,亲自去做并在这个过程中明白当初问为什么的到底是个啥以及明白这个问题的答案是什么。

(2)数学与逻辑:在我的学习编程或是在学习算法的过程中,无数次的实践告所我——算法的灵魂是数学以及思维逻辑。例如,在编程1+2+3+ …… +n时,采用 "for(int i=1;i<=n;i++) { sum+=i; }" 和直接用等差数列求和公式是完全不一样的。所以掌握一定的数学和逻辑方法是必要的。

(3)适合自己的学习材料:对于我来说,学习一样新的事物,学习的资料是十分重要的,或者直接说,学习的材料直接决定我第一次学习时的效率和深度;那么对于你来说,也是一样,找到真正适合自己的学习材料是你在学习前应该着重做的事情;那么,应该怎么找寻材料呢?例如,图书馆的图书,博客,个人网站等;需要注意的是,如果选择博客或个人网站作为学习材料,那个博客或个人网站应该有成体系的知识结构和层次。

(4)去做:当你看懂了材料所描述以后,立即需要做的就是去实现它——自动编程实现它,这是为了避免“产生了学会了的错觉,实际上是看懂了的感觉”。其次,也是最重要的,就是做好笔记,便于复习。在做笔记时,我的原则是“① 不做冗余的笔记——只有自己真正实践或理解才做;笔记的真正目的是为了以后的快速复习! ② 在自己所做的笔记中,无论知识怎么难,只要是理解了所做的笔记,如果在下一次去看,不能快速看懂的,就是垃圾一样的笔记!”

(5)适时复习:这一点没什么可说的,你可以参考“艾宾浩斯遗忘曲线”来自定义复习时间。

 

 

[ 注: 部分内容出自《趣味算法》作者:陈小玉 (人民邮电出版社) ]

03-12 13:01