排序和二元搜索还是线性搜索?

时间:2014-09-11 18:27:09

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

问题

选择排序的时间复杂度为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。这是对的吗?

1 个答案:

答案 0 :(得分:2)

您尝试的精确度远远超过简单的操作次数。要获得完全号码,您需要考虑处理器缓存等问题(线性搜索可能会更好地使用它)。

然而,要获得一般的想法,我们可以看一下大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)* log 2 (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个项目,Shell-Metzner排序,大致为O(N 1.2 )复杂度可能非常最终比Quicksort更快。根据我的经验,它通常高达1500-2000件。但是,如果有的话,甚至更难以估计任何真实的准确性,所以我只是猜测它有可能减少盈亏平衡点a一点点。