常见的算法时间复杂度计算分析-总结

算法时间复杂度分析 一、算法复杂度 算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合,简单来说就是解决特定问题求解步骤的描述。对于一个问题,一旦某种算法给定并且是正确的,那么重要的一步,就是确定该算法将需要多少时间或者空间等资源量的问题。如果一个问题的求解算法竟然需要长达一年的时间,那么这种算法就很难有什么用处了,同样,一个需要若干个GB内存的算法在当前大多数机器上也是无法使用的。 算法复杂度分为时间复... 阅读详情
AI摘要

本文深入解析了不同算法的时间复杂度,包括O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)、O(2^n)等常见复杂度等级,通过具体实例如循环、递归、排序算法等,详细阐述了如何计算和理解各种时间复杂度。

如何计算时间复杂度:
  1. 非递归算法,通常是计算算法中循环的执行次数。那么就直接设该代码循环了k次 , 找出规模n与k的关系,得到k的级数趋近后的式子,既为时间复杂度。
  2. 2. 如果是递归算法,且只进行一次递归调用,有以一种方法是先求出深度depth,求出每一次执行的时间复杂度T ,总的时间复杂度就是depth * T(和用下面的方法原理是一样的。。)
  3. 如果递归比较复杂,那么套用递归算法的时间复杂度公式:T[n] = aT[n/b] + f(n) ,T [1] = O(1)。f(n)代表每次执行循环代码的复杂度。然后用迭代法或者公式法等这些方法来求解。
常见的算法时间复杂度分析:
O(1)< O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) <O(n!) < O(n^n)

一:O(1):

程序段的执行时间是一个与问题规模n无关的常数,也就是算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
1.1简单循环实现
//与n无关的赋值或者判断操作
sum=0;  
//与输入规模n无关的有限循环
for(i=1;i<=C;i++){  

}

二:O(logn) :

注:logn底数默认为2,因为对数之间是可以互相转换,大概意思就是无论底数是什么的对数函数都可以化简成一个常数C×以2为底数的对数函数,然后级数趋近就都变成了log2(n)。

2.1简单循环实现
for (int i = 1; i <= n; i = i * 2) {
    语句1;
}
这里我们可以把求时间复杂度看成求这个循环内语句一执行了多少次的问题。(但时间复杂度是一个级数趋近的变化概念)
假设该程序一共循环了k次,即第k次循环就会退出(注意增加条件为i = i * 2)
第1次 ,i = 1
第2次 ,i = 1*2 = 2^1
第3次 ,i = 122 = 2^2
第4次 ,i = 122*2 = 2^3
第k次 (最后一次),i = 122*2…*2 = 2^(k-1)
第k次的时候,必然满足i <= n的条件,也即必然满足等式 2^(k-1) = n ,便反求得k = logn + 1 ,故O(n)= logn;
类似的乘法增长循环求时间复杂度都可以设循环次数k然后倒推出k,进而级数趋近变换得到时间复杂度。
2.2二分查找/折半查找
同样假设这个循环一共执行了k次,每一次循环都会将规模n除以2;
第1次,规模为n,
第2次,规模为n/2,
第3次,规模为n/4,
第k次,规模为n/[2^(k-1)],
最后结束的时候,n就只有1了无法再分,必然满足 n/(2^k) = 1,然后化简得 k = logn。于是时间复杂度为logn。
//二分查找
low = 0;
high = a.lenth() = n; 
while(low<=high){
   mid=(low+high)/2;
   if(goal==a[mid]){
       flag=1;
   	break;
   }
   if(guess>a[mid]){
   	low=mid+1;
   }
   if(guess<a[mid]){
       high=mid-1;
   }		
}
2.3平衡二叉树查找
树的结点数为n
理解一:

同样假设执行了递归函数k次,每执行一次都会把一个子树及以下的树抛弃,相当于把这个问题规模n给除以了2,那么同样结束时候会有n / 2^k = 1然后化简得 k = logn。于是时间复杂度为logn。

理解二:

如果递归函数中,只进行一次递归调用,即主函数没有循环调用递归函数。且递归深度为depth,在每个递归函数中,时间复杂度为T,则总体的时间复杂度为O(T * depth)。这个也很好理解,就是执行次数 * 每次的时间 = 总的时间。

解释:这里由于是平衡二叉树的原因,递归的深度depth其实就是该树的深度,也就是 depth = (logn) +1 (二叉树性质),每次的时间复杂度为T = O(1),故总的时间复杂度depth * T 化简后也就是O(logn)。
理解三:

递归算法的时间复杂度公式 T[n] = aT[n/b] + f(n) ,f(n)为单次执行的时间复杂度。

这里T[n] = T [ n/2],迭代的得到第k次递归有T[n] = T [ n / (2^k)] ; 最后一次递归必有T[1] = T [ n / (2^k)] ,也即 n / (2^k )=1 。故有k = logn,所以时间复杂度为:O(log n )。

//二叉树查找
//树的结点为n
BiTree Search(BiTree T,ElemType e){
	if(T==NULL){
		//递归返回空值 
		return NULL;
	}else if(e == T->data){
		//递归返回查找到的指针 
		return T ;
	}else{
		//令一个结点指针等于左边结点 
		BiTree temp1= Search(T->lchild,e);
		//令一个结点指针等于右边结点  
		BiTree temp2= Search(T->lchild,e);
		return temp1==NULL?temp2:temp1;

	}
}

三:O(n):

3.1简单循环实现
假设循环了k次 ,则满足k = n,故时间复杂度为O(n)。
for (int i = 1; i < n; i++) {
    语句1;
}
3.2阶乘
理解一:阶乘递归的函数执行了n+1,每次执行的复杂度为O(1);总时间复杂度为O(n),同样用depth * T 的方法也可以计算出来O(n);
理解二:循环递归一共循环了n次,时间复杂度为O(n)。
//递归
Factorial(int  n){
    if(n==0)
        return 1;
    else
        return Factorial(n-1)*n;
}
//循环
sum = 1;
while(i<=n){
    sum*=i;
    ++i;
}
3.3 链表合并 (一道很奇怪的问题,有人说选B也有选D的)
已知两个长度分别为m 和 n 的升序链表,若将它们合并为一个长度为 m+n 的降序链表,则最坏情况下的时间复杂度是( D )。
  • A O(n)
    
  • B O(m+n)
    
  • C O(min(m ,n))
    
  • D O(max(m,n))
    
参考代码:
while(i<A.length && j<B.length){    //循环两两比较,小的存入结果
    if(A.data[i]<B.data[j])
        C.data[k++]=A.data[i++];
    else
        C.data[k++]=B.data[j++];
}
//再链接上没比较完的顺序表、
/*语句*/
我觉得答案确实应该偏向于O(max(m,n));因为我所理解的时间复杂度更类似一个级数的收敛化简,循环跳出的条件为一个链表的长度,那么最坏的情况应该是单纯的max(m,n)。尽管最坏情况下有可能执行了m + n次判断。两个答案的级数上都是线性级别O(n)。

四、O(nlogn): 排序中容易看到

4.1 简单循环
for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j = j + i){ 
     	/*语句*/   
    }
}
理解:
当i=1时,内循环需要执行n次;
当i=2时,内循环需要执行n/2次;
当i=3时,内循环需要执行n/3次;
当i=n-1时,内循环需要执行n/n-1次;
当i=n时,内循环需要执行n/n次;
所以内循环总执行次数:1+1/2+1/3+……+1/n=lnn (高数下册上有写的。。级数那一章) ;
外循环为n次;
故总的次数为内外循环次数相乘为 n * lnn ,所以总的时间复杂度为n logn !
4.2堆排序
//堆排序
int arr[n+1] = {0,5,4,1,2,6,8,7,3}; // n = 8;
int main(){
    //自下向上对非叶结点进行adjust 
    for(i = n / 2 ; i >= 1 ; i--){
        //范围n没变 结点主动变化 
        HeapAdjust(i,n);
    } 
    //自上向下对每一个结点进行adjust 
    for(i = n ; i >= 1 ; i--){
        swap(1,i);
        //范围因为断尾所以主动变化 结点1一直不变 
        HeapAdjust(1,i-1);
    }
}

//对第i个结点进行到范围为n的调整堆排序 
int HeapAdjust(int i,int n){
	int temp = arr[i],j;
	//j 为左子节点,j+1为右子节点 
	for(j = i*2 ; j <= n ; j=j*2){
		//能进入则j表示没有超过当前范围n ,即左节点存在 
		if(j+1 <= n && arr[j]<arr[j+1]){
			//能进入这里则表示 j+1没有超过当前未排序范围,即右节点存在
			//j指向左右结点最大值 
			j++;
		}
		if(arr[j] > temp ){
			//能进入这里表示子节点够代替父节点,
			//隐含了交换父子结点的操作  arr[j] = temp;
			//大的子节点变成父节点 
			arr[i] = arr[j]; 
			//那么交换后还要进行对交换成子节点的原父亲结点堆调整 i=j 
			i = j;
			//1使i指向的新的待调整堆顶  2实现了后最一步统一交换 
		}else{
			break;
		}
		arr[i] = temp;
	}
} 

1. 从第一个非叶子结点开始到第一个结点进行堆调整
2. 堆调整:从当前结点的两个儿子结点中取出一个最大的与之比较:
	大就交换;并把当前结点变成与之交换的儿子结点,再次进行堆调整。 
	小就退出返回第一步,进行下一个处理
3.然后把堆顶和堆尾交换,断尾,再次对新堆顶进行堆调整,直到只剩一个。
分析:
main函数里第一个for共循环了 n/2 次,O(n);
第二个for共循环了 n次,分离里面的Heap Adjust(1,n)函数单独分析:假设这个Heap Adjust的for循环共循环了k次,初试条件 j = 2 增加条件为j*=2,则满足2^k = n;这个for的时间复杂度为O(logn);则第二个for总的为O(nlogn).
所以T= O(n) + O(nlogn);故总的时间复杂度为 O(nlogn)。

补充:利用了二叉树的性质,堆排序在最好最坏情况下都是 nlogn。空间复杂度为O(1)。

4.3快速排序
//快速排序
int a[10] = {2,10,12,11,1,5,7,3,4,9};
int n = 10;
void fastSort(int low,int high){
    //如果只有一个数,无须处理
	//这里不能仅仅是等于; 
	//因为在边界处相遇的话,low会比high大1; 
	if (low >= high){
		return ;
	}
	//随便拿哪个数开始当标准都可以 只要你的规则能依次拿完所有数 
    //这里每次执行代码会都会默认把第一个数当成轴
	int left = low , right = high , temp = a[left];
	while ( left != right){
		while ( left != right && a[right] >= temp ){
			right--;
		}
		a[left] = a[right];
		while ( left != right && a[left] <= temp ){
			left++;
		}
		a[right] = a[left];
	}
//	a[left] = temp; left和right都可以。
	a[right] = temp;
	fastSort(low,left-1);
	fastSort(left + 1, high);
}
  /*
    1.传统每次都固定从第一个开始拿来当轴数,有可能发生最坏情况 ;
    2.一种安全的做法:随机选取 ,尽量避免出现最坏情况;
    	int i = rand()%(left,right)+left;
    	swap(a[i],a[left]);
    	fastSort(left,right);
    3.中值法(三值中值法);
    */
如何得到这个nlogn的平均时间复杂度?
理解一:
在最优的情况下,每次拿来当轴的数的正确位置都恰好在中间,能平分整个数组;每一次递归调用该函数都会把问题分为一半,这样一样就又成了一颗二叉树,结点数为规模n,其深度为logn+1,每一次调用该递归函数的代价,也就是进行找到轴数的正确位置所花费的时间为O(n),故 递归深度 * 每一次的代价 = n( logn + 1) ,故其复杂度为O(nlogn).
理解二:这里先利用公式套出它的递归时间复杂度公式:也就是
T[n] = O(1) ; n=1
T[n] = 2T[n/2] + n ; n>=1
解释:在最优的情况下,每次拿来当轴的数的正确位置都恰好平分整个数组;每一次执行代码会将数组分成两个规模为n/2的问题,并且还要加上找出正确位置所花费的时间,这里为线性时间复杂度O(n),n是实际传入的规模,所以为T[n] = 2T[n/2] + n !
用迭代法求解:
T[n] = 2T[n/2] + n //第一次递归
T[n] = 2*2 T[ n/ (2^2) ] + n+n //第二次递归
T[n] = 2 * 2 * 2 T[ n/ (222) ] +n+n+n //第三次递归
T[n] = 2^k T[ n/ (2^k) ] +n * k //第k次递归
当执行最后一次递归时候,必然有 T [n/ (2^k)] = T[1] = 1,也即 n / (2^k)=1 ,反解k,得到 k = logn, 然后反带入得T【n】= n + n *logn ;
又因为当n >= 2时,有nlogn >= n (也就是logn > 1),所以取后面的 nlogn;
综上所述所以为O(nlogn)!

补充:

最差的情况时间复杂度为O( n^2 )。怎么理解:假设每一次取到的元素就是数组中最小/最大的,然后相当于每一次都排好一个极端元素的顺序,没有进行规模划分,类比冒泡排序。

平均时间复杂为O(nlogn)。

递归时压入栈的数据占用的空间为O(logn),这是其空间复杂度。
4.4归并排序
//归并排序
int mergeSort(int left,int right,int temp[]){
	/*好像写不等于也可以 */ 
	if(left != right){
		int mid = (left + right) / 2;
		mergeSort(left,mid,temp);
		mergeSort(mid+1,right,temp);
		merge(left,mid,right,temp);  
	}
}
int merge(int left,int mid,int right,int temp[]){
	/*连接重排 left-mid 和 mid+1 - right 的数组*/
	int i = left; // 初始化i, 左边有序序列的初始索引
    int j = mid + 1; //初始化j, 右边有序序列的初始索引
    int t = 0; // 指向temp数组的当前索引
    while(i <= mid && j <= right){
    	if(arr[i]<arr[j]){
    		temp[t++] = arr[i++];
		}else{
			temp[t++] = arr[j++];
		}
	}
	while(i <= mid){
		temp[t++] = arr[i++];
	}
	while(j <= right){
		temp[t++] = arr[j++];
	}
	/*将部分排好的数组temp 复制粘贴给arr的相应部分*/
	int tempLeft = left;
	i = 0;
	while(i < t){
		arr[tempLeft++] = temp[i++];
	}
}

理解一: 和最优条件下的快速排序分析方法类似,mergeSort () 函数内部会把该次执行的规模n划分为两个规模为n/2的问题进行递归,也是可以画出一颗二叉树,其深度为logn+1;每一次递归都会执行 merge函数,这个函数代价很容易得出来,为O(n)n为当次传入的问题规模,第一次为n,第二次为n/2…然后总的时间复杂度为:depth * f(n) = (logn + 1 ) * n = O(nlogn).
理解二:得到其递归时间复杂度公式和最好情况快速排序一样,分析基本无差,参考上面的快速排序。
T[n] = O(1) ; n=1
T[n] = 2T[n/2] + n ; n>=1

…

最差和平均条件下都是nlogn的时间复杂度,这里更应关心其空间复杂度—临时的数组和递归时压入栈的数据占用的空间:n + logn;所以空间复杂度为: O(n)。

五:O(n^2):排序中容易看到

5.1简单循环
for(i=0;i<n;i++){
    for(j=0;j<n;j++){
    	/**/
    }
}

两层循环,时间复杂度:O(n^2);

5.2冒泡排序
//最外层可以是n-1层 
for(i = 0 ; i < n-1; i++){
    //内层需要记住 存在j+1那么j最多只能取到倒数第二位;且趟循环总是那次循环的最后一个数换到最值,选择排序则是那一趟的第一个数与最值下标k交换;
	for(j = 0; j < n-(i+1)  ; j++ ){
		if(arr[j] > arr[j+1])
			swap(j,j+1);
	}
}
理解:外循环一共会执行n-1次,而内循环条件为 j < n - (i + 1) ,按照循环规律依次写处内循环的循环次数:
当i=1时,内循环需要执行n-1次;
当i=2时,内循环需要执行n-2次;
当i=3时,内循环需要执行n-3次;
当i=n-2时,内循环需要执行n - (n - 2 + 1 ) = 1次;此时循环结束;
所以循环总执行次数:1 + 2 + 3 + … + n-1 = n(n-1) / 2 ;
故时间复杂度为O(N^2);
最坏最好情况下时间复杂度都是 (N^2);如何理解?
最好的情况就是上面推导的过程,也就是没有进swap进行交换,所以每一次内循环的代价都是0;所以为n(n-1) / 2;
最差情况下,也就是刚好倒序或者顺序,那么跟最好情况的区别就是每一次内循环都执行了swap函数,代价增加了三条交换语句,所以总时间复杂度增大为 3 *n(n-1) / 2 ,但其级数趋近后的式子仍然是O(n^2)!
平均情况当然也为O(N^2)咯。
5.3插入排序
//直接插入排序
#define n 8
int arr[n] = {8,7,6,5,4,3,2,1};
for( i = 1 ; i < n ; i++){
	temp = arr[i];
	for(j = i - 1 ; j >= 0 ;j--){
		//直接插入
		if(arr[j] > temp){
			arr[j + 1] = arr[j];
		}else{
			break;
		}
	}
	arr[j + 1] = temp;
}
分析:
最坏情况下:
i = 1 ,内循环 1次,
i = 2 ,内循环2次
…
i = n - 1 ,内循环n-1次;
故总的循环:1 + 2 + 3 + … + (n-1) = n *(n-1)/ 2;
故时间复杂度为O(n^2)!
5.4选择排序
//同冒泡 最外层可以是n-1层
for(i = 0 ; i < n - 1 ; i++){
	k = i;
    //让第一个数去换最值下标k
	for(j = i + 1 ; j < n ; j++){
		if(arr[k] > arr[j]){
			k = j ;
		}
	}
	if(k != i)
		swap(i,k);
}
同冒泡排序一样,外循环一共会执行n-1次,而内循环条件为 j < n - (i + 1) ,按照循环规律依次写处内循环的循环次数:
当i=1时,内循环需要执行n-1次;

…

当i=n-2时,内循环需要执行n - (n - 2 + 1 ) = 1次;此时循环结束;
所以循环总执行次数:1 + 2 + 3 + … + n-1 = n(n-1) / 2 ; 故时间复杂度为O(N^2);

六:O(2^n)

6.1斐波那契的递归算法
long Fibonacci(int n) {
     if (n == 0)
         return 0;
     else if (n == 1)
         return 1;
     else
         return Fibonacci(n - 1) + Fibonacci(n-2);
 }
有点像细胞分裂,每一次进入Fibonacci函数,就会分裂成两个小Fibonacci函数,这个两个小Fibonacci函数又会分裂出4个小小Fibonacci函数,至少要进入n次,故其时间复杂度为O(2^n)。

待更新

【初识数据结构】手把手教会你时间复杂度的计算方法 时间复杂度计算的是一个算法中的基本操作的执行次数,它的计算遵循大O的渐进表示法 阅读详情

相关推荐

你还在为时间复杂度不懂而担心吗???赶紧进来,这里手把手教你计算时间复杂度!!!

数据结构,时间复杂度的讲解,让我们对时间复杂度进一步的了解

qq_69369227的博客 5420

详解时间复杂度计算公式(附例题细致讲解过程)

这几天开始刷力扣上面的算法题,有些题目上面限制时间复杂度和空间复杂度,题目虽然写出来了,但是很没底。印象里数据结构老师讲过一点,沉睡的记忆苏醒了。只记得一个时间复杂度是O(n),空间复杂度是S(n)。for循环常常是O(n),具体是怎么算的不清楚。所以在看了相关的视频教学后,总结一下时间复杂度的计算公式,希望能给大家的学习带来帮助!

weixin_63866037的博客 8万+

算法复杂度分析-集大成篇

复杂度分析总是迷迷糊糊,来看看这篇吧!!

深入挖掘,筑基为先;知其然,知其所以然。 3536

时间复杂度计算方法以及常见的时间复杂度

数据结构,时间复杂度

m0_63850771的博客 6万+

【时间复杂度】常见几个机器学习算法的时间/空间计算复杂度分析和总结

ML中的时间和空间复杂度分析和计算小结

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 797

别只盯着Spectre!Cadence Virtuoso里APS和Spectre X该怎么选?一份给模拟IC新手的指南

本文深入解析Cadence Virtuoso中的三大仿真引擎Spectre、APS和Spectre X,帮助模拟IC新手根据电路规模、精度需求和计算资源做出智能选择。通过对比技术指标和应用场景,提供射频电路、混合信号系统和电源管理IC的优化仿真策略,显著提升设计效率。

weixin_26841743的博客 707

Python算法学习——时间复杂度(适用于蓝桥杯省赛)

本文讲解算法基础——时间复杂度,以及对时间复杂度的简单计算,和对时间复杂度的优化方法

2401_83240851的博客 1983

从Oracle到腾讯TDSQL数据库升级技术分享

腾讯TDSQL(Tencent Distributed SQL)是一款兼具关系数据库和NoSQL数据库优点的新型数据库,文章主要分享oracle升级为TDSQl数据库技术经验。

u012372850的专栏 2614

如何计算时间复杂度?

关于时间复杂度   算法的时间复杂度是用来描述一个算法的运行时间,时间复杂度通常 T(n) = O(f(n)) 来表示;我们用 n 来表示一个 问题的规模, T(n) 这个函数就表示算法的 时间复杂度 ;O(f(n)) 表示的是算法的 向上渐近时间复杂度 ; 至于向下渐近时间复杂度 Ω(ƒ(n)) 和平均渐进时间复杂度 Θ(ƒ(n)) ,时间复杂度一般都是采用向上渐近表示。 计算规则 1. 顺...

呆呆papa的博客 3万+

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和LWIP搞定RMII以太网(附复位与PHY地址避坑指南)

本文详细解析了STM32F407与LAN8720通过RMII接口实现以太网通信的完整流程,重点解决了网口不通的常见问题。从硬件连接到CubeMX配置,再到LWIP网络参数设置,提供了复位时序、PHY地址配置等关键细节的避坑指南,帮助开发者快速排查和解决以太网通信故障。

weixin_33695082的博客 419

农业AI避坑指南:用YOLO11做叶片病害检测时遇到的5个典型问题

本文分享了使用YOLO11模型进行农业叶片病害检测时常见的五个典型问题及解决方案。针对田间多变光照、病害样本不均衡、标注歧义、背景干扰和边缘部署等挑战,提供了包括场景自适应数据增强、解耦训练、软标签与鲁棒损失函数、困难负样本构建以及模型轻量化部署在内的实战经验,旨在帮助开发者提升农业AI项目的落地效果。

ujm56789012的博客 206

如何计算时间复杂度

一、概念 时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数) 比如:一般总运算次数表达式类似于这样: a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f a ! =0时,时间复杂度就是O(2^n); a=0,bO(n^3); a,b=0,cO(n^2)依此类推 eg: (1) for(i=1;i //循环了n*n次,当然是O(n^2)

firefly_2002的专栏 33万+

自定义LayoutManager实现android-pile-layout滑动卡片堆叠效果

这是我的第一篇博客,总算有个契机开始写博客了,就从自定义LayoutManager开始吧。 前段时间看到一个项目(android-pile-layout),效果特别不错,这是效果图: 效果确实不错,我看了下实现,是用的自定义的ViewGroup实现的,计算什么还搞的挺复杂的,具体的没细看。作者说也尝试过用LayoutManager实现,但是没找到合适的数学模型,好吧,看到数学模型我

u014296305的博客 1万+

时间复杂度计算专题

时间复杂度分析、计算 时间复杂度的速度

weixin_42482333的博客 5646

ARMv8/ARMv9的TLB深度学习

千万不要人云亦云。一个TLB entry里有很多很多东西的,有100多个比特位呢,并不是仅仅只有VA/PA/nG/VMID/ASID等。.👉👉👉 个人博客笔记导读目录(全部) 👈👈👈。

baron-周贺贺-代码改变世界ctw 1571

halcon第二讲:焊点提取

本文要完成的任务是将下图中焊点提取出来,对应于halcon例程Blob分析中的ball.hdev。 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) read_image (Image, 'die_03.png') disp_continue_message (WindowHandle, 'black', 'true') sto...

qq_24946843的博客 7175

时间复杂度计算及空间复杂度计算

目录1.算法效率2.时间复杂度3.空间复杂度4.大O渐进表示法5.常见时间复杂度 1.算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。 2.时间复杂度 2..

m0_53421868的博客 6735

【python科研数据处理】将Endnote自动搜索的所有pdf文件,全都移动指定文件夹中

将Endnote自动搜索到的全部pdf文件,全都移动指定文件夹中1 背景2 问题解决 手动反爬虫,禁止转载:原博地址 https://blog.youkuaiyun.com/lys_828/article/details/122370892(优快云博主:Be_melting) 知识梳理不易,请尊重劳动成果,文章仅发布在优快云网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 背景 在进行期末考试周后,面对最后一门功课,需要提交至少80篇SCI参考文献,因此最快下载文献的方式就是通过Web of S

lys_828的博客 1827

数据结构——算法的时间复杂度

数据结构——算法的时间复杂度:讲解详细,图文并茂,干货满满,不容错过的精彩好文!

麦麦的博客 2721

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

算法的时间复杂度的计算

前言: 算法的分析方式有两种: 事后分析统计方法:编写算法对应程序,统计其执行时间。 存在问题:编写程序的语言不同,执行程序的环境不同等因素 事前估算分析方法:撇开上述因素,认为算法的执行时间是问题规模n的函数。 所以我们引入了时间复杂度的概念来对算法进行分析 分析算法的执行时间 求出算法所有原操作的执行次数(也称为频度),它是问题规模n的函数,用T(n)表示。 算法执行大致时间 = 原操作所需的时间 * T(n) 所以算法的执行时间与 T(n) 成正比 为此用 T(n) 表示算法的执行时..

BIT-WDD 4348

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

算法时间复杂度计算

1. 概述   一个算法是由控制结构(顺序,分支,循环)和原操作(指固有数据类型的操作)构成。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对所研究的问题来说是基本操作的原操作,以该基本原操作重复执行的次数作为算法的时间度量。多数情况下,基本原操作是它最深层循环中的原操作,对算法的时间度量最常用的是考虑在最坏的情况下时间复杂度。 2. 时间复杂度的定义   算法中基本操...

weixin_30257433的博客 126

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

算法的时间复杂度问题

算法的时间复杂度概念算法时间复杂度其他相关概念计算O(f(n))基础由T(n)到O(f(n))[!!!]策略示例 概念 算法 非形式的说,算法(algorithm)就是任何良定义的计算过程,该过程取某个值或值的集合作为输入并产生某个值或值的集合作为输出。这样算法就是把输入转换为输出的计算步骤的一个序列。 可以认为,算法是求解计算问题的工具。 时间复杂度 时间复杂度是指执行算法所需要的计算工作量,即计算机执行相关程序所需要的时间(通过时间来评估效率)。 算法的时间复杂度是一个函数,它定性描述该算法的运行时间。

qiutian24的博客 923

算法的时间复杂度

算法的时间复杂度定义为: 时间复杂度或称时间复杂性,又称计算复杂度,她说是算法有效的度量之一,时间复杂度是一个算法运行时间的相对度量,一个算法的运行时间长短,它大致等于执行一种简单操作所(赋值、比较、计算、转向、返回、输入和输出)需要的时间与算法中进行简单操作次数的乘积。 根据定义,求解算法的时间复杂度的具体步骤是: ⑴找出算法中的基本语句;   一般算法中执行次数最多的那条语句就是基...

努力,奋斗! 7725

如何分析代码的空间复杂度和时间复杂度

该算法的时间复杂度为 O (n×k log k)(n 是字符串数量,k 是平均长度),空间复杂度为 O (n×k),通过使用哈希表的额外空间,换取了更简洁高效的分组逻辑。时间复杂度通常用大 O 符号(O notation) 表示,格式为 O (函数),其中函数的参数是数据规模 n。日常练习中,不妨养成这样的习惯:写完一段代码后,花一分钟分析它的时间复杂度和空间复杂度,长此以往,算法设计能力会有显著提升。// 排序时间O(k log k),k是字符串长度​。// 递归深度为n,栈空间为O(n)​。

m0_73991989的博客 470

时间复杂度的计算

原地址:http://www.nowamagic.net/librarys/veda/detail/2195 算法复杂度是在《数据结构》这门课程的第一章里出现的,因为它稍微涉及到一些数学问题,所以很多同学感觉很难,加上这个概念也不是那么具体,更让许多同学复习起来无从下手,下面我们就这个问题给各位考生进行分析。 首先了解一下几个概念。一个是时间复杂度,一个是渐近时间复杂度。前者是某个算法的时间耗费...

Galaxy_K的博客 1038
上一篇: 理解最大间隙问题算法
下一篇: 【回溯法】重复元素集合 求子集
wang__Ray
博客等级 码龄8年 59粉丝 17原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值