算法的时间复杂度

1、什么是算法的时间复杂度

描述算法在编写可执行程序后,运行时所需要耗费的时间资源的一个函数,通常用O()来表示。

2、算法中时间复杂度的计算

  (1)    常数函数时间复杂度O(1)

下面代码for语句中count++执行的次数与N无关而且是一个有限的次数(这个数也不能太大比如说40亿以上),那么一般把该算法的时间复杂度当作一个常数函数记作O(1)。

void Function(int N) {
	int count = 0;
	for (int i = 0; i < 1000000; i++) {
		count++;
	}
}

(2)循环中复杂度的计算

        下面代码for语句中count++执行的次数与N有关,随着N趋近于无穷,那么count++执行的次数也趋近于无穷,则这个算法的时间复杂度为O(N);

void Function1(int N){
	int count = 0;
	for (int i = 0; i < N; i++) {
		count++;
	}
}

        下面这段代码中一眼可看出时间复杂度为2N,但是时间复杂度计算的规则是当最高阶项存在,且前面系数为常数,则将这个系数当作1看待,即这段代码中时间复杂度应该记作O(N)。

void Function2(int N) {
	int count = 0;
	for (int i = 0; i < N; i++) {
		count++;
	}
	for (int i = 0; i < N; i++) {
		count++;
	}
}

        下面这段代码中时间复杂度可表示为N^2+N+100,其中含N的最高次项为N^2,即在函数式中这一项分量最重,其他项可以忽略,记作O(N^2)。

void Function3(int N) {
	int count = 0;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			count++;
		}
	}
	for (int k = 0; k < N; k++) {
		count++;
	}
	for (int l = 0; l < 100; l++) {
		count++;
	}
}

(3)二分查找算法中的时间复杂度

        二分查找算法中是通过类似于折纸的原理,算法中while执行的次数就是在数组a中寻找x的次数,每寻找一次,搜寻的范围都会变为原来的二分之一,因此搜寻范围大小的变化就是N/2/2/2.....,直到只有一项,假设这个过程计算n次,则2^n=N,即n=log_{2}\textrm{N}。时间复杂度记作O(log_{2}\textrm{N}\textrm{})。

int Function4(int *a, int N, int x) {
	int begin = 0;
	int end = N- 1;
	while (begin <= end) {
		int midd = (begin + end) / 2;
		if (x < a[midd]) {
			end = midd - 1;
		}
		else if (x > a[midd]) {
			begin = midd + 1;
		}
		else {
			return midd;
		}	
	}
	return -1;
}

(3) 函数递归中的复杂度计算

        下面算法中要计算Function5(int N)函数所执行的次数,首先可推理:F(N) = F(N-1)*N,F(N-1) = F(N-2)*(N-1).......F(2) = F(1)*2,F(1) = F(0)*1。由推理式可知F(N)只与他得下一项有关,因此这个计算过程中每一项只需要计算一次,因此总计算次数为N+1,即时间复杂度记作O(N)。

long long Function5(int N) {
	if (0 == N) {
		return 1;
	}
	else
		return	Function5(N-1)*N;
}

        下面算法中要计算斐波拉契函数得时间复杂度,首先可推理:F(N)=F(N-1)+F(N-2),F(N-1)=F(N-2)+F(N-3).......F(4)=F(3)+F(2),F(3)=F(2)+F(1)。由推理式子可知F(N)与他后面两项相关,从下面推理图中的计算,可推出要求得F(N),则应计算2^(N-2)次,即时间复杂度记作O(2^N)。

long long Fib(int N) {
	if (N < 3) {
		return 1;
	}
	else {
		return Fib(N - 1) + Fib(N - 2);
	}
}

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在进行排序算法时间复杂度分析时,我们通常使用大O表示法来描述算法执行所需的时间。大O表示法是一种定性描述算法时间复杂度的方法。 对于希尔排序算法,它的时间复杂度介于O(n^1.3)到O(n^2)之间。具体的时间复杂度取决于所选取的增量序列和增量的取值。根据研究结果,如果增量序列的选择合理,希尔排序算法时间复杂度约为O(n^1.3)。 对于其他排序算法时间复杂度分析,我们可以通过比较基本操作的重复执行次数来进行。假设问题规模为n,解决该问题的算法中基本操作的执行次数为T(n)。如果存在一个辅助函数f(n),使得T(n)/f(n)的极限值为不等于零的常数,那么我们就可以说f(n)是T(n)的同数量级函数。因此,我们可以表示T(n) = O(f(n)),其中O(f(n))被称为算法的渐进时间复杂度,简称时间复杂度时间复杂度越高,算法的执行效率越低。 举例来说,简单选择排序算法的最坏、最好和平均时间复杂度都为O(n^2),因此它是常见排序算法中性能最差的排序算法。在简单选择排序中,每一趟排序都需要选择出最小排序码的记录,需要进行n-i次比较,因此总的比较次数为∑i=1n−1(n−i)=n(n−1)/2=O(n^2)。 综上所述,排序算法时间复杂度分析可以根据不同算法的特点和基本操作的重复执行次数进行。希尔排序算法时间复杂度介于O(n^1.3)到O(n^2)之间,而简单选择排序算法时间复杂度是O(n^2)。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [常见的排序算法及其复杂度分析](https://blog.csdn.net/Lyf_Ah/article/details/123796354)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [排序算法时间复杂度](https://blog.csdn.net/Ehontoo/article/details/124274303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值