以此文记录学习过程,内容有不妥之处请包涵。
规则
1.往往只关注操作数量的最高次项,忽略其他次项和常数项。
2.无特殊说明时,算法的时间复杂度是指最坏的时间复杂度。
3.只有常数项记为1。
4.操作数的估算可以作为时间复杂度的估算。
5.算法的空间复杂度并不是计算算法所占用的空间,而是使用的辅助空间的大小。
大O表示法
常见的时间复杂度
执行次数 | 阶 | 非正式术语 |
12 | O(1) | 常数阶 |
O(n) | 线性阶 | |
O( | 平方阶 | |
O( | 对数阶 | |
O( | ||
O( | 立方阶 | |
O( | 指数阶 |
常见时间复杂度排序
O(1)<O()<O(n)<O(
)<O(
)<O(
)<O(
)<O(n!)<O(
)
计算算法时间复杂度
算法1
void Algo1(void)
{
int sum=0,n=100;
sum=(1+n)*n/2;
printf("%d\n",sum);
}
代码有三步,则为O(3)。因为3为常数,所以时间复杂度为O(1)。
算法2
void Algo2(int n)
{
int i;
for(i=0;i<n;i++)
printf("%d\n",i);
}
代码有n步,时间复杂度为O(n)。
算法3
void Algo3(int n)
{
int count=1;
while(count<n)
count*=2;
}
假如n=10,则count=2,4,8,16,即在while中执行了4步。
设代码有x步,则有=n,x=
,时间复杂度为O(
)。
算法4
void Algo4(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
printf("%d\n",i+j);
}
时间复杂度为O()。
算法5
void Algo4(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=i;j<n;j++)
printf("%d\n",i+j);
}
会执行次,即
。根据规则只关注最高次项,所以时间复杂度为O(
)。
算法6
void func(int n)
{
int i;
for(i=0;i<n;i++)
printf("Hi");
}
void Algo(int n)
{
//1
n++;
func(n);
//2
int i,j;
for(i=0;i<n;i++)
func(n);
//3
for(i=0;i<n;i++)
for(j=i;j<n;j++)
printf("Hi");
}
是前面算法的组合,n++
,时间复杂度为O(
)