【问题标题】:Sort and binary search or just linear search?排序和二分搜索还是线性搜索?
【发布时间】:2014-11-05 19:48:24
【问题描述】:

问题

选择排序的时间复杂度为n*(n-1)/2。给定一个包含 1000 个项目的列表,在排序和使用二分搜索更快之前,必须需要使用线性搜索进行多少次最坏情况搜索?

尝试解决方案

二分查找的时间复杂度为floor(log(n)/log(2)+1)。因此,一种选择排序后跟x 二分搜索的时间复杂度是n*(n-1)/2+x*floor(log(n)/log(2)+1)。线性搜索的时间复杂度为n,因此x线性搜索的时间复杂度为x*n。

因此我们建立了等式x*n=n*(n-1)/2+x*floor(log(n)/log(2)+1),对于n=1000 产生x=5550/11,因此产生floor(x)=floor(5550/11)=504。这是正确的吗?

【问题讨论】:

    标签: sorting complexity-theory time-complexity binary-search selection-sort


    【解决方案1】:

    您正在尝试获得比从简单数量的操作中获得的更高的精度。要获得准确的数字,您需要考虑处理器缓存等因素(线性搜索可能会更好地使用它)。

    然而,为了获得一个一般的想法,我们可以看看大 O 复杂度。排序的(预期)复杂度为 O(N log N)。一次二分查找的复杂度是O(log N),所以M个二分查找的复杂度是O(M log N)。排序和二分查找的总体复杂度约为 O((N+M) log N)。

    对于线性搜索,一次搜索的复杂度是O(N),所以M次搜索的复杂度是O(NM)。

    因此,对于 N = 1000,盈亏平衡点应该大约为:

    (1000+M) * log2(1000) = 1000 M。

    大约是:(1000+M) * 10 = 1000 M。

    如果我们取消常数并除以,我们得到:1000+M = 100M,那么:(1000+M)/100 = M

    分布,我们得到:1000/100 + M/100 = M

    减去,然后除以常数,得到:10 = .99M

    除法,我们基本上得到 M = 10。

    因此,忽略常数因素的差异,我们的收支平衡点应该大约是 10 次搜索。

    在真正的 CPU 上,我猜大多数常量因素(分支预测、缓存使用等)在某种程度上倾向于线性搜索而不是二进制搜索(即线性搜索很好地与缓存一起工作,并且它的分支是高度可预测的),所以我们希望看到线性搜索仍然比二分搜索更快,搜索次数比二分搜索多一些——可能至少有 20 次搜索,而且很可能有同样多的搜索为 50 或 100。

    不过,可能还有另一个因素需要考虑。对于 1000 个项目,具有大约 O(N1.2) 复杂性的 Shell-Metzner 排序可能非常最终会比快速排序快一些。根据我的经验,它通常多达 1500-2000 件左右。不过,如果有的话,更难以以任何真正的准确性进行估计,所以我只是猜测它很有可能会稍微降低收支平衡点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2019-12-20
      • 2019-01-09
      • 2010-10-16
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多