二元搜索的比较次数

时间:2010-04-07 06:40:39

标签: java algorithm binary-search

使用二进制搜索查找数组中所有n个已排序的不同整数所需的比较总数是多少?我认为这个数字是 n log 2 n (2是基数),但我不确定。你怎么看?

5 个答案:

答案 0 :(得分:3)

如果你想要一个确切的答案,那么显然 N log(N)或N log 2 (N)。对于大多数整数N,logN和log 2 是不合理的,但比较的数量必须是整数值。

此外,确切的答案将取决于二进制搜索算法的实现细节。例如,如果“比较”是返回true和false的简单关系,则需要比“比较”返回负数,零或正数时更多的比较。 (在后一种情况下,当算法提前击中键时,您可以短路。)

答案 1 :(得分:1)

每个人都需要log2 n,而且需要n次,所以n log n就是这样。

答案 2 :(得分:0)

我会说需要n log m

其中m是数组的大小,因此log m找到一个值。 然后,对n个不同的整数执行n次。

总共n log m

答案 3 :(得分:0)

最多(2 * log 2 n + 1)向下舍入(因此7.6 => 7)1个数字的比较。

当我们登陆阵列中的某个数字时,首先我们检查它是否是我们正在寻找的那个。 (==第一次比较)。 之后我们检查它是否更小(或更大)(第二次比较)。

要查找号码,我们必须处理最多log 2 n个数字。

我们必须对最后一个数字进行最后一次比较,以确定这是一个。

因此在[1..16]中寻找16将需要2 * log 2 16 + 1 = 9比较(假设我们登陆这些数字:8,12,14,15,16 )。在[1..10]中寻找10将需要2 * log 2 10 + 1 = 7.6 => 7(假设我们依靠这些数字:5,8,9,10)。

因此对于n个数字,最多会有n倍。

答案 4 :(得分:0)

感谢您的评论,现在我很清楚。我认为斯蒂芬C所说的是真的。我认为除非我们有确切的价值,否则我们实际上无法计算出这个问题的公式。但是,如果n = 2 ^ n -1,如511(2 ^ 9 -1),则很容易计算。对于511,比较总数= 1x1 + 2X2 + 3X4 + 4X8 + 5X16 + 6X32 + 7X64 + 8X128 + 9X256 = 4097。