【问题标题】:Line by Line Analysis of Algorithm with Early Return Statement带早退语句的算法逐行分析
【发布时间】:2014-11-22 08:40:53
【问题描述】:

我正在尝试一些算法课的作业,但我遇到了书中未描述的情况。我的任务是创建一个算法并对SequentialLinear Search 执行逐行分析,以在数组A[p...r] 中找到元素k

我的算法非常简单:

1   for ct=1 to r
2       if A[ct] == k
3           return ct
4   return -1

直观地说,我已经知道该算法在最佳情况下会在 Θ(1) 中执行,而在最坏情况下会在 Θ(n) 中执行,但是我在执行逐行分析来证明这一点时遇到了一点麻烦。

这是我目前的分析结果(请注意常量旁边的#s 和 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

问题

我能够适当地插入我的 T(n),以便 T(1) = Θ(1) 和 T(n) = Θ(n),但我觉得我还没有准确地证明这一点。

  • 谁能权衡我的数学可能不正确的地方?
  • 您应该如何评估算法中的提前返回语句?

【问题讨论】:

  • 复杂度为 O(r)

标签: java algorithm search analysis asymptotic-complexity


【解决方案1】:

我能够适当地插入我的 T(n),以便 T(1) = Θ(1) 和 T(n) = Θ(n),但我觉得我还没有准确地证明这一点。

任何人都可以权衡我的数学可能不正确的地方吗?

我来得太晚了,我很确定你已经知道了这一切,但这里是:

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?

复杂性从最好的情况到最坏的情况(和平均情况),你正在评估最坏的情况。最好的情况是提前返回。假设条件使之成为可能。

【讨论】:

  • 嘿,谢谢...老实说,我完全忘记了我提出了这个问题,但我认为您的解决方案是正确的。欣赏!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2010-10-27
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多