逐行分析算法与早期报表

时间:2014-09-27 12:38:54

标签: java algorithm search analysis asymptotic-complexity

我正在为算法类尝试一些功课,我遇到了书中没有描述的情况。我的任务是创建算法并对SequentialLinear 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),但我觉得我没有准确地证明这一点。

  • 任何人都可以权衡我的数学可能不正确的地方吗?
  • 您应该如何评估算法中的早期返回语句?

1 个答案:

答案 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?

复杂性从最好的情况到最坏的情况(和平均情况),你正在评估最坏的情况。早期的回报将适合最好的情况。所谓的条件使它成为可能。