前情提要:本人是新人,对某些概念理解有些不到位,多多包涵,也可以指点一下qwq。
我的理解是:时间复杂度是区分算法之间利用的时间快慢。
大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)。
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)