浅谈时间复杂度以及空间复杂度
来源:互联网 发布:plc编程梯形图简单实例 编辑:程序博客网 时间:2024/06/05 12:48
研究意义:
时间复杂度和空间复杂度是衡量一个算法效率的重要标准。学会分析,才能更好的判断一个算法的好坏。
必备知识:
语句频度:是指一条语句在该算法中重复执行的次数。
数量级:是用来衡量和估计,在平时的生活中如果没有特殊标记都是指以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[n]={…………};
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).若所需存储量依赖于特定的输入,
则通常按最坏情况考虑。
存储空间主要包括:输入数据所占空间,程序本身所占空间,辅助变量所占空间
算法原地工作是指算法所需辅助空间为常量。
如有错误请大家及时指出,本人感激不尽。
- 浅谈时间复杂度以及空间复杂度
- 浅谈时间复杂度和空间复杂度
- 浅谈时间复杂度和空间复杂度
- 时间复杂度,空间复杂度
- 时间复杂度&空间复杂度
- 时间复杂度 & 空间复杂度
- 时间复杂度、空间复杂度
- 时间复杂度 空间复杂度
- 时间复杂度&空间复杂度
- 时间复杂度/空间复杂度
- 时间复杂度+空间复杂度
- 浅谈时间复杂度及空间复杂度的计算。
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度和空间复杂度
- 时间复杂度与空间复杂度
- 多线程之DownCountLatch CyclicBarrier和Semaphore
- Linux系统下Tomcat多实例安装及配置说明
- 线程的生产者消费者模型
- python下pymysql的问题
- Android布局——shape的使用
- 浅谈时间复杂度以及空间复杂度
- jenkins部署服务脚本
- 1050. 螺旋矩阵(25)
- 4G时代已是过去 5G将加速物联网应用落地
- JAVA中为什么0.55*100不等于55.0的思考
- Idea数据库操作(Right Join)
- ognl表达式的使用和值栈
- JavaScript/js高手进阶必备神器 --- Underscore.js 实用库(js超好用工具库,js函数式编程工具库)
- 动态加载布局LayoutInflater.inflate()源代码解析