Java 二进制搜索的比较次数
使用二进制搜索查找数组中所有n个排序的不同整数所需的比较总数是多少?我认为这个数字是n log2 n(2是基数),但我不确定。你觉得怎么样 如果你想要一个准确的答案,那么它显然是而不是nlog(N)或nlog2(N)。对于大多数整数N,logN和log2不是有理数,但是比较的次数必须是整数值Java 二进制搜索的比较次数,java,algorithm,binary-search,Java,Algorithm,Binary Search,使用二进制搜索查找数组中所有n个排序的不同整数所需的比较总数是多少?我认为这个数字是n log2 n(2是基数),但我不确定。你觉得怎么样 如果你想要一个准确的答案,那么它显然是而不是nlog(N)或nlog2(N)。对于大多数整数N,logN和log2不是有理数,但是比较的次数必须是整数值 此外,确切答案将取决于二进制搜索算法的实现细节。例如,如果“比较”是返回true和false的简单关系,则需要比“比较”返回负值、零或正值时进行更多的比较。(在后一种情况下,当算法提前点击键时,您可以短路。
此外,确切答案将取决于二进制搜索算法的实现细节。例如,如果“比较”是返回true和false的简单关系,则需要比“比较”返回负值、零或正值时进行更多的比较。(在后一种情况下,当算法提前点击键时,您可以短路。)找到每一个需要
log2n
,并且需要执行n
次,所以nlogn
就是这样。我认为需要nlogm
其中m是数组的大小,因此记录m
以查找值。
然后对不同的整数执行n
次
因此,总共n logm
。对于1个数字,最多会有(2*log2n+1)个向下舍入的比较(So 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倍的数字。谢谢您的评论,现在我明白了。我认为斯蒂芬C说的是真的。我认为,除非我们有一个精确的值,否则我们实际上无法计算出这个问题的公式。然而,如果n=2^n-1,如511(2^9-1),则很容易计算。对于511,比较总数=1x1+2X2+3X4+4X8+5X16+6X32+7X64+8X128+9X256=4097。关于我的问题的更多详细信息:搜索算法是:int left=0,right=array.length()-1;虽然我误解了你的问题,但我认为在任意长度(=m)的排序数组中要找到(=n)有多少个不同的整数是事先知道的.我的错。谢谢你的评论,现在我明白了。我认为斯蒂芬C说的是真的。我认为除非我们有一个精确的值,否则我们实际上无法计算出这个问题的公式。但是,如果n=2^n-1,比如511(2^9-1)对于511,比较总数=1x1+2X2+3X4+4X8+5X16+6X32+7X64+8X128+9X256=4097。