数据结构系列(二):什么才是好的算法?

本系列博客是博主在学习数据结构时的笔记,希望与大家一起分享,如有对数据结构感兴趣的小伙伴可以加个联系方式一起交流。本系列参考程杰的《大话数据结构》。

讲数据结构,不讲算法简直就是耍流氓。程序设计=数据结构+算法,会数据结构,应用不到算法上也是白搭。下面我们来聊一聊什么是算法,什么才能称得上是一个好算法。

算法的定义:算法是解决特定问题求解步骤的描述,在计算机中为指令 的有限序列,并且每条指令表示一个或多个操作。

首先算法需要有输入,那么对应的肯定要有输出。其次算法不能陷入死循环吧,因此有穷;再次算法不能存在二义,必须得是确定的;最后该算法具有可行性。以上是算法的特性。

在设计算法的时候要遵循以下几个原则:

(I)、正确性:1.算法程序没有语法错误。 2.算法程序对于合法的输入数据能够 产生满足要求的输出结果。 3.算法程序对于非法的输入数据能够得出满 足规格说明的结果。 4.算法程序对于精心选择的,甚至刁难的测试数据 都有满足要求的输出结果。

(II)、可读性:方便自己与他人阅读,方便理解与交流。

(III)、鲁棒性:bug少。输入不合法时算法也能作出相应处理。

(IV)、高时间效率、低存储:时间效率需要通过事前分析进行估算,一般用算法时间复杂度O来衡量,而这个O计算与执行次数存在关系,因此在计算大O阶的时候要弄清楚该段代码执行了多少次。

举几个例子:

1、

该代码仅执行1次,因此时间复杂度为O(1);

2、

 

该代码执行了5次,但是对于时间复杂度而言,常数项全部替换为1,因此为O(1);

3、

该代码执行n+1次,看最高项,是n,那么时间复杂度为O(n); 

4、

该代码执行了logn+1次,那么这个循环的时间复杂度为O(logn)

5、

该代码执行了m*n次,时间复杂度为O(mxn)

6、

代码执行n+(n-1)+...+2+1共n*(n+1)/2=n^2/2+n/2次,首先看最高项是平方项,然后仅看平方项的数,不看系数1/2,因此时间复杂度为O(n^2);

下面给出常见时间复杂度的表格:

 【注】在某些特定情况可以以牺牲空间上的开销来换取时间复杂度的降低。

最后总结,当我们在评估我们算法的时候,首先必须要保证算法是正确的,其次需要让我们的代码给同层次的人看也能看的懂,然后是尽量减少算法的bug数量,最后是在时间成本上能够有所降低,而且最好占用内存不要过高。