我正在为算法类尝试一些功课,我遇到了书中没有描述的情况。我的任务是创建算法并对Sequential
或Linear Search
执行逐行分析,以在数组k
中查找元素A[p...r]
。
我的算法非常简单:
1 for ct=1 to r
2 if A[ct] == k
3 return ct
4 return -1
直观地说,我已经知道这个算法在最佳情况下会在Θ(1)中执行,而在最坏的情况下会执行Θ(n)但我在执行逐行分析时遇到一些麻烦来证明这一点。
以下是我目前的分析(请注意常量旁边的#和tj下的j应该是下标):
Line | Algorithm | constants | time
1 for ct=1 to r c1 tj+1
2 if A[ct] = k c2 tj
3 return ct c3 1
4 return -1 c4 1
通过复杂性加上常数给了我:
c1(tj+1) + c2tj +c3 + c4 = tj(c1+ c2) + (c1 + c3 + c4) = tj(c) + c = tj
这就是绊倒我......
在所有情况下,第3行和第4行只执行一次,这就是我将它们列为常量时间的原因,但实际上在搜索过程中只会执行其中一行。我知道对于渐近符号,常量并不重要,但是我的tj(c1+ c2) + (c1 + c3 + c4)
语句包含c3 + c4
而烦恼,因为我知道它应该更像c3 or c4
。< / p>
问题
我能够适当地插入我的T(n),以便T(1)=Θ(1)和T(n)=Θ(n),但我觉得我没有准确地证明这一点。
答案 0 :(得分:1)
我能够适当地插入我的T(n),以便T(1)=Θ(1)和T(n)=Θ(n),但我觉得我没有准确地证明这一点。 / p>
任何人都可以权衡我的数学可能不正确的地方吗?
我太迟了,我很确定你已经知道了这一切,但在这里:
c1(tj+1) + c2tj +c3 + c4 = tj(c1+ c2) + (c1 + c3 + c4) = tj(c) + c = tj
我会把它改成
c1(tj+1) + c2tj +c3 + c4 = tj(c1+ c2) + (c1 + MAX(c3,c4)) = tj(c) + c = tj
正如你所指出的那样,只有c3或c4会运行,所以在最坏的情况下我们选择一个更复杂的(尽管在这种情况下两者都是常数)。
How are you supposed to evaluate early return statements within an algorithm?
复杂性从最好的情况到最坏的情况(和平均情况),你正在评估最坏的情况。早期的回报将适合最好的情况。所谓的条件使它成为可能。