时间复杂度分析.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
O(n)
• 又叫做线性时间复杂度 • 例子:给定一个长度为n的序列,求最大值
O(nlogn)
• • • • • • • • 例子:对一个长度为n的无序序列A排序 归并排序大致框架 merge-sort(A,L,R) if L<R then MID=(L+R)/2 merge-sort(A,L,MID) merge-sort(A,MID+1,R) merge(A,L,MID,R)
各种时间复杂度
• O(1)<O(logn)<O(n1/2) <O(n) < < O(nlogn) <O(n×n1/2)< O(n2)<O(n3) < O(2n) < O(n!) < O(nn)
O(1)(常数时间)
• 不受数据规模的影响 •Βιβλιοθήκη Baidu例子:判断一个数的奇偶
O(logn)
• 数据规模不断减半 • 例子:二分查找 • 给定一个长度为n的有序序列 A[0],A[1],A[2]...A[n],询问一个数num在序 列中的位置
时间复杂度分析
什么是时间复杂度?
• 在计算机科学中,算法的时间复杂度是一 个函数,它定量描述了该算法的运行时间。 这是一个关于代表算法输入值的字符串的 长度的函数。时间复杂度常用大O符号表述, 不包括这个函数的低阶项和首项系数。
如何计算?
• 计算时间复杂度的过程,常常需要分析一 个算法运行过程中需要的基本操作,计量 所有操作的数量。
O(n×n1/2)
• 例子:给定一个长度为n的无序序列,m次询问, 每次询问区间[l,r]的最大值 • 平方分割法:把n个元素每sqrt(n)个分在一个桶内 进行维护 • 在预处理过程中,对每个sqrt(n)区间计算出最值 进行记录,由于有sqrt(n)个桶,所以预处理的开 销为O(n)。查询时对于不包含在桶中的部分进行 线性查找,复杂度为O(sqrt(n)), 对于桶中最值的 合并复杂度为O(sqrt(n)),所以查询的时间复杂度 也是O(sqrt(n)). • 总时间复杂度为O(n×sqrt(n))
O(n!)
• 例子:生成1-n的所有排列
O(n2)
sum = 0; for i =1 to n do for j=1 to n do sum = sum + a[i][j];
• • • • 基本操作:加法,乘法 忽略循环变量i和j的改变时间 共n2次基本操作 时间复杂度为n2
O(2n)
• 例子:求集合大小为n的所有子集 • 大家都知道子集个数为2n个
int L=0,R=n-1;
• • • • • • •
while(L<=R) { int mid=(L+R)/2; if(a[mid]>=num) R=mid-1; else L=mid+1; } printf("%d\n",L);
O(n1/2)
• 例子:判断一个数是否是素数 • for i=2 to sqrt(n) 依次判断是否能够整除n即 可