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