数据结构—时间复杂度

前情提要:本人是新人,对某些概念理解有些不到位,多多包涵,也可以指点一下qwq。

一.概念:在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。(这是百度百科的解释)

我的理解是:时间复杂度是区分算法之间利用的时间快慢。

二.计算:我们计算时间复杂度并不是要精确的计算出该算法语句的执行次数,而只需要大概执行次数,那我们就要用大O的渐进表示法。

大O符号:是用于描述函数渐进行为的数字符号。写作O(x) 。(x一般根据代码实际情况)

推导大O阶方法:

2.1、用常数1取代运行时间中所有加法常数。

举一个简单的例子

#include 
int main()
{
	int sum = 0;
	for (int i = 1; i <= 100; i++)
		sum += i;
	printf("%d", sum);
	return 0;
}

一个简单的等差数列求和,for循环执行了一百次,那么我们时间复杂度是O(100)??(其他语句可能实际有增删,忽略不计)

我们要用1取代常数,因此我们复杂度应该为O(1)。假如我把i加到1亿,它的时间复杂度也应该是O(1)而不是O(100000000)。

Tips:如果代码没有涉及输入数值,一般这个代码的时间复杂度是O(1)。

2.2、在修改后的运行次数中,只保留最高阶项

例子:

#include 
int main()
{
	int sum = 0;
	int n = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		sum += i;
	printf("%d", sum);
	return 0;
}

 这段代码有变量n,由我们输入而决定,那我们的时间复杂度是O(n+1)吗??

由于我们只保留最高阶项,因此时间复杂度是O(n)。

2.3、如果最高阶项存在且不是1,则去除与该项目相乘的常数

例子:

#include 
int main()
{
	int sum = 0;
	int n = 0;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		sum += i;
	for(int j=0;j

这里我们运用了两次for循环,时间理应是只用一次的两倍,而用大O的渐进表示法,我们只用考虑去除最高项的系数。因此时间复杂度是O(n)。

三.下面一些代码加深理解(题目看我的gdpu实验四)

3.1

#include 
int main()
{
	int n, i, sum = 1;
	scanf("%d", &n);
	for (i = n; i > 1; i--)
		sum = (sum + 1) * 2;
	printf("Totals=%d", sum);
	return 0;
}

时间复杂度是O(n)

3.2

#include 
int main()
{
	int n, i, j;
	scanf("%d", &n);
	for (i = 1; i <= n; i++) {
		int m = 0;
		for (j = 1; j < i; j++)
		{
			if (i % j == 0)
				m += j;
		}
		if (m == i)
			printf("%d\n", m);
 
    }
	return 0;
}

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

3.3

#include 
int main()
{
	int n, m, max, min, gbs = 0, gys = 0;
	int i, j;
	scanf("%d,%d", &n, &m);
	if (n > m)
	{
		max = n;
		min = m;
	}
	else
	{
		max = m;
		min = n;
	}
	for (i = max; i != 0; i++)
	{
		if (i % m == 0 && i % n == 0) {
			gbs = i;
			break;
		}
	}
	for (j = min; j != 0; j--)
	{
		if (m % j == 0 && n % j == 0) {
		gys = j;
		break;
	}
}
	printf("gys=%d,gbs=%d",gys,gbs);
	return 0;
}

时间复杂度是O(n)

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