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