NOIP普及组-时间复杂度概述

时间复杂度在算法中不可或缺,它决定了一个算法的质量、效率,甚至命运

Posted by 周琪岳 on July 9, 2021

时间复杂度的认识

时间复杂度的定义

评价一个算法的运行速度(相对其它算法快或者慢),主要使用的方法是时间复杂度。

代码的时间复杂度主要取决于代码最多要执行的语句数量,通常用大O记号,描述的是最坏情况下代码的时间复杂度。

时间复杂度的计算在NOIP初赛中经常考到,而且在提高组中往往难度偏高

语句数量的计算

语句计数规则

1)顺序结构中,一条语句记为1

2)选择结构中,看语句数量最多的那个分支中的语句数量

3)循环结构中,语句数量乘上循环次数

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>

using namespace std;

int n, a[10005], cnt; // 语句计数+1

int main() {
    cin >>n;
    for(int i=1; i<=n; i++) { // 语句计数+n
       cin >> a[i];
    }
    for(int i=1; i<=n-1; i++) { // 语句计数+n
        for(int j=1; j<=n-i; j++) { // 语句计数+n
            if(a[j] < a[j+1]) {
                swap(a[j], a[j+1]); // 语句计数+1
                cnt ++; // 语句计数+1
            }
        }
    }
    cout << cnt; // 语句计数+1
    return 0;
}

语句总数量即为2n^2^ + n + 4

时间复杂度的规则

大O时间复杂度的计算: 1)只保留最高次项:2n^2 2)去掉最高此项的系数:n^2 3)语句数量套上O():O(n^2)

最后结果是O(n^2^)

如果最高次项是一个常数,那么时间复杂度直接记为O(1)

循环是重点

计算一个程序的时间复杂度时,可以主要看循环次数

如果代码没有循环,时间复杂度为O(1)

如果代码中有一个或多个循环,只需看循环次数最多的循环会循环多少次

每次循环具体执行的语句数量可以忽略不计

有趣的题目

设某算法的计算时间表示为递推关系式T(n) = T(n-1) + n (n为正整数),及T(0) = 1,则该算法的时间复杂度( )

A.O(logn) B.O(nlogn) C.O(n) D.O(n^2) 答案:D。

可以把T(0)~ T(n)求出:

T(0) = 1

T(1) = 1 + 1

T(2) = 1 + 1 + 2

……

以此类推,T(n) = 1 + 1 + 2 + 3 + … + n

根据等差数列求和公式T(n) = 1/2n^2^ + 1/2n + 1

时间复杂度即为O(n^2^)

总结

时间复杂度在算法中的应用是无穷的(若想继续了解时间复杂度欢迎阅读《算法导论》第二章),一定要牢牢掌握

CSP-J2021rp++!!!