基于c语言的时间复杂度

1.时间复杂度的定义和由来

我先来解释一下时间复杂度的定义。

很简单,你可以理解为你写的代码解决问题的时间效率。

那为什么会有时间复杂度这样的概念呢?

因为你会发现 在我们解决问题的时候 

往往可以给出多种解决方案.

这么多的解决方案,我到底用哪一种更好呢?

是选择看去来简单的循环嵌套,还是复杂算法的代码呢?

其实你也了解,代码复杂,往往代表着这个代码写的不错。

接下来我来给你分析一下这是为什么。

2.时间复杂度的应用

承接上文 我们究竟为什么要去研究复杂的算法

比如判断这个数是不是素数 

第一种方法 枚举

第二种方法 枚举到根值

在面对很大的数值时 第二种方法可以替我们省去很多的时间

我们假设 输入的数字是 n

第一种方法 时间复杂度为 O(n) 大约遍历这么多次(最坏情况)

第二种方法 时间复杂度为 O(n的2分之一次方)

因为随着近代科技的发展,计算机对于空间复杂度的需求没那么大了,所以我们要优先考虑时间复杂度。

因此 在我们需要大量判断一个数是不是素数的时候,采用第二种方法,更加的便捷和迅速。

3.如何确定一份代码的时间复杂度是多少?

看这样一份代码

#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
	int n = 0;
	scanf("%d", &n);
	int sum = 0;
	for (int i = 0; i < n; i++)
	{
		for (int t = 0; t < n; t++)
		{
			sum++;
		}
	}
	for (int k = 0; k < 10; k++)
	{
		sum++;
	}
	printf("sum = %d\n", sum);//如果n = 10 ,sum = 110 10*10+10
	return 0;
}

对于这样一份代码 sum++会进行 n*n+10次。

那么对应的时间复杂度为 O(n*n)

为什么没有10呢? 因此 我们对于时间复杂度 考虑的是最坏的情况

你也可以理解为 我们考虑 当n趋向于无穷大的时候的 (同阶无穷大)。

#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
	int n = 0;
	scanf("%d", &n);
	int sum = 0;
	for (int i = 0; i < n; i++)
	{
		for (int t = 0; t < 2 * n; t++)注意这里 t的范围
		{
			sum++;
		}
	}
	for (int k = 0; k < 10; k++)
	{
		sum++;
	}
	printf("sum = %d\n", sum);
	return 0;
}

这样的代码呢? n*2*n+10;

答案是O(2*n*n)吗? 错

前面我指出过 是同阶无穷大 而不是等价

答案应该是O(n*n)

忽略掉常数次系数。

关于时间复杂度更复杂的计算 我们留着下次再说

bye~~

你可能感兴趣的:(数据结构)