递归Big-O的复杂性

时间:2017-05-18 16:36:44

标签: recursion complexity-theory

我明天有一个计算机科学中期,我需要帮助确定这些递归函数的复杂性。我知道如何解决简单的案例,但我仍然在努力学习如何解决这些更难的案例。任何帮助将非常感谢,并将大大有助于我的学习,谢谢!

fonction F(n)
    if n == 0
        return 1
    else
        return F(n-1) * n

fonction UniqueElements(A[0..n-1])
    for i=0 to i <= n-2 do
        for j=i+1 to j <= n-1 do
            if A[i] == A[j]
                return false
        return true

fonction    BinRec(n)
    if n == 1
        return 1
    else
        return BinRec(floor(n/2)) + 1

1 个答案:

答案 0 :(得分:2)

对于实践学习,您可以将功能插入程序中,并测试其最差情况下的性能。

当试图手动计算O时,这里有一些要记住的事情

  • 可以忽略+, - ,*和/ offsets。因此,1至n + 5和1至5n被认为等同于1至n。
  • 另外,只有最高数量级才算,所以对于O 2 ^ n + n ^ 2 + n,2 ^ n增长最快,因此相当于O 2 ^ n
  • 使用递归函数,您将查看在方法中调用函数的次数(拆分计数)以及需要调用多少次数(深度,通常等于列表长度)。所以最后的O将是depth_count ^ split_count
  • 使用循环,每个嵌套循环与其所在的循环相乘,并且顺序循环添加,因此(1-n){(1-n){}}(1-n){}是(n * n)+ n)=&gt; n ^ 2 + n =(仅最高生长计数)&gt; N ^ 2
  • 实践!您将需要练习以获得增长速度和控制流如何相互作用的一瞥。 (在线练习quiz s)

function F(n){
    count++
    if (n == 0)
        return 1
    else
        return F(n-1) * n
}

function UniqueElements(A){
    for (var i=0 ; i <= A.length-2; i++){
        for (var j=i+1;j <= A.length-1; j++){
            if (A[i] == A[j]){
                return false
            }
        }
   }
                
return true
}

function BinRec(n) {
    count++
    if (n == 1)
        return 1
    else
        return BinRec(Math.floor(n/2)) + 1
}

count = 0;
console.log(F(10));
console.log(count);
count = 0;
console.log(UniqueElements([1,2,3,5]));
console.log(count);
count = 0;
console.log(BinRec(40));
console.log(count);