java - fnB 中 Big O 表示法的执行时间是多少?
问题描述
我有 2 个函数,我需要在 Big O 中找到这两个函数的执行时间,但是我对 fnB 感到困惑
int fnA(int n){
int sum = 0;
for(int i=0; i<n; i++){
for(int j=n; i<j; j=j-2){
sum += i*j;
}
return sum;
}
我得到了 fnA 的 O(n^2)
int fnB(int n) {
int sum =0;
for(int size = 1; size<n; size=2*size){
sum+=fnA(size);
}
return sum;
}
由于在 fnB 的 for 循环中,大小呈指数增长。我倾向于 fnB 有一个 O(n^3)。我说的对吗,如果不对请指正,谢谢
解决方案
fnA
运行时间为 O(n 2 )。
但是,fnB
它的运行时间为 O(n 2 logn),因为它有 log 2 n 次迭代,并且每次迭代需要 O(n 2 ) 时间(实际上需要 O(size 2 ),但是由于size
< n
,我们可以对其进行限制与 O(n 2 ))。
更详细的解释:
fnA(n)
n
在外循环中有迭代,在内循环中最多有迭代n/2
,这给出了 O(n 2 ) 的上限。由于fnB(n)
调用的每次迭代fnA(size)
,它需要 O(size 2 ) == O(n 2 ) (因为size
< n
)。
现在,循环fnB(n)
将以下值分配给size
:2 0、2 1、2 2、...、2 k ,其中 2 k <= n。因此迭代次数为 k <= log 2 n,其上限fnB
为 O(n 2 log 2 n)。
推荐阅读
- laravel - 使用 laravel 上传图片文件时设置名称
- c - 'void *' 和 'void * (*function)(void *)' 初始化、强制转换和函数指针调用之间的区别?
- php - 从 CLI 和代码中调用时如何捕获 Artisan 命令名称?
- reactjs - 从 onClick 事件进行 api 调用后在运行时更改应用程序主题
- java - Gatling:解析日志文件 - OutOfMemoryError:Java 堆空间
- typescript - 如何将 Pulumi const 输出保存到 aws s3 存储桶(打字稿)
- regex - 需要编写一个正则表达式来提取前 5 个斜杠的路径或最多一个 Splunk 的数字
- javascript - 根据唯一 DIV ID 获取价值
- javascript - 在 TinyMCE 中插入表格后,双击光标不显示
- angularjs - 如何使用Javascript在外部修改表单元素的ng-disabled属性并使其生效?