首页 > 其他分享 >时间复杂度的理解和计算

时间复杂度的理解和计算

时间:2022-08-24 22:49:57浏览次数:59  
标签:nolimits right int 复杂度 理解 mathop 计算 left

时间复杂度的理解和计算

前言:重在记录,可能出错。

一、算法执行时间的表示

  研究一个算法,我们先给出条件——忽略硬件的影响、忽略待处理数据的具体值,那么显而易得的,不同的单条语句执行时间相同,记为单位时间t。此时,算法执行时间T与所有语句执行次数\(f\)有关,而所有语句执行次数\(f\)又与待处理数据规模n有关,因此,T与n有关。

image

  我们用函数\(f \left( n \right)\)、T(n)分别表示所有语句执行次数\(f\)和算法执行时间T和待处理数据规模n之间的关系。即:

\[\color{red}{T \left( n \left) =f \left( n \left) ∙t\right. \right. \right. \right. } \]

二、时间复杂度的理解

1. 时间复杂度是用来大约表示算法执行时间随着待处理数据规模增大的增长趋势。

2. 我们在测算某个算法的时间效率时,无法做到将每个算法都运行一次。因此,我们通常采用“纸上谈兵”的方法,即在纸面上利用分析估算来研究一个算法的时间效率。

3. “纸上谈兵”要谈什么兵?对,比较不同算法的T(n)的大小,怎么比?对!比值!!在实际生活中,我们通常研究的是\({n \to \infty }\)时的值的大小,哦~,求极限。

\[{\mathop{{lim}}\limits_{{n \to \infty }}\frac{{T\mathop{{}}\nolimits_{{1}} \left( n \right) }}{{T\mathop{{}}\nolimits_{{2}} \left( n \right) }}\text{ }\text{ }\text{ }\text{?}\text{ }\text{ }\text{ }1} \]

  分析这个式子,我们发现在n趋近于∞的过程中,当\({T\mathop{{}}\nolimits_{{1}} \left( n \right) }\)的增长快于\({T\mathop{{}}\nolimits_{{2}} \left( n \right) }\)时,必然存在一个\({n\mathop{{}}\nolimits_{{0}} \in R\mathop{{}}\nolimits^{{+}}}\),满足\({n > n\mathop{{}}\nolimits_{{0}}},{T\mathop{{}}\nolimits_{{1}} \left( n \left) > T\mathop{{}}\nolimits_{{2}} \left( n \right) \right. \right. }\)。对于单调递增函数,反过来依然成立,也就是说:\({\mathop{{lim}}\limits_{{n \to \infty }}T \left( n \right) }\)越大,$T \left( n \right) $增长越快。

  我们用时间复杂度来表示函数的增长趋势,用大O符号来表示函数无穷大渐近的值(在这里可以理解为一个单调递增函数的最大值),则O越大,时间复杂度越大。常见增长趋势大小的有O(常数)<O(对数函数)<O(幂函数)<O(指数函数)。

为了便于分析,我们直接说时间复杂度等于$\color{red}{O\left(f\left(n \left) \right) \right. \right. } $,也就是用O来表示增长趋势

三、时间复杂度的计算

\({O\left(f\left(n \left) \right) \right. \right. }\)来表示增长趋势,显而易得的,有以下结论:

1. 趋势乘以一个常数k,趋势不变。

2. 待处理数据的规模n不影响趋势的大小

3. 大趋势加上一个小趋势仍等于自身大趋势不变。

用公式表示以上两个结论,我们就可以得到时间复杂度的计算公式:

1. \(\color{red}{O \left( kf \left( n \left) \left) =O \left( f \left( n \left) \right) \right. \right. \right. \right. \right. \right. }\)

2. \(\color{red}{O \left( f \left( a \left) \left) =O \left( f \left( b \left) \right) \right. \right. \right. \right. \right. \right. }\)

3. \(\color{red}{O \left( f \left( n \left) +g \left( n \left) \left) =O \left( max \left\{ O \left( f \left( n \left) \left) ,{\left. O \right( }g \left( n \left) \left) \left\} \right) \right. \right. \right. \right. \right. \right. \right. \right. \right. \right. \right. \right. \right. \right. \right. }\)

例:有以下程序片段,求时间复杂度:

1.

void fun(int n){
	int a;//执行1次
	for(int i=0;i<6;i++){//i=0执行1次,i<6执行7次,i++执行6次
		a=i;//执行6次
	}
}
所有语句执行次数\(f\)(n)=1+1+7+6+6=21,时间复杂度为:
O(\(f\)(n))=O(21)=O(21*1)=O(1)=O(6*1)=O(6)

2.

void fun(int n){
	int a;//执行1次
	for(int i=0;i<n;i++){//i=0执行1次,i<n执行n+1次,i++执行n次
		a=i;//执行n次
	}
}
所有语句执行次数\(f\)(n)=1+1+(n+1)+n+n=3n+3,时间复杂度为:
O(\(f\)(n))=O(3n+3)=O(max{O(3n),O(3)})=O(3n)=O(n)

3.

void fun(int n){
	int a;//执行1次
	for(int i=0;i<n;i++){//i=0执行1次,i<n执行n+1次,i++执行n次
		for(int j=0;j<n;j++){//j=0执行n次,j<n执行n²+n次,i++执行n²次
			a=j;//执行n²次
		}
	}
}
所有语句执行次数\(f\)(n)=1+1+(n+1)+n+n+(n²+n)+n²+n²=3n²+4n+3,时间复杂度为:
O(\(f\)(n))=O(3n²+4n+3)=O(max{O(3n²),O(4n),O(3)})=O(3n²)=O(n²)

  综上,可以看出求时间复杂度时只需要求执行次数最多的语句的执行次数即可,执行次数最多的语句一般就是最深层的语句(最基本语句)。

4.

void fun(int n){
	int a;
	for(int i=1;i<n;i*=2){
			a=i;
		//设此语句执行x次,则2ˣ=n-Δ(n),0≤Δ(n)≤n-1,代表误差
		//两边同时取以2为底的对数得:
		//log₂2ˣ=log₂(n-Δ(n)),0≤Δ(n)≤n-1,代表误差,代表误差
		//xlog₂2=log₂(n-Δ(n)),0≤Δ(n)≤n-1,代表误差
		//x=log₂(n-Δ(n)),0≤Δ(n)≤n-1,代表误差
		}
	}
}
所有语句执行次数log₂(n-Δ(n)),0≤Δ(n)≤n-1,代表误差,时间复杂度为:
O(log₂(n-Δ(n)))=O(log₂n)=O(logn)
注:实际上根据换底公式,
\({O \left( log\mathop{{}}\nolimits_{{2}}n \left) =O \left( \frac{{log\mathop{{}}\nolimits_{{3}}n}}{{log\mathop{{}}\nolimits_{{3}}2}} \left) =O \left( \frac{{1}}{{log\mathop{{}}\nolimits_{{3}}2}}∙log\mathop{{}}\nolimits_{{3}}n \left) =O \left( log\mathop{{}}\nolimits_{{3}}n \right) \right. \right. \right. \right. \right. \right. }\),\(\frac{{1}}{{log\mathop{{}}\nolimits_{{3}}2}}\)是个常数
同理可得,所有logₓn样式的对数函数的趋势都相同。所以可以简写为logn

标签:nolimits,right,int,复杂度,理解,mathop,计算,left
From: https://www.cnblogs.com/wsgxg/p/16614529.html

相关文章

  • Mysql--计算方法
    四舍五入:round()select100/6as四舍五入前结果:16.6667selectround(100/6)as四舍五入后结果:17进一法:ceiling()select100/6as进一前结果:16.6667selectc......
  • KubeEdge边缘计算在顺丰科技工业物联网中的实践
    摘要:顺丰物联网平台负责人胡典钢为大家带来了“边缘计算在工业物联网中的应用实践与思考”,阐述了工业物联网的发展背景、整体架构设计以及边缘计算在此过程中承担的重......
  • 2023王道计算机考研教材思考题(未完持续更新中)
    第一章:计算机系统概述1.1计算机由哪几部分组成?以哪部分为中心?  计算机由运算器、控制器、存储器、输入设备及输出设备五大部分构成,现代计算机通常把运算器和控制器集......
  • 练习正则中,最难以理解的?
    贪婪模式(默认)非贪婪模式?:不使用?:的情况下:达到同样的效果,但代码更精简: ?=只是把:换成了=,但捕获的结果里已经不包含括号中的样式:?!继续把=换成了!,......
  • [转]计算机架构设计的8个伟大思想
    “Theseareeightgreatideasthatcomputerarchitectshaveinventedinthelast60yearsofcomputerdesign.Theyaresopowerfultheyhavelastedlongafter......
  • 深入理解Java中的Thread.sleep
    Thread.sleep()方法能够已毫秒为时间单位暂停当前执行的线程,参数值为毫秒不能为负数,否则将抛出IllegalArgumentException异常。Java线程休眠要点:1.它总是暂停当前执行的......
  • 计算机二级考试 C语言篇
    本篇仅适用于计算机二级考试C语言篇首先介绍一下二级考试时间问题(以本人考试2022年为例):一、2022年全国计算机二级考试时间 2022年全国计算机考试举办4次,(3月、......
  • hadoop day2-内容理解
    进程理解HDFS相关(NN,DN,SSN)NameNode(NN)功能:1、接受客户端的读/写服务因为NameNode知道数据文件与DataNode的对应关系2、保存文件的时候会保存文件的元数据信息a......
  • (未完)CCF第24+25届全国计算辅助设计与图形学学术会议亮点
    ......
  • 8/23 深入理解计算机系统第九章
    9.3虚拟内存作为缓存的工具虚拟内存和物理内存的分页虚拟内存可以分为:未分配的,没有数据和它们相互关联,不占用磁盘空间。缓存的,当前已经缓存在物理内存中的已分配页。......