数据结构入门学习系列-2(算法的时间复杂度)
来源:互联网 发布:web数据库建模工具 编辑:程序博客网 时间:2024/06/07 02:37
算法:
有穷性 确定性 可行性 输入(可选) 输出
算法效率:
事后统计:计算机上的运行时间
事前分析:求出该算法一个时间界限函数
算法中基本操作重复执行的次数是问题规模n的某个函数,T(n)=O(f(n)),时间复杂度。用最深层循环内的语句中原操作的执行频度。
如果T(n) 和 f(n) 是n 的函数,当n →∞ 时,有T(n) / f(n) → c (常数c ≠ 0),记作:T(n) = O(f(n)),称O(f(n)) 为算法的渐近时间复杂度,简称时间复杂度。
时间复杂度一般有如下几种:
- O(1),O(n),O(log(n)),O(nlog(n)),O(Nk)
公理:若A(n)=amnm+am-1nm-1+……+a0是一个m次多项式,则A(n)=O(nm)
常用的多项式时间算法:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)
常用的指数时间算法:
O(2n)<O(n!)<O(nn)
如果能把一个指数时间复杂度的算法,简化为多项式时间复杂度,那么就是大牛
了。
下面看一个简单算法,判断一个值是否为质数:
#include<stdio.h>#include<math.h>int main(){ //判断是否是质数 int i=2,n; printf("请输入一个正整数:\n"); scanf("%d",&n); while((n%i)!=0 && i*1.0 < sqrt(n)) i++; if(i*1.0>sqrt(n)) printf("%d是一个质数",n); else printf("%d不是一个质数",n);}由上述代码可以看出,嵌套的最深层语句是i++,循环次数主要是由sqrt(n)来决定,所以该代码时间复杂度是:O(n1/2)
再来看一个常用算法,冒泡排序:
#include<stdio.h>#define NUM 5void sort(int a[], int n){ int i,j; for(i=0;i<n-1;i++) //排序n-1趟 for(j=0;j<n-i-1;j++){//每一趟做的比较 if(a[j]>a[j+1]){ //相反顺序改一下比较符号 a[j]=a[j+1]+a[j]; a[j+1]=a[j]-a[j+1]; a[j]=a[j]-a[j+1]; } }}int main(){ int a[NUM]={4,8,2,3,7}; sort(a,NUM); printf("排序后的数据为:"); for(int i=0;i<NUM;i++) printf("%d ",a[i]);}最好情况复杂度:0
最坏情况下复杂度:1+2+....+n-1=n(n-1)/2 也就是O(n2)
阅读全文
0 0
- 数据结构入门学习系列-2(算法的时间复杂度)
- 数据结构和算法学习(2)-时间复杂度
- 数据结构和算法学习系列之最大子序列求和问题的O(N)时间复杂度
- 数据结构(四)算法的时间复杂度
- 数据结构(算法的时间复杂度和空间复杂度)
- 数据结构-算法的时间复杂度
- 数据结构与算法学习笔记(一)几个低时间复杂度的算法
- 数据结构和算法--时间复杂度学习总结
- 数据结构-算法-时间复杂度
- 数据结构和算法学习02-时间复杂度和空间复杂度
- 数据结构:算法的时间复杂度求法
- 数据结构——算法的时间复杂度
- 常见的数据结构与算法时间复杂度
- 数据结构和算法学习——2 时间复杂度(9.21更新完成)
- 数据结构 常用的算法的时间复杂度和空间复杂度
- 数据结构基础篇(2)--算法时间复杂度
- 数据结构-算法效率的度量-时间复杂度和空间复杂度
- 数据结构--算法(时间复杂度和空间复杂度)
- 手机版h5城市选择
- 全注解方式整合spring+mybatis模拟springboot整合
- 文章标题
- Android中往sd卡中读写数据
- Java内存模型
- 数据结构入门学习系列-2(算法的时间复杂度)
- 深搜专题小结
- iOS 数组倒序方法
- Android中的事件传递机制学习
- Oracle同一数据库的 的不同用户赋权语句
- WSingle主题 – 可能是最好的WordPress小说主题,美观大方,功能强大
- 51单片机----基础知识
- 如何用TensorFlow和TF-Slim实现图像分类与分割
- 微信开发框架Java版