【问题标题】:number of comparisons of binary search二分查找的比较次数
【发布时间】:2010-04-08 01:26:09
【问题描述】:

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

【问题讨论】:

    标签: java algorithm binary-search


    【解决方案1】:

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

    另外,确切的答案将取决于二分搜索算法的实现细节。例如,如果“比较”是返回真假的简单关系,则比“比较”返回负数、零或正数时需要更多的比较。 (在后一种情况下,可以在算法早早命中关键时短路。)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我会说它需要n log m

        其中m是数组的大小,所以log m要找一个值。 然后你对n 不同的整数执行n 次。

        所以总共n log m

        【讨论】:

        • 关于我的问题的更多细节:搜索算法是:int left = 0,right = array.length()-1; while(left
        • 我误解了你的问题,我认为事先知道在任意长度(= m)的排序数组中可以找到多少个不同的整数(= n)。我的错。
        • 感谢您的 cmets,现在我清楚了。我认为斯蒂芬 C 说的是真的。我认为除非我们有一个确切的值,否则我们实际上无法为这个问题制定一个公式。但是,如果 n=2^n -1,如 511(2^9 -1),则很容易计算。对于 511,比较总数 = 1x1 + 2X2 + 3X4 + 4X8 + 5X16 + 6X32 + 7X64 + 8X128 + 9X256 = 4097。
        【解决方案4】:

        对于 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 倍。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-11-11
            • 1970-01-01
            • 1970-01-01
            • 2018-03-27
            • 2020-10-22
            • 2021-05-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多