对于我们正在寻找的元素出现的2 ^ n-1个元素的排序数组的二元搜索,最终情况下的最终时间复杂度是多少?
在我的评审表上找到了我的期末考试 . 我甚至无法弄清楚为什么我们要为二进制搜索分配时间复杂度,因为最坏的情况是O(log n) . 根据我的说明,摊销成本计算算法的上限,然后将其除以项目数,因此不会像最坏情况时间复杂度除以n那样简单,意味着O(log n )/ 2 ^ N-1?
作为参考,这是我一直在使用的二进制搜索:
public static boolean binarySearch(int x, int[] sorted) {
int s = 0; //start
int e = sorted.length-1; //end
while(s <= e) {
int mid = s + (e-s)/2;
if( sorted[mid] == x )
return true;
else if( sorted[mid] < x )
start = mid+1;
else
end = mid-1;
}
return false;
}
2 回答
老实说,我不确定这意味着什么 - 我没有看到摊销如何与二元搜索相互作用 .
也许问题是询问成功的二元搜索的平均成本是多少 . 您可以想象二进制搜索阵列的所有n个元素并查看此类操作的平均成本 . 在这种情况下,有一个元素,搜索产生一个探针,两个搜索产生两个探针,四个产生三个探针,等等 . 这平均为O(log n) .
希望这可以帮助!
iAmortized cost是所有可能查询的总成本除以可能的查询数 . 您将获得略有不同的结果,具体取决于您如何计算无法找到项目的查询 . (要么根本不计算它们,要么计算缺失项目可能存在的每个间隙 . )
因此,对于搜索2 ^ n - 1个项目(仅作为保持数学简单的示例),您可以在第一个探针上找到一个项目,在第二个探针上找到2个项目,在第三个探针上找到4个项目,...第n个探针上的... 2 ^(n-1) . 缺失项目有2 ^ n个“缺口”(记住将两端计为缺口) .
使用您的算法,在探针k上查找项目需要进行2k-1次比较 . (对于kth之前的每个k-1探测器,这是2比较,加上一个,其中==的测试返回true . )搜索不在表中的项目需要进行2n次比较 .
我会留给你做数学计算,但是当我看到以这种方式编码的二进制搜索时,我不能不表达我的烦恼 . 考虑:
当你点击你正在寻找的项目时,你不会使循环短路,这似乎是一个缺陷,但另一方面,你只对你看到的每个项目进行一次比较,而不是对每个项目进行两次比较那不匹配 . 由于所有项目中有一半是在搜索树的叶子上找到的,因此看起来像缺陷的东西最终会成为主要收获 . 实际上,使环路短路有利的元件数量仅约为阵列中元件数量的平方根 .
通过算术研究,计算摊销的搜索成本(计算"cost"作为排序[mid]的比较次数,并且你重要的是'll see that this version is approximately twice as fast. It also has constant cost (within ±1 comparison), depending only on the number of items in the array and not on where or even if the item is found. Not that that' .