【问题标题】:How is binary search faster than linear search?二分查找比线性查找快多少?
【发布时间】:2020-07-05 18:01:24
【问题描述】:

我们需要一个排序数组来执行二分查找。在那种情况下,时间复杂度已经大于线性搜索,那么在这种情况下线性搜索不是更好的选择吗?

【问题讨论】:

  • 如果您需要排序一次然后搜索多次,排序成本将分摊到多次搜索中。
  • 因为排序不是二分查找的一部分,而是对数据的要求。因此,对于单一查找排序 + 二分搜索可能比线性搜索慢,但与比较一个搜索与另一个搜索不同。
  • 一位数学家朋友曾经对我说“嗯,log n 实际上是大 n 的常数!”换句话说,对于单次搜索,O(n log n) 实际上并不比 O(n) 差多少,这使得它非常值得作为对冲需要进行多次额外搜索的风险。
  • 请注意,“排序”是元素的属性,并不意味着数组已经排序。例如int a[] = {1,2,3,4,5}; 定义了一个排序数组。

标签: c++ algorithm binary-search linear-search


【解决方案1】:

线性搜索在O(N) 时间运行,因为它从头到尾扫描整个数组。

另一方面,二分查找首先在O(NlogN) 时间对数组进行排序(如果尚未排序),然后在O(logN) 时间执行查找。

对于少量查找,使用线性搜索会比使用二分搜索更快。但是,只要查找次数大于logN,理论上二分查找在性能上就会占上风。

因此,您的问题的答案是:线性搜索和二分搜索以不同的方式执行查找。线性搜索扫描整个数组,而二进制搜索首先对数组进行排序。这两种搜索技术具有不同的时间复杂度,但这并不意味着一种会总是优于另一种。

特别是,当列表的大小很小和/或您只需要执行少量查找时,线性搜索效果很好。在所有其他情况下,二分搜索应该会表现得更好。

【讨论】:

    【解决方案2】:

    如果你的容器已经排序或者你想搜索多个值会更好。

    【讨论】:

      【解决方案3】:

      首先,对于二分搜索,前提是数组已排序,这意味着您不需要使用它。其次,如果您在谈论整数数组,则可以使用 RadixSort O(d*n) 或 CountingSort O(n+l),它们在复杂性方面类似于线性搜索......

      【讨论】:

        【解决方案4】:

        当给定数组已经排序时,二分查找比线性查找要快。

        对于排序数组,二分查找提供平均 O(log n) 而线性提供 O(n)。

        对于任何未排序的给定数组,线性搜索变得最好,因为 O(n) 比对数组进行排序(例如使用快速排序 O(n log n) )然后再应用二分搜索,因此给定 O (n log n + log n) 复杂度。

        【讨论】:

        • 实际上,如果只是整数,您可以进行 radixSort,即 O(d*k),其复杂度类似于线性搜索。
        猜你喜欢
        • 2010-11-19
        • 2018-03-27
        • 1970-01-01
        • 2015-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多