请注意:有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同。
例子:顺序查找,在数组a[i]中查找值等于e的元素,返回其所在位置。
for(i=0;i<n;i++)
if(a[i]==e)return i+1;//找到,则返回是第几个元素 i+1
return 0;//全部执行完,但是没有找到。n
最坏时间复杂度:即在最坏的情况下,算法的时间复杂度。
平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
最好时间复杂度:指在最好的情况下,算法的时间复杂度。
一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用O加法法则和乘法法则,计算算法的时间复杂度。
1.加法规则
T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
2.乘法规则
T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n))
算法时间效率的比较
当n取的很大的时候,指数时间算法和多项式时间算法在所需要时间上非常悬殊。
复杂度由低------>高
O(1)--->O(log2(n))--->O(n)--->O(n log2(n))--->O(n^2)--->O(n^3)---->O(n^k)---->O(2^n)
渐进空间复杂度
空间复杂度:算法所需要存储空间的度量
S(n)=O(f(n)) 其中n为问题的规模(或者大小)
算法要占据的空间
1.算法本身要占据的空间+输入输出+指令+常数+变量等
2.算法需要使用的辅助空间
例子:
将一堆数组a中的n个数逆序存放到原数组中。
1.第一个与最后一个交换,一共n/2次
S(n)=O(1)
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
2.将数组的元素放到另外一个数组里面
S(n)=O(n)
for(i=0;i<n;i++)
b[i]=a[n-i-1];
for(i=0;i<n;i++)
a[i]=b[i];
总结:
抽象数据类型 = 数据的逻辑结构 + 抽象运算(运算的功能描述)
数据的逻辑结构---->数据的存储结构------>算法1....n