程序复杂度估计的表示方法

为了预测程序运行的时间如何锁着实例特征的变化而变化,我们进行简单的估计步数,不必对程序进行准确的操作计数和执行步数,在这里一般采用大O记法,但是Ω记法、Θ记法、小o记号也是很常用的,下面对其做一一分析说明

1、大O记法

定义:f(n)=O(g(n)),当且仅当存在常数两个正整数c和n0,使得n>n0的时候f(n)≤c*g(n)。

表示方法:f(n)=O(g(n))

1)例如:f(n)=3n+2=O(n)

当n>2的时候,2n +2<3n,这时n0=3,c=3,则n>n0的时候,f(n)<c(n),所以f(n)=O(n)。

2)现在再证明f(n)=2n+2=O(n^2)

当n>2的时候,3n+2<2n^2,所以可选n0=2,c=2,则n>n0的时候,f(n)<c(n^2),所以f(n)=O(n^2)。

小结:可以看出来大O表示方法g(n)通常为f(n)的最高次幂或者更高次幂。

2、Ω记法

Ω记法与大O记法类似,它表示函数在渐近增长率意义上的下限,可以理解为算法运行时间的下限。

定义:f(n)= Ω (g(n)),当且仅当存在常数两个正整数c和n0,使得n>=n0的时候f(n)>=c*g(n)。

1)对于所有的n有f(n)=3n+2>3n,因此f(n)=Ω(n),更直接可以看出f(n)=Ω(1)

2)例如:f(n)=2n^2-4=Ω(n^2)

当n>2的时候,2n^2-4>n^2,所以可选n0=2,c=1,则n>n0的时候,f(n)>c(n^2),所以f(n)=Ω(n^2)。

小结:可以看出来Ω表示方法g(n)通常为f(n)的最高次幂或者更低次幂。

 

3、Θ记法

定义:Θ记号介于大O记号和Ω记号之间。它表示g(n)和f(n)相同的阶数

1)例如:2n<=t(n)<=2n+2,则g(n)=Θ(n)

4、小o记号

定义:f(n)=o(g(n))当且仅当f(n)=O(g(n))且f(n)≠Ω(g(n))。可以看到小o记法给出了严格的上界。

1) 例如:因为3n+2=O(n^2)且3n+2≠Ω(n^2),所以3n+2=o(n^2),但是3n+2≠o(n).

2) 同样10n^2+4n+2=o(n^3),但是10n^2+4n+2≠o(n^2).

### 不同算法复杂度的计算方法 #### 时间复杂度计算方式及示例 时间复杂度衡量的是一个算法执行所需的时间随着输入规模的增长而增长的速度。通常使用大O记号来描述最坏情况下的性能。 对于简单循环结构: ```cpp for (int i = 0; i < n; ++i) { // 执行一些操作 } ``` 上述代码中的循环会执行`n`次,因此其时间复杂度为 O(n)[^1]。 嵌套循环则会使复杂度增加到更高阶: ```cpp for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { // 执行某些操作 } } ``` 这里有两个相互独立变化的参数 `m` 和 `n`, 如果两者相等,则该双重循环的时间复杂度可以简化成 O(n&sup2;),即平方级别[^2]。 递归函数的时间复杂度取决于每次调用自身的次数以及减少问题规模的方式。例如经典的二分查找算法,在最佳情况下能够将搜索范围减半直到找到目标或者确认不存在,这样的过程可以用对数级表示,也就是 O(log₂n)[^3]。 #### 空间复杂度计算方式及示例 空间复杂度关注于程序运行期间所消耗的最大内存资源数量。这不仅限于显式的数组或其他数据容器分配了多少存储单元;还包括隐含使用的栈帧大小——特别是当存在大量递归调用时这一点尤为重要。 考虑下面的例子: ```cpp void function(int n, int* data){ int temp[n]; // 动态创建了一个长度为&#39;n&#39;的新数组 ... } ``` 这段代码中声明了一个局部数组`temp[]`,它占据了连续的一片内存区域,这部分额外开销构成了此函数的空间复杂度的一部分,具体来说就是 O(n)[^1]。 再看另一个例子: ```cpp void recursiveFunction(int level){ if(level == 0) return; int localVariable; recursiveFunction(level - 1); } ``` 每当进入更深一层递归时都会新增加若干个局部变量实例化所需的堆栈空间,假设每层只增加了固定量的辅助空间,那么整个递归链路下来总共需要 O(d) 的附加空间,其中 d 表示递归深度。 综上所述,无论是分析时间还是空间上的需求,都应当仔细考察各个组成部分的影响因素,并据此推导出合理的估计值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值