浅谈时间复杂度以及空间复杂度
2017-06-12 18:25
155 查看
研究意义:
时间复杂度和空间复杂度是衡量一个算法效率的重要标准。学会分析,才能更好的判断一个算法的好坏。
必备知识:
语句频度:是指一条语句在该算法中重复执行的次数。
数量级:是用来衡量和估计,在平时的生活中如果没有特殊标记都是指以10为底数。
T(n):表示算法中所有语句频度之和。n为问题规模。
主要内容:
算法的时间复杂度主要是研究T(n)的数量级,因为算法的基本运算(深层循环的语句)的数量级与T(n)的数量级相同,所以经常通过研究算法的基本运算的数量级来研究算法的时间复杂度f(n),表示为T(n)=Of(n).O的含义是T(n)的数量级。f(n)中取随n增长最快的一项将其系数置为1作为时间复杂度的度量,如f(n)=3n+3n^2其时间复杂度为n^2。
算法的规模不仅与n有关,也取决于输入数据的性质。
如:(简单的查找程序)
int a
={…………};
i=n-1;
while(i>=0&&(a[i]!=k))
i--; -----------------------3
语句3为基本运算,而语句3的频度不仅与n的规模有关,还与输入的k值有关。
当输入的k值不在数组中时,语句频度为n。
当输入的k值是数组的最后一个元素时,语句频度为0。
最坏时间复杂度:是指在最坏情况下,算法的时间复杂度。(通常考虑)
平均时间复杂度:是指所有可能输入的所有实例在等概率出现的情况下,算法的期望运行时间。
最好时间复杂度:是指在最好情况下,算法的时间复杂度。
加法原则T(n)=T1(n)+T2(n)+T3(n)=O(f1(n))+O(f2(n))+O(f3(n))=max(O(f1(n)),O(f2(n)),O(f3(n)))
乘法原则T(n)=T1(n)*T2(n)=O(f1(n)*O(f2(n))=O(f1(n)*f2(n))
常见的渐进时间复杂度有:
O(1)<O(long2n)<O(n)<O(nlong2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
分析示例:
3n+2=O(n)
3n+3=O(n)
100n+6=O(n)
10n2+4n+2=O(n2)
6*2n+n2=O(2n)
1.void mult(int a[], int b[], int& c[] ) {
// 以二维数组存储矩阵元素,c 为 a 和 b 的乘积
for (i=1; i<=n; ++i){
for (j=1; j<=n; ++j) {
c[i,j] = 0;
for (k=1; k<=n; ++k)
c[i,j] += a[i,k]*b[k,j]; }
}
基本运算: c[i,j] += a[i,k]*b[k,j];时间复杂度为n*n*n即n^3
2.下列程常段的时间复杂度是
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j+1)
count++;
基本运算:count++;时间复杂度为:nlong2n
分析:外层循环执行一次内层循环执行n次
外层循环每执行一次 k=k*2 设执行x次 则 循环结束条件为 2^x<=n 则 x<=long2n
内外层相乘则为 n*long2n
以上均为非递归程序,比较简单,可以直接累计次数。
3.int fact(int n)
{
if(n<=1) return 1;
return n*fact(n-1);
}
分析:T(n)=1+T(n-1)=1+1+T(n-2)=1+1+1+T(n-3)=……=n-1+T(1)所以时间复杂度为n
空间时间复杂度:是指所消耗的存储空间定义为S(n).若所需存储量依赖于特定的输入,
则通常按最坏情况考虑。
存储空间主要包括:输入数据所占空间,程序本身所占空间,辅助变量所占空间
算法原地工作是指算法所需辅助空间为常量。
如有错误请大家及时指出,本人感激不尽。
时间复杂度和空间复杂度是衡量一个算法效率的重要标准。学会分析,才能更好的判断一个算法的好坏。
必备知识:
语句频度:是指一条语句在该算法中重复执行的次数。
数量级:是用来衡量和估计,在平时的生活中如果没有特殊标记都是指以10为底数。
T(n):表示算法中所有语句频度之和。n为问题规模。
主要内容:
算法的时间复杂度主要是研究T(n)的数量级,因为算法的基本运算(深层循环的语句)的数量级与T(n)的数量级相同,所以经常通过研究算法的基本运算的数量级来研究算法的时间复杂度f(n),表示为T(n)=Of(n).O的含义是T(n)的数量级。f(n)中取随n增长最快的一项将其系数置为1作为时间复杂度的度量,如f(n)=3n+3n^2其时间复杂度为n^2。
算法的规模不仅与n有关,也取决于输入数据的性质。
如:(简单的查找程序)
int a
={…………};
i=n-1;
while(i>=0&&(a[i]!=k))
i--; -----------------------3
语句3为基本运算,而语句3的频度不仅与n的规模有关,还与输入的k值有关。
当输入的k值不在数组中时,语句频度为n。
当输入的k值是数组的最后一个元素时,语句频度为0。
最坏时间复杂度:是指在最坏情况下,算法的时间复杂度。(通常考虑)
平均时间复杂度:是指所有可能输入的所有实例在等概率出现的情况下,算法的期望运行时间。
最好时间复杂度:是指在最好情况下,算法的时间复杂度。
加法原则T(n)=T1(n)+T2(n)+T3(n)=O(f1(n))+O(f2(n))+O(f3(n))=max(O(f1(n)),O(f2(n)),O(f3(n)))
乘法原则T(n)=T1(n)*T2(n)=O(f1(n)*O(f2(n))=O(f1(n)*f2(n))
常见的渐进时间复杂度有:
O(1)<O(long2n)<O(n)<O(nlong2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)
分析示例:
3n+2=O(n)
3n+3=O(n)
100n+6=O(n)
10n2+4n+2=O(n2)
6*2n+n2=O(2n)
1.void mult(int a[], int b[], int& c[] ) {
// 以二维数组存储矩阵元素,c 为 a 和 b 的乘积
for (i=1; i<=n; ++i){
for (j=1; j<=n; ++j) {
c[i,j] = 0;
for (k=1; k<=n; ++k)
c[i,j] += a[i,k]*b[k,j]; }
}
基本运算: c[i,j] += a[i,k]*b[k,j];时间复杂度为n*n*n即n^3
2.下列程常段的时间复杂度是
count=0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j+1)
count++;
基本运算:count++;时间复杂度为:nlong2n
分析:外层循环执行一次内层循环执行n次
外层循环每执行一次 k=k*2 设执行x次 则 循环结束条件为 2^x<=n 则 x<=long2n
内外层相乘则为 n*long2n
以上均为非递归程序,比较简单,可以直接累计次数。
3.int fact(int n)
{
if(n<=1) return 1;
return n*fact(n-1);
}
分析:T(n)=1+T(n-1)=1+1+T(n-2)=1+1+1+T(n-3)=……=n-1+T(1)所以时间复杂度为n
空间时间复杂度:是指所消耗的存储空间定义为S(n).若所需存储量依赖于特定的输入,
则通常按最坏情况考虑。
存储空间主要包括:输入数据所占空间,程序本身所占空间,辅助变量所占空间
算法原地工作是指算法所需辅助空间为常量。
如有错误请大家及时指出,本人感激不尽。
相关文章推荐
- 不用额外空间的整数交换以及时间复杂度为O(n)空间复杂度为O(1)的排序算法
- 常见排序算法以及时间复杂度和空间复杂度
- 计数排序的思想,时间空间复杂度细致分析以及java源代码实现
- 常见排序算法以及对应的时间复杂度和空间复杂度
- 浅谈时间复杂度及空间复杂度的计算。
- 各种排序算法的稳定性以及时间和空间复杂度分析
- 排序算法的时间复杂度以及空间复杂度
- 动态规划求数组中和最大字串的值 以及 字符串的循环移位(要求空间复杂度O(1),时间复杂度O(n))
- 排序算法的时间复杂度以及空间复杂度 计数排序
- 排序算法的C语言实现以及各个算法的时间复杂度和空间复杂度分析(冒泡排序)
- 浅谈时间复杂度与空间复杂度
- 浅谈时间复杂度和空间复杂度
- 在线性时间和空间复杂度内,求大小相邻两元素之差的最大值
- (C#)实现时间复杂度为O(n)空间复杂度为O(1)的数组中奇偶数分离
- 算法复杂度——时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- C语言的算法的时间与空间复杂度
- 算法的时间复杂度和空间复杂度
- 时间复杂度和空间复杂度