算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或者多个操作。
数据结构与算法的关系是相互依赖不可分割的。
1.两种算法的比较
现在我们要求写一个求1+2+3+........+100结果的程序:
我们大多数人会这样写:
这就是简单的一种算法,那么你是否想过,这样写的代码真的很好吗?执行效率是否高效?
我们小学就知道了,一种叫高斯算法:
就是把该算式正序排列一式,然后倒叙排列写成二式;两者相加就是左边等于两倍的sum,右边则为所以数之和;很容易得到sum;那么我们对程序就可以改进一下了:
这种算法相当于另一种求等差数列的算法,不仅仅可以用于1加到100,就是加到1000,10000,也就是瞬间的事情,而如果是刚刚第一种算法计算机要循环上百次,上千次,上万次。刚才第一种算法的效率大大不如现在的算法。
2.算法的特性
(1).输入输出
算法具有零个或者多个输入。
算法至少有一个或者多个输出。输出的形式可以是打印输出,也可以是返回一个或者多个值。
也就是输入可以没有,但是你必须要有输出。不然你要算法干嘛?
(2).有穷性
指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每个步骤在可以接受的范围内完成。
(3).可行性
算法的每一步都必须是可行的,也就是说,每一步都能够通过执行有限次数完成。
3.算法的设计要求
(1).正确性:
算法的正确性是指算法至少应该具备输入,输出和加工处理无歧义性,能正确反映问题的需求,能够得到问题的正确答案。
但是算法的“正确”通常在用法上有很大的差别,大体分成四个层次:
算法程序没有语法错误;
算法程序对于合法的输入数据能够产生满足要求的输出结果;
算法程序对于非法的输入数据能够产生满足规格说明的结果;
算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。
(2).可读性
算法设计的另一目的是为了便于阅读,理解,交流。
可读性是算法好坏很重要的指标,如果可读性不好,时间长了,自己连自己写的都看不懂。
(3).健壮性
当输入数据不合法时,算法也能做出相关处理,而不是产生异常或者莫名奇妙的结果。
(4).时间效率高和存储量低
设计算法应该尽量满足时间效率高和存储量低的需求。
总之,好的算法,应该具有正确性,可读性,健壮性,高效率和低存储量的特征。
4.算法效率的度量方法
(1).事后统计方法
这种方法主要是通过设计好的测试程序和数据,利用计算机计时器不同算法编制程序的运行时间来进行比较,从而来确定算法效率的高低。
这种方法比较依赖于计算机硬件和软件等环境因素,故我们不予采纳。
(2).事后分析估计方法
是指在计算机程序编制前,依据统计方法对算法对算法进行估算。
还是看之前这两个算法:
显然,第一个算法,执行了1+(n+1)+n+1次=2n+3次;而第二种算法,是1+1+1=3次。其实上两个算法的第一条和最后一条都是一样的,所以我们关注中间的代码,忽略循环判断的开销,那么这两个算法其实就是n和1次的差距。算法好坏显而易见。
下面我们再来看一个列子:
上述算法若忽略第一次和最后一次执行次数为100^2,并且随着n值的增大,执行时间也会增大,远远多于前面两个算法的执行时间。
所以在分析程序的运行时间时,最重要的是把程序看成独立于程序设计语言的算法或者一系列步骤。