Big-theta运行时的两个线性嵌套循环,内部运行一半,每次迭代的外部。

时间:2018-02-15 09:02:05

标签: algorithm big-o computer-science asymptotic-complexity

我遇到这个算法问题很麻烦。我应该找到以下算法的大分析:

function example(n):
    int j=n
    for i=0;i<n;i++:
        doSomethingA()
        for k=0;k<=j;k++:
            doSomethingB()
        j/=2

我的方法是将算法的整个执行分为两部分。调用doSomethingA()和doSomethingB()的一部分,j之后的第二部分变为0,并且只有doSomethingA()被调用,直到程序停止。

使用这种方法,您可以在外部循环的Logn迭代中发生第1部分,第2部分发生在外部循环的n-logn迭代中。

每次运行时内循环运行的次数减半,因此它运行的总次数应为2n-1。所以第1部分的运行时应该是(2n-1)* c,一个常量。我不完全确定这是否有效

对于第2部分,循环内的工作总是不变的,循环重复(n-logn)次。

所以我们有((2n-1)+(n-logn))* c

我不确定我在这里所做的工作是否正确,我也不确定如何继续。我的直觉告诉我这是O(n),但我不确定如何在big-theta中合理化。除此之外,我的整个方法都有可能存在缺陷。我应该如何攻击这样的问题?如果我的方法有效,我该如何完成?

感谢。

1 个答案:

答案 0 :(得分:1)

更容易调查执行doSomethingAdoSomethingB的频率。

doSomethingA显然是n次。

对于doSomethingB,我们得到(n + 1)+(n / 2 + 1)+(n / 4 + 1)+ ... + 1大约2n + n。来自n + n / 2 + n / 4 +的2n ......和来自1的n的总和。

我们一起获得O(n)和Theta(n)因为你需要至少Omega(n),从执行n次doSomethingA可以看出。