【问题标题】:Big O of functionF函数 F 的大 O
【发布时间】:2020-11-25 15:41:26
【问题描述】:
static void functionF(int n) {
for (int i = 0; i < n; i++) {
functionF(n-1);
}
}
我计算过:
如果 n = 2,则函数会再调用 4 次。如果 n = 3,它会再被调用 15 次。如果 n = 4,它会再被调用 64 次。我正在尝试计算一个很大的 O 时间复杂度。
【问题讨论】:
标签:
java
recursion
runtime
big-o
complexity-theory
【解决方案1】:
从复杂度来看,需要阶乘时间才能完成 -> O(n!)
因为每一步都会运行上一步中指定的次数。
并注意您的功能与:
function alpha(n){
for(int i = 0; i < n; n++){
//Do some stuff
alpha(i)
}
}
或
function alpha(n){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
// Do some stuff
}
}
}
第一个我猜不出它的时间,但低于 O(n!)
第二个是简单的 O(n²),在任何实际情况下运行速度都比 O(n!) 快
【解决方案2】:
通过每次调用函数时增加一个公共静态变量来测试此函数。如果您想检查某事执行了多少次,您可以在以后执行此操作。
以 (1, 4, 15, 64, 325, ...) 开头的模式是:
a(n) = n(a(n-1) + 1)
或
a(n) = n(a(n-1)) + n
这是一个很奇怪的函数,因为它具有递归特性。然而,它是准确的。您也可以根据您提供的数字搜索此模式。