三、算法的特性
当然一个问题都是可以由多个算法解决的。俗话说,无规矩不成方圆。
那么不同的算法是不是得有相同的规则,或者说相同的特性,才能约束算法,不能任意一种算法就可以解决问题。
打个比方,就用曹冲称象这个例子吧。为了不浪费大家的脑子,我决定就说的简单一点。
现有大象一头,需要知道大象有多重。但是秤太小,无法精准测量。
请你设计一个算法来计算大象的重量。
曹冲的方法:把象放到大船上,在水面所达到的地方做上记号,再让船装载其它东西,称一下这些东西,那么比较下就能知道了。
方法1:我把大象切碎,一块一块量
方法2:造一个超大的秤,专门用来秤大象的重量
你觉得方法1和方法2怎么样?先不急着回答,我们先看看算法的这几个性质。
1. 有穷性
一个算法必须要有一个明确的终止条件来控制处理过程的终止,或者说结束。
什么意思呢?就是你的算法至少要有一个终止条件,或者说能够在特定时间内终止,并计算出结果。要不然你的方法有什么意义呢?
2. 确定性
你的算法的每个步骤都是有明确的目的,不能有别的意思。
就拿上面的例子,你说要把大象切碎,不能切着切着,我还是再造个秤吧。
3. 可行性
你的算法的没一个步骤都是可以被机器或者人执行的。
就像曹冲的方法一样,是切实可行的,而像方法12,则多少有点不切实际了。
4. 正确性
你的算法所计算的结果是能够用来解决这个问题的。
不能说你的算法无法解决问题,那样你的算法也是毫无意义的。
那么,在看完这四个特性后你怎么回答上面的问题呢?
当然,答案我也在特性里面说了出来,还不知道答案的,面壁思过去!
四、算法的分析
那么讲了这么多,我们怎么判断我们的程序是好是坏呢?那就是时间复杂度和空间复杂度。
是不是感觉这两个名词好难理解?没事,他其实也不难。
1. 时间复杂度
所谓时间复杂度就是算法执行的时间。而时间复杂度可以由两种方式:
- 计算程序实际运行时间
- 计算程序相对运行时间
我们知道,即使是同一种算法,在不同的编程语言,不同的机器,不同的环境索引行的实际时间也是不一样的。
所以第一种方式,就不是很银杏化!那么就只能是第二种方法了来判断我们的程序是否得到了优化~~
而时间复杂度又分为三种,最优情况,最劣情况,平均情况。而这个情况是由问题来决定的~
这三种情况我就不多说啦~看名字就知道了
时间复杂度统一使用O(x)来表示,也是俗称的大O表示法,而时间复杂度的