数据结构基础2——算法及算法分析
作者:互联网
## 1、算法
为了解决某类问题而规定的一个有限长的操作序列
### (1)特性:
#### 有穷性
算法必须在执行有穷步之后结束,且每一步必须在有穷时间内完成
#### 确定性
对于每种情况下所应该执行的操作,在算法中都有明确规定,不会产生二义性,使算法的执行者或阅读者都能明确了解其含义和执行方法
#### 可行性
算法中的所有操作都可以通过已实现的基本操作运算执行有限次来实现
#### 输入
算法可以有零个或多个输入
#### 输出
算法必须至少有一个输出
### (2)评价算法优劣的标准
#### 正确性
在合法的输入下,能在有限时间内得到正确的结果
#### 可读性
一个好的算法,首先应该便于人们理解和互相交流,其次应该能够在计算机中运行
#### 健壮性
对于非法输入,算法应该能进行正确的回应及作出适当处理,而不是直接停止运行
#### 高效性
包括时间和空间两部分。
时间效率指算法设计合理,执行效率高,可以用时间复杂度来度量
空间效率指算法占用内存合理,可以用空间复杂度度量
但是,在很多时候,这两个标准是相互影响的:追求好的时间复杂度时,可能会导致占用耕过的内存;追求好的空间复杂度时,可能会导致消耗更多的时间。
但是,通常情况下,优先考虑时间复杂度。
## 2、时间复杂度
==问题规模==:算法求解问题时输入量的多少,是问题大小的本质,一般用n来表示
==语句频度==:一条语句重复执行的次数
为了排除外界因素的影响,通常假设算法执行每条语句所用的时间均为单位时间,所以算法的时间复杂度可以简化为该算法的语句频度之和。
==语句频度之和==可以用问题规模n的函数f(n)来表示。
对于简单算法,可以很容易的求出所有语句的频度之和f(n);但对于复杂的算法,要求出f(n)就比较困难。所以,可以只用==基本语句==的语句频度之和来表示一个算法的时间复杂度。
==基本语句==:算法中重复执行次数与执行时间成正比的语句,对算法的执行时间的贡献最大。其语句频度之和也可以用问题规模n的函数f(n)表示。
因为算法的执行时间通常是随着问题规模的增加而增加的,所以==考虑算法的时间复杂度通常只需考虑其增长趋势即可==。在这种情况下,观察基本语句频度之和f(n)的==最高阶==即可。即,当问题规模n趋近无穷大时,基本语句的语句频度之和f(n)与其最高阶的==增长趋势相近==。
所以,时间复杂度T(n) = O(f(n)),此处的==f(n)即为基本语句频度之和的最高阶==
例子:假设有基本语句频度之和f(n) = 2n^3 + 3n^2 + 2n + 1,则有T(n) = O(n^3)。
一般考虑算法的==最坏时间复杂度==和==平均时间复杂度==。
## 3、空间复杂度
算法的空间复杂度也是问题规模n的函数,记作:S(n) = O(f(n))。
一个算法在计算之中被执行时,除了需要存储算法本身的空间,通常还需要一些辅助空间。
所以,算法的空间复杂度即是辅助空间对于问题规模n的函数。如果是一个常数,则成算法原地工作,记作:S(n) = O(1)。
例子:设计算法,将数组a中的元素倒序存入原数组中。
```C
//算法1,只需要一个辅助空间t,所以空间复杂度为S(n) = O(1)
for(i = 0; i < n; i++)
{
t = a[i];
a[i] = a[n - 1 - i];
a[n - 1 - i] = t;
}
//算法2需要借助另一个与数组a大小相同的数组b,所以其空间复杂度为S(n) = O(n)
for(i = 0; i < n; i++)
{
b[i] = a[n - 1 - i];
}
for(i = 0; i < n; i++)
{
a[i] = b[i];
}
```
标签:分析,语句,复杂度,####,算法,时间,频度,数据结构 来源: https://blog.51cto.com/u_15058552/2984976