【问题标题】:Binary search for last element when its in power of 2当它的幂为2时二进制搜索最后一个元素
【发布时间】:2016-07-26 06:47:04
【问题描述】:

我有一个排序数组。

例如。 { 1, 2, 3, 4, 5 ,6, 7, 8 }

如果我搜索元素 8,则需要 4 次迭代才能得到结果为真或假。我所知道的是二进制搜索的运行时间上限为 O(logn),在这种情况下结果为 3。

如果我错了,有人可以帮助我摆脱这种困惑或纠正我的概念吗?

我的代码如下:

public static boolean BinarySearch(int[] arr, int num){    
int mid, low, high;    
int count = 0;    
low = 0; high = arr.length -1;    
while( low <= high ){    
mid = low + (high-low)/2;    
if(arr[mid] == num)    
      return true;    
else if(arr[mid]<num)    
     low = mid +1;    
else
     high = mid -1;    
}    
return false;    
}

【问题讨论】:

    标签: arrays performance search binary asymptotic-complexity


    【解决方案1】:

    O 符号的意义在于隐藏不太重要的项,以便为复杂性得出一个更简单的表达式。所以即使二分查找的复杂度是O(lg n)是正确的,但准确的表达式很可能是ceil(lg n) + 1,甚至c ceil(lg n) + b 对于任何 cbceil() 操作对于始终从对数中得到一个整数结果)。

    【讨论】:

    • 感谢您的信息。我想再补充一件事。如果是这种情况,我们不能说它的 o(logn) (small-o) 更具体,因为它对运行时间有更严格的限制,因为我们知道只有值为 2 的精确幂的元素才需要 lg n+1.
    • 没有。 o(lg n) 表示 all 情况下的复杂度优于 lg n(即,给定任何正的 c i>,您可以找到一个合适的小常数来乘以实际复杂度,以便当 n 大于某个其他常数时结果小于 c lg n)。此外,当 n 的形式为 2^h - 1 时,复杂度是最佳的(即当您获得最佳复杂度 lg (n + 1) 在最坏的情况下));在其他情况下,它比公式告诉你的多 1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2013-01-03
    • 2023-03-04
    • 2022-01-22
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多