度量算法效率
前言
度量一个算法的效率,一个方法是事后统计,即先将算法实现,然后输入适当的数据运行,测算其时间和空间开销。其缺点显而易见,不仅编写程序实现算法将花费较多的时间和精力,而且实验结果依赖于计算机的软硬间等环境因素,容易掩盖算法本身的优劣。所以通常采用事前分析估算的方法估算算法所消耗的资源。
一、算法的时间复杂度
1、问题规模
不谈与计算机软硬件有关的因素,影响算法时间代价的最主要因素是问题规模。问题规模是指输入量的多少,一般情况下可以从问题描述中得到。一个显而易见的事实:几乎所有的算法,对于规模更大的输入需要运行更长的时间。正因如此,运行算法所需要的时间T是问题规模n的函数,记作T(n)。
2、时间复杂度
精确给出表示算法的运行时间函数常常是很困难的,即使给出,也是相当复杂的函数,函数的求解本身也相当复杂。为优化求解方式,可以用算法中基本基本语句的执行次数来度量算法的工作量,进而客观反映一个算法的执行时间。我们将只考察当问题规模充分大时,算法中基本语句的执行次数在渐进意义下的阶称作算法的渐进时间复杂度,简称时间复杂度,通常用O记号表示。
总结
算法时间复杂度的思维抽象:算法的运行时间=每条语句的执行时间之和→每条语句的执行次数之和→基本语句的执行次数→基本语句执行次数的数量级→算法的时间复杂度。
二、算法的空间复杂度
算法在运行过程中所需的存储空间包括:
(1)输入/输出数据占用的空间;
(2)算法本身占用的空间;
(3)执行算法需要的辅助空间。
其中,输入/输出数据占用的空间取决于问题,与算法无关;算法本身占用的空间虽然与算法相关,但其大小一般是固定的。因此算法的空间复杂度是指算法在执行过程中需要的辅助空间数量,也就是除算法本身和输入输出数据所占用的空间外,算法临时开辟的存储空间。
若算法所需的辅助空间相对于问题规模来说是一个常数,称此算法为原地工作。
否则,这个辅助空间函数也应是问题规模的函数,通常记作:
S(n)=O(f(n))
其中,n为问题规模,分析方法与算法的时间复杂度类似。
codeforces题目链接:
https://codeforces.com/problemset/problem/1108/D
题解:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
string str;
char change[6]={
'R','G','B','R','G','B'};
int main(){
int n;
cin>>n>>str;
int ans=0;
for(int i=1;i<n;i++){
if(str[i]==str[i-1]){
for(int j=0;j<3;j++){
if(change[j]!=str[i-1]&&change[j]!=str[i+1]){
str[i]=change[j];
break;
}
}
ans++;
}
}
cout<<ans<<endl<<str<<endl;
return 0;
}