二元搜索的复杂性

时间:2012-02-27 02:58:39

标签: algorithm complexity-theory big-o binary-search

我正在观看Berkley Uni的在线讲座并坚持下面的内容。

问题:假设您有一个已经排序过的CD集合。您想要找到标题以“Best Of。”开头的CD列表。

解决方案:我们将使用二进制搜索来查找“Best Of”的第一个案例,然后我们进行打印,直到该贴片不再是“Best Of”

其他问题:找出此算法的复杂性。

上限:二进制搜索上限是O(log n),所以一旦找到它,我们打印就说k标题。所以它是O(logn + k)

下界:二进制搜索下限是Omega(1),假设我们很幸运,并且记录标题是中间标题。在这种情况下,它是Omega(k)

这是我分析它的方式。

但是在讲座中,讲师使用了最好的案例和最坏的案例。 我有两个问题:

  1. 为什么需要使用最佳案例和最坏情况,是不是大O和Omega被认为是算法可以执行的最佳和最差情况?
  2. 他的分析是                 最坏情况:Theta(logn + k)
                    最佳案例:Theta(k)

    如果我使用最坏情况的概念来指代数据并且与算法无关,那么他的分析是正确的。 这是因为假设最坏的情况(CD标题到底或未找到)那么Big O和Omega都是log n,那就是theta(log n + k)。

    假设您没有做“最佳案例”和“最坏情况”,那么您如何分析算法?我的分析是对的吗?

2 个答案:

答案 0 :(得分:8)

  

为什么需要使用最佳情况和最坏情况,不是大O和Omega被认为是算法可以执行的最佳和最差情况?

不,Ο和Ω符号仅描述函数的边界,该函数描述算法实际行为的渐近行为。这是一个很好的

  • Ω描述下界:f( n )∈Ω(g( n ))表示f的渐近行为(< em> n )不小于 g( n )· k 对于某些正 k ,所以f( n 总是至少和 g( n )· k 一样多。
  • Ο描述上限:f( n )∈Ο(g( n ))表示f的渐近行为(< em> n )不超过 g( n )· k 对于某些正 k ,所以f( n 总是最多 g( n )· k

这两个可以应用于二进制搜索的最佳情况和最坏情况:

  • 最好的情况:你看的第一个元素是你正在寻找的元素
    • Ω(1):您需要至少一次查找
    • Ο(1):您最多需要 一次查询
  • 最坏的情况:元素不存在
    • Ω(log n ):您需要至少 log n 步骤,直到您可以说您要查找的元素不是本
    • Ο(log n ):您需要最多 log n 步骤,直到您可以说您要查找的元素不是本

你看,Ω和Ο值是相同的。在这种情况下,你可以说紧束缚最好的情况是Θ(1),最坏的情况是Θ(log n )。

但是我们常常只想知道上限或紧束,因为下界没有太多实用信息。

  

假设您没有做“最佳案例”和“最坏情况”,那么您如何分析算法?我的分析是对的吗?

是的,您的分析似乎是正确的。

答案 1 :(得分:2)

对于您的第一个问题,算法的最佳案例运行时,算法的最坏情况运行时,大O和大Ω符号之间存在差异。算法的最佳和最差情况运行时是具有精确值的实际数学函数,它们告诉您算法将执行的最大和最小工作量。为了描述这些函数的增长率,我们可以使用big-O和big-Ω表示法。但是,可以描述具有大Ω符号的函数的最佳情况行为或具有大O符号的最坏情况。例如,我们可能知道函数的最坏情况运行时可能是O(n 2 ),但实际上并不知道哪个函数是O(n 2 )最糟糕的行为是。如果我们想要对最坏情况的行为进行上限,以便我们知道它不是灾难性的,那么可能会发生这种情况。在这种情况下,最坏情况的行为可能实际上是Θ(n),在这种情况下,O(n 2 )是一个不好的上限,但是说最坏情况的行为是O (n 2 )在这种情况下表明它并不可怕。类似地,我们可以说算法的最佳情况是Ω(n),例如,如果我们知道它必须至少做线性工作,但不能判断它是否必须做多于此。

关于你的第二个问题,对算法的最坏情况和最佳情况行为的分析完全取决于输入数据的结构,并且通常很难分析最佳和最坏情况的行为算法没有看到它如何在不同的数据集上执行。通过展示一些特定的输入族来进行最坏情况分析是完全合理的(注意它必须是输入的,而不仅仅是一个输入,因为我们需要得到渐近界限)并表明该算法必须在该输入上运行不佳。您可以用同样的方式进行最佳案例分析。

希望这有帮助!