算法复杂度-CSP-普及组

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令。
也就是说,为解决一个具体的问题,执行一系列程序指令,能够对一定规范的输入,在有限时间内获得所要求的输出。
例如如下问题:
题目描述
求前N项和
1+2+3+ …… +N 的值。

输入格式
输入
N

输出格式
输出

输入样例

5

输出样例

15

参考程序
需要如下程序指令完成

#include<bits/stdc++.h>
using namespace std;
int N,sum;
int main(){
	cin>>N;
	for(int i=1;i<=N;i++){
		sum+=i;
	}
	cout<<sum;
	return 0;
}

上述程序执行,涉及到输入,循环,输出等基本程序指令,主要时间耗费在for循环,且执行时间是随循环中N变化而变化的函数,分析算法执行时间通常使用算法的时间复杂度来衡量

算法的时间复杂度
算法的时间复杂度是一个函数,它定性描述该算法的运行时间,常用大O符号表述,它可以被认为是渐进,不考虑常数
对于足够大的输入规模,我们往往不需要花费很大力气计算太精确的结果,通常指关系增长级量,即算法的渐进效率
比如:

int sum = 0;
for(int i = 1; i<=n; i ++ ){
       sum = sum + i;
}

我们关心for循环的时间复杂度,而 int sum=0 忽略
因此时间复杂度为O(n),而不是O(n+1)

举例说明
1.O(1)

O(1)的时间复杂度可以这样理解:代码按顺序一行一行执行,没有任何的循环
比如:

int a = 1;
int b = 2;
cout << a + b <<endl;

无论有多少个这样的代码块,只要不出现循环,就可以被认为是O(1),没有O(2),O(3)
1个和几个都是O(1),不考虑常数

2.O(n)
O(n)的时间复杂度是与数据规模成线性的,比如:

int sum = 0;
for(int i = 1; i<=n; i ++ ){
       sum = sum + i;
}

循环体内循环了n次,这样的时间复杂度就是O(n)的,如果有多个这样的循环,只要不是循环嵌套,我们也认为是O(n)的,因为时间复杂的不考虑常数

3.O(n^2)
O(n^2)的时间复杂度很容易理解,就是循环里嵌套了一层循环,比如:

int count = 0;
for(int i = 1; i<=n; i ++ ){
       for(int j = 1; j <= n; j++){
                count ++;
       }
}

4.O(logn)

O(logn)的时间复杂度我们常常认为在数据规模为n下,代码执行的次数x满足c^x=n(c是一个较小的常数),比如:

int count = 0;
for(int i = 1; i <= n; i = i * 2){
        count ++;
}

for循环中i每次*2,执行次数为$ log_2n $

常见的O(logn)的算法还有二分查找

5.O(nlogn)
O(nlogn)的时间复杂度就是在一个循环中嵌套了一个O(logn)的算法,比如:

int count = 0;
for(int i = 1; i<=n; i ++ ){
       for(int j = 1; j <= i; j = j * 2){
                count ++;
       }
}

6.O(2^n)

O(2^n)的时间复杂度常见于搜索,递归中,比如在用递归求斐波那契数的时候:

int fib(int n){
    if (n <= 1) return n;
    else return fib(n - 2) + fib(n - 1); 
}

O(2^n)的时间复杂度是一个很不理想的时间复杂度,因此我们常常会使用一些技巧去尽可能地优化。

复赛中评估时间复杂度
在一般在算法竞赛或者笔试题的时间限制是1秒,基本程序指令规模一般在10^8以内

对应相应时间复杂度可以接受的数据规模如下
O(n)算法能解决的数据范围在 n≤10^8
O(nlogn) 算法能解决的数据范围在 n≤10^6
O(n^2) 算法能解决的数据范围在 n≤5000
O(n^3) 算法能解决的数据范围在 n≤300
O(logn) 算法能解决的数据范围在 n<10^18
O(2^n) 算法能解决的数据范围在 n≤25

算法复杂度-CSP-普及组-练习
https://www.cnblogs.com/myeln/articles/17514587.html
算法复杂度-CSP-普及组-练习-答案解析
https://www.cnblogs.com/myeln/articles/17517309.html

posted @ 2023-06-29 11:28  new-code  阅读(70)  评论(0)    收藏  举报