算法的基本概念:是对特定问题求解步骤的一种描述,它是指令的有限序列,其中指令表示一个或多个操作。
算法的五个重要特性:
1.有穷性:一个算法必须总在执行有穷性之后结束,且每一步都在有穷时间内完成。
2.确定性:每条指令必须有确切的含义。对于相同的输入只能得相同的输出。
3.可行性:算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。
4.输入:一个算法有零个或多个输入,这些输入取自某个特定的对象的集合。
5.输出:一个算法有一个或多个输出,这些输出是与输入有着某种特定的关系的量
算法和程序的区别:
1.在执行时间上,算法所描述的步骤一定是有限的,而程序可以无限的执行下去。因此程序可以不满足有穷性。例如:操作系统,死循环。
2.在语言描述上,程序必须采用规定的程序设计语言来书写, 而算法没有限制。
3.正确性上,算法必须是正确的,程序可以是错误的。
如何才能设计出一个好的算法?
1.正确性:算法能够正确的解决求解问题。
2.可读性:算法应具有良好的可读性,以帮助人们理解。
3.健壮性:输入非法的数据时,算法能够适当的做出反应或进行处理,而不会产生不正确的结果。
4.高效率:具有较高的时间和空间性能。
算法的效率的度量是通过时间复杂度和空间复杂度来描述的。
(一)时间复杂度
语句频度:该条语句可能重复执行的次数
T(n):所有语句的频度之和,其中n为问题的规模
例子:
int sum=0; //执行了1次
for(int i=1;i<=n;i++)
sum +=i; //执行了n次
所以T(n)=1+n
时间复杂度:T(n) =O(f(n)),其中O表示T(n)与f(n)在n–>正无穷时为同阶无穷大
时间复杂度也有分类:最坏时间复杂度、最好时间复杂度、平均时间复杂度
例子:
int sum =0;
if(n!=0)
for(int i= 1;i <= n;i++)
sum +=i
分析:如果n=0;只执行了一步T(n)=1 时间复杂度为:O(1)
如果n!=0;执行循环,T(n)=n+1,时间复杂度为:O(n)
例子:
int sum=0; //执行1次
for(int i=1;i<=n;i++) //执行n次/
sum += i;
for(int i=1;i<=n;i++)
for(int j=1;j <= n;j++) //执行n^2次
sum +=i;
所以T(n)=1+n+n^2
根据加法规则去最大的,则时间复杂度为O(n^2)。
(二)空间复杂度
空间复杂度:算法所消耗的存储空间
S(n)=O(g(n))
存储空间:出本身所用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和储存为实现算法所需的一些信息的辅助空间。
*算法原地工作时指算法所需辅助空间为常量,O(1)。