前言
由于本人也是初学者,所以本篇对时间复杂度进行简单的介绍
衡量算法的效率一般是从时间和空间两个维度去考虑的,在正常情况下我们一般不考虑空间复杂度,我们只需要关注算法的时间复杂度就行了。
一. 常见的时间复杂度
常见的时间复杂度包括常数时间O(1),线性时间O(n),对数时间O(logn),平方时间O(n^2)等。学会分析时间复杂度可以让我们在做题时,选择更好的解题方法。
二. 时间复杂度的计算
时间复杂度通常是指程序在最坏情况下的执行时间,在计算时间复杂度时我们关注的是复杂度的数量级,一般来说,评测机一秒大约跑2e8次运算。
下面来看一个时间复杂度为O(n)的实例
#include<stdio.h>
int main(){
int n,s=-1;
double sum=0,a=1,b=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
s=-s;
sum=sum+s*a/b;
a++;b=b+2;
}
printf("%.3f",sum);
}
可以看的出来这个程序中,最主要的就是一个for循环,下标i从1循环到n,循环次数跟n的大小线性相关,所以时间复杂度为为O(n).
时间复杂度为O(n^2)的代码
void sort(int arr[], int n)
{
int i, j, temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j+1])
{
// 交换相邻元素的位置
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
这个冒泡排序大家应该都记得,在最坏情况下,即使排序的元素已经按照逆序排列,每轮也需要进行n-1次比较和交换操作,因此总的时间复杂度为O(n^2).
后续会进行完善和补充