我遇到这个算法问题很麻烦。我应该找到以下算法的大分析:
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中合理化。除此之外,我的整个方法都有可能存在缺陷。我应该如何攻击这样的问题?如果我的方法有效,我该如何完成?
感谢。
答案 0 :(得分:1)
更容易调查执行doSomethingA
和doSomethingB
的频率。
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
可以看出。