【问题标题】:Exhaustive searches vs sorting followed by binary search穷举搜索与排序后二分搜索
【发布时间】:2019-12-01 09:52:33
【问题描述】:

这是直接引用自 G. Michael Scneider 和 Judith L. Gersting 的教科书 Invitation to Computer Science

在第 3.4.2 节的末尾,我们讨论了在未排序列表上使用顺序搜索与排序列表然后使用二分搜索之间的权衡。如果列表大小为 n=100,000,则在第二个备选方案的比较次数更好之前,必须进行多少次最坏情况搜索?

我真的不明白这个问题在问什么。

顺序搜索是顺序(n),二进制是顺序(lgn),在任何情况下lgn总是小于n。在这种情况下,n 已经给出,所以我应该找到什么。

这是我的家庭作业之一,但我真的不知道该怎么做。谁能帮我用简单的英语解释一下这个问题?

【问题讨论】:

    标签: arrays algorithm sorting time-complexity binary-search


    【解决方案1】:

    二进制是有序的 (lgn),在任何情况下 lgn 总是小于 n
    这是你错的地方。在作业中,您也被要求考虑排序数组的成本。

    显然,如果您只需要一次搜索,第一种方法比排序数组和进行二分搜索更好:n < n*logn + logn。系统会询问您,您需要多少次搜索才能使第二种方法变得更有效。

    提示结束。

    【讨论】:

    • 与尖牙的答案不同,您的公式忽略了不同 O 项中不同常数(和较低效应项)的可能性。对于小的 n,即使 O(log(n)) 也可能比 O(n) 慢,并且通常会在实践中。
    • @Christopher 我没有提供公式,我只指出 OP 误解了问题所在。如果您认为我应该发布完整的解决方案,您显然可以对我投反对票,只是不要误会我的意图。毕竟,这是“作业”标签。
    • 您可能并不打算将其作为解决方案,而是您确实提供了一个公式。不,我认为您不应该提供解决方案,但您的回答只是漏掉了一个非常重要的方面。
    【解决方案2】:

    问题是如何决定选择哪种方法 - 仅使用线性搜索或排序然后使用二进制搜索。

    如果你只搜索几次线性搜索更好 - 它是 O(n),而排序已经是 O(n*logn)。如果您经常在同一个集合上搜索排序更好 - 多次搜索可能会变成 O(n*n) 但排序然后使用二分搜索再次搜索 O(n*logn) + NumberOfSearches*O(logn) 可以是根据 NumberOfSearches 和 n 的关系,少于或多于使用线性搜索。

    任务是确定 NumberOfSearches 的确切值(不是确切的数字,而是 n 的函数),这将使选项之一更可取:

     NumberOfSearches * O(n) <> O(n*logn) + NumberOfSearches * O(logn)
    

    不要忘记每个 O() 可以有不同的常量值。

    【讨论】:

    • 这个方程不能解。 O(n) 可以是给定 n 的任意数量的比较。 O(n*logn) 也一样。你的意图很清楚,但这个符号没有意义。 (就像您无法解决 O(n)=12 一样)我建议使用不同的函数名称(即 S(n)NumberOfOperationsForSorting(n))。 S(n) 是准确的,类似于:S(n)=2*n*log2(n)+n,给出一个可解方程。
    • @Ishtar:是的,你是对的。但这不是一个等式 - 中间有 &lt;&gt;。是的,您的提议确实可以更接近正确答案。
    【解决方案3】:

    方法的顺序在这里并不重要。它告诉你当问题变得越来越大时,算法的扩展性如何。如果你只知道O(n) == 它的复杂性随着问题的大小线性增长,你就无法进行任何精确的计算。它不会给你任何数字。

    这很可能意味着具有O(n) 复杂度的算法比O(logn) 算法更快,对于某些n。因为当 O(log(n)) 变大时可以更好地扩展,我们可以肯定地知道,有一个 n(问题大小),具有 O(logn) 复杂度的算法更快。我们只是不知道什么时候(为了什么n)。

    简单的英语:

    如果您想知道“搜索次数”,您需要精确的方程来求解,您需要精确的数字。搜索顺序需要多少次比较? (记住 n 是给定的,所以你可以给出一个数字。)使用二分搜索进行搜索需要多少次比较(在最坏的情况下!)?在进行二分搜索之前,您必须进行排序。让我们将排序所需的比较次数添加到二进制搜索的成本中。现在比较这两个数字,哪个少?

    二分查找很快,但排序很慢。顺序搜索比二分搜索慢,但比排序快。然而,排序只需要进行一次,无论您搜索多少次。那么,一次繁重的排序何时胜过每次都必须进行缓慢(顺序)搜索?

    祝你好运!

    【讨论】:

      【解决方案4】:

      对于顺序搜索,最坏的情况是 n = 100000,因此对于 p 个搜索,需要 p × 100000 次比较。

      使用 Θ(n2) 排序算法需要 100000 × 100000 次比较。

      对于每个搜索,二分搜索需要 1 + log n = 1 + log 100000 = 17 次比较,

      总共会有 100000×100000 + 17p 的比较。

      第一个表达式比第二个大,意思是 100000p > 100000^2 + 17p

      对于 p > 100017。

      【讨论】:

        【解决方案5】:

        问题是要了解补偿排序成本所需的数字NUM_SEARCHES。所以我们会有:

         time( NUM_SEARCHES * O(n) ) > time( NUM_SEARCHES * O(log(n)) + O(n* log(n)) )
        

        【讨论】:

          【解决方案6】:

          谢谢你们。我想我现在明白了。你能看看我的回答,看看我是否走在正确的轨道上。

          对于最坏情况的搜索 顺序搜索的比较次数为 n = 100,000。 二分查找的比较次数是 lg(n) = 17。 排序比较次数为 (n-1)/2 * n = (99999)(50000)。 (我正在按照我的教科书并使用我课堂上介绍的选择排序算法)

          所以设 p 是最坏情况的搜索次数,然后是 100,000p > (99999)(50000) + 17p
          或 p > 50008

          总之,我需要 50,008 次最坏情况搜索才能使排序和使用二分搜索比顺序搜索 n=100,000 的列表更好。

          【讨论】:

          • 本质上,您是在假装 O(f(n)) 和 f(n) 是同一件事,而一个不恰当的问题迫使您这样做。看到无知或懒惰的指导者在年轻人的头脑中植入错误的想法和混乱,这很可悲。这可能会让您获得学分,但会损害您理解和使用渐近分析的能力。 1 是 O(log n),2 log(n) + log log (n) 也是如此,10^8 log n + 10^10 也是如此。所有 f(n) 是 O(log n) 都告诉你是 f(n) 的一个上限,形式为 C log(n) 对于 n > N 是正确的。只有 N 和 C 的存在是隐含的,而不是它们有一定的价值。
          • 如果你想要一个特定的数字,但你不是 Don Knuth(在理想机器上进行装配工作,MMIX),则无法替代尝试。去这里spreadsheets.google.com/… 在 python 中找到一个比较。最后一栏是你的答案
          猜你喜欢
          • 2021-11-18
          • 1970-01-01
          • 2014-11-05
          • 2013-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-20
          • 1970-01-01
          相关资源
          最近更新 更多