【发布时间】:2010-04-08 01:26:09
【问题描述】:
使用二分搜索在数组中定位所有 n 个已排序的不同整数所需的比较总数是多少?我认为数字是 n log2 n (2 是基数),但我不确定。你怎么看?
【问题讨论】:
标签: java algorithm binary-search
使用二分搜索在数组中定位所有 n 个已排序的不同整数所需的比较总数是多少?我认为数字是 n log2 n (2 是基数),但我不确定。你怎么看?
【问题讨论】:
标签: java algorithm binary-search
如果你想要一个准确的答案,那么显然不是 N log(N) 或N log2(N)。对于大多数整数 N,logN 和 log2 不是有理数,但比较的次数必须是整数值。
另外,确切的答案将取决于二分搜索算法的实现细节。例如,如果“比较”是返回真假的简单关系,则比“比较”返回负数、零或正数时需要更多的比较。 (在后一种情况下,可以在算法早早命中关键时短路。)
【讨论】:
每一个都需要log2 n,而且需要n次,所以n log n就是这样。
【讨论】:
我会说它需要n log m
其中m是数组的大小,所以log m要找一个值。
然后你对n 不同的整数执行n 次。
所以总共n log m。
【讨论】:
对于 1 个数字,最多会有 (2 * log2n + 1) 次四舍五入(因此 7.6 => 7)比较。
当我们在数组中找到某个数字时,首先我们检查它是否是我们正在寻找的那个。 (== 第一次比较)。 之后我们检查它是否更小(或更大)(第二次比较)。
要找到数字,我们最多必须处理 log2n 个数字。
我们必须对最后一个数字进行最后一次比较,以检查这是不是那个。
因此,在 [1..16] 中查找 16 需要 2*log216 + 1 = 9 次比较(假设我们找到这些数字:8、12、14、15、16 )。在 [1..10] 中寻找 10 需要 2*log210 + 1 = 7.6 => 7(假设我们落在这些数字上:5、8、9、10)。
所以对于 n 个数字,最多会有 n 倍。
【讨论】:
感谢您的 cmets,现在我清楚了。我认为斯蒂芬 C 说的是真的。我认为除非我们有一个确切的值,否则我们实际上无法为这个问题制定一个公式。但是,如果 n=2^n -1,如 511(2^9 -1),则很容易计算。对于 511,比较总数 = 1x1 + 2X2 + 3X4 + 4X8 + 5X16 + 6X32 + 7X64 + 8X128 + 9X256 = 4097。
【讨论】: