查找比较次数
Finding number of comparisons
我正在尝试跟踪此二进制搜索代码中的键比较次数。对于 2^16
的数组大小,比较结果应该在 17 左右。你能解释一下为什么我会得到 33 吗?
public class AdvancedBinarySearch {
int count = 0;
// Returns location of key, or -1 if not found
int AdvancedBinarySearch(int arr[], int l, int r, int x) {
int m;
while (r - l > 1) {
count++;
m = l + (r - l) / 2;
if (arr[m] <= x) {
l = m;
count++;
} else {
r = m;
count++;
}
}
if (arr[l] == x) {
count++;
return l;
}
if (arr[r] == x) {
count++;
return r;
} else {
count++;
return -1;
}
}
public void setCount(int i) {
this.count = i;
}
}
您的代码对 if (arr[m] <= x)
比较进行了两次计数。如果您从 l = m
下方以及 r = m
下方移除 count++
,则不会再发生这种情况。
我在这个变化前后测试了这个,在一个从 0 到 65535 的整数数组中搜索 189。这个数组的大小是 2^16,在变化之前,计算了 33 次比较,之后这个变化,计算了 17 次比较,所以我认为这个变化做了你想要它做的。
我正在尝试跟踪此二进制搜索代码中的键比较次数。对于 2^16
的数组大小,比较结果应该在 17 左右。你能解释一下为什么我会得到 33 吗?
public class AdvancedBinarySearch {
int count = 0;
// Returns location of key, or -1 if not found
int AdvancedBinarySearch(int arr[], int l, int r, int x) {
int m;
while (r - l > 1) {
count++;
m = l + (r - l) / 2;
if (arr[m] <= x) {
l = m;
count++;
} else {
r = m;
count++;
}
}
if (arr[l] == x) {
count++;
return l;
}
if (arr[r] == x) {
count++;
return r;
} else {
count++;
return -1;
}
}
public void setCount(int i) {
this.count = i;
}
}
您的代码对 if (arr[m] <= x)
比较进行了两次计数。如果您从 l = m
下方以及 r = m
下方移除 count++
,则不会再发生这种情况。
我在这个变化前后测试了这个,在一个从 0 到 65535 的整数数组中搜索 189。这个数组的大小是 2^16,在变化之前,计算了 33 次比较,之后这个变化,计算了 17 次比较,所以我认为这个变化做了你想要它做的。