时间复杂度 空间复杂度(C语言)

时间复杂度

算法时间复杂度定义: 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量 级。算法的时间复杂度,
也就是算法的时间量度,记作:T(n) =O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和 f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
这样用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。 一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。
显然,由此算法时间复杂度的定义可知,我们的三个求和算法的时间复杂度分别 为O(n),O(1),O(n^2)。
我们分别给它们取了非官方的名称,O(1)叫常数阶、O(n)叫线 性阶、O(n^2)叫平方阶等。
推导大O阶: 1.用常数1取代运行时间中的所有加法常数。 2.在修改后的运行次数函数中,只保留最高阶项。 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。 得到的结果就是大O阶。
——《大话数据结构》

常数阶

int sum=1;
int  x=0;
int y=10;
all=x+y+sum;

时间复杂度:O(4)化简为O(1)

线性阶
寻找与规模相关的循环体,计算O(1)序列的运行次数

for(int i=0;i<n/2;i++){
int temp=arr[i];
arr[i]=arr[len-1-i];
arr[len-1-i]=temp;
}

arr[]={1,2,3,4}实现逆序arr[]={4,3,2,1}
时间复杂度:O(n/2)化简为 O(n)

对数阶

for(int i=1;i<n;i*=2){
//O(1)序列
}

时间复杂度:2^(次数)>= n 时,循环停止,
化简即:O(log n)

平方阶
循环嵌套

for(int i=0;i<n;i++){
  for(int j=0,j<n;j++){
  //O(1)序列
  }
}

时间复杂度:O(n^2)

for(int i=0;i<n;i++){
  for(int j=0,j<n-1-n;j++){
  //O(1)序列
  }
}

时间复杂度:观察知,共有 n(n-1+1)/2 次,
化简即:O(n^2)

算法效率:O(1)>O(log n)>O(n)>O(n^2)

//冒泡排序
int BubbleSort(int* arr, int len) {
	bool flag = true;
	for (int i = 0; i < len; i++) {//i 控制次数
		for (int j = 0; j < len - 1 - i; j++) {
			if (arr[j] > arr[j + 1]) {
				flag = false;
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
		if (flag ==true) {
			break;
		}
	}

最优时间复杂度:O(n)
时间复杂度:O(n^2)

空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公 式记作:S(n)=0(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的 函数。——《大话数据结构》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值