编程语言
首页 > 编程语言> > DS第二篇附:预定义常量(C++描述)、算法时间复杂度分析举例

DS第二篇附:预定义常量(C++描述)、算法时间复杂度分析举例

作者:互联网

预定义常量


算法时间复杂度分析举例(非递归算法)

书中定理1.1:
若 f(n) = amnm + am-1nm-1+…+a1n+a0 ,是一个m次多项式
那么,T(n) = O(nm)
也就是说,忽略低次幂项、高次幂项的系数

常量阶

{x++;s=0;}

for (i=0;i<l0000; i++) {
	x++; 
	s=0;
	}

两条语句频度以及循环体频度,均为1
算法的执行时间是一个与问题规模n无关的常数,
T(n)= O(1), 常量阶。
`
需要注意的是如果算法中语句频度是某个常数。
即使这个常数再大,算法的时间复杂度都是O(1)。

线性阶

for (i=0; i<n; i++) {
	x++; 
	s=0;
	} 

循环体内两条基本语句的频度均为f(n)=n,
T(n)= O(n), 线性阶。

平方阶(&&/and)立方阶 k次方阶

x=0;y=0;
for (k=l; k<=n; k++)
	x++;
for(i=l;i<=n;i++)
	for(j=l;j<=n;j++)
		y++;

对循环语句只需考虑循环体中语句的执行次数,
以上程序段中频度最大的语句是(6)y++;,频度为f(n)=n2,
T(n)= O(n2),平方阶。

x = 1
for(i=1; i<=n;i++)
	for(j=1;j<=i;j++)
		for(k=1;k<j;k++)
			x++;

该程序段中频度最大的语句是(5)x++;
然后书中有这样一张图:

在这里插入图片描述
用到了等差数列前n项和公式、以及 (前n项)平方和公式
在这里插入图片描述

这是一个数学问题。可以参考一下这位网友图文并茂的解释
或者我大概说一下:
来,深呼吸一口气,试想:
当i=1,(5)执行1次
当i=2,(5)执行1+2次
当i=3,(5)执行1+2+3次

对于i=n,(5)执行(1+n)n/2次
于是只要把上边的执行次数全部加起来,就是问题规模了
也就是计算:
在这里插入图片描述

T(n)= O(n3) , 立方阶。

那么k次方阶,也就是二、三次方阶的扩展

对数阶

for (i=l; i<=n; i=i*2) {
	x++;
	s=0;
	} 

设循环体内两条基本语句的频度为f(n),则有
2f(n)<=n, 两边同时对2取对数,得
f(n)<=log2n,
T(n) = O(log2n), 对数阶。

标签:语句,常量,++,复杂度,C++,算法,频度,执行,DS
来源: https://blog.csdn.net/m0_46156900/article/details/114306828