【发布时间】:2013-05-29 18:58:24
【问题描述】:
我正在尝试证明二进制搜索的复杂性。在维基百科中说,最坏的情况是 log(n)。这意味着:
如果我有 16 个元素的数组,log(16) 为 4。我应该最多调用 4 次来查找数组中的元素。
我的java代码:
class Main{
int search(int[] array, int number, int start, int end) {
System.out.println("Method call");
int half = (end - start) / 2;
if (array[start + half] == number) {
return array[start + half];
}
if (array[start + half] < number) {
return search(array, number, start + half, end);
} else {
return search(array, number, start, end - half);
}
}
public static void main(String[] args) {
int[] array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
for (int i : array) {
System.out.println(i);
new Main().search(array, i, 0, array.length);
}
}
}
输出为:
1
Method call
Method call
Method call
Method call
Method call
2
Method call
Method call
Method call
Method call
3
Method call
Method call
Method call
4
Method call
Method call
Method call
Method call
5
Method call
Method call
6
Method call
Method call
Method call
Method call
7
Method call
Method call
Method call
8
Method call
Method call
Method call
Method call
9
Method call
10
Method call
Method call
Method call
Method call
11
Method call
Method call
Method call
12
Method call
Method call
Method call
Method call
13
Method call
Method call
14
Method call
Method call
Method call
Method call
15
Method call
Method call
Method call
16
Method call
Method call
Method call
Method call
一切都很好,除了搜索 1。我有 5 个“方法调用”,这意味着 5 大于 log(16)。
我的假设是,我计算电话的次数可能是错误的。谁能告诉我哪里错了?
【问题讨论】:
-
BTW log(16) == 1.2 google.com/search?q=log+16&oq=log+16
-
@sanbhat: Log(16) 是 4,当使用基数 2 计算时。要在使用标准计算器或谷歌时转换为基数 2,求和然后除以所需的对数,即对数(16) / log(2) = 4
-
出于复杂性目的,对数的底是无关紧要的。对于二分搜索,以 2 为底很直观,因为我们每一步都将间隔减半。另一方面,您并不能通过检查算法的实现方式来证明算法的复杂性。证明必须正式完成。
-
Big-O 表示法(基本上)忽略了常数因子。因此,例如,O(g(n)) = O(2.g(n)),或者等效于任何常数。您可能想给the Wikipedia page 通读一遍。
-
和类似的 O(log(n)) = O(log(n)+1)
标签: java algorithm complexity-theory big-o binary-search