Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 二进制搜索的摊销最坏情况复杂度_Algorithm_Search_Time Complexity_Binary Search_Amortized Analysis - Fatal编程技术网

Algorithm 二进制搜索的摊销最坏情况复杂度

Algorithm 二进制搜索的摊销最坏情况复杂度,algorithm,search,time-complexity,binary-search,amortized-analysis,Algorithm,Search,Time Complexity,Binary Search,Amortized Analysis,对于2^n-1个元素的排序数组的二进制搜索,我们要查找的元素出现在其中,摊销的最坏情况时间复杂度是多少 在我期末考试的复习表上找到了这个。我甚至想不出为什么我们需要二进制搜索的摊销时间复杂性,因为最坏的情况是OLOGN。根据我的笔记,摊余成本计算一个算法的上限,然后除以项数,那么这难道不像最坏情况下的时间复杂度除以n那么简单吗,这意味着Olog n/2^n-1 作为参考,以下是我一直使用的二进制搜索: public static boolean binarySearch(int x, int[]

对于2^n-1个元素的排序数组的二进制搜索,我们要查找的元素出现在其中,摊销的最坏情况时间复杂度是多少

在我期末考试的复习表上找到了这个。我甚至想不出为什么我们需要二进制搜索的摊销时间复杂性,因为最坏的情况是OLOGN。根据我的笔记,摊余成本计算一个算法的上限,然后除以项数,那么这难道不像最坏情况下的时间复杂度除以n那么简单吗,这意味着Olog 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;
}

老实说,我不确定这意味着什么——我不知道摊销如何与二进制搜索交互

也许问题在于成功的二进制搜索的平均成本是多少。您可以想象二进制搜索数组的所有n个元素,并查看这样一个操作的平均成本。在这种情况下,对于一个元素,搜索生成一个探测,对于两个元素,搜索生成两个探测,对于四个元素,搜索生成三个探测,等等。这将平均到Olog n


希望这有帮助

iAmortized cost是所有可能查询的总成本除以可能查询的数量。根据对未能找到该项的查询的计数方式,您将得到略有不同的结果。或者根本不计算它们,或者为可能丢失项目的每个间隙计算一个

因此,对于2^n-1项的搜索,作为一个保持数学简单的示例,您可以在第一个探测上找到一项,在第二个探测上找到2项,在第三个探测上找到4项。。。第n个探针上的2^n-1。缺少的项目有2^n个间隙,请记住将两端都计算为间隙

使用您的算法,在probe k上查找项目需要进行2k-1比较。对于第k个之前的每个k-1探测,这是2次比较,加上一次,==的测试返回true。搜索不在表中的项目需要2n次比较

我会让你来做数学运算,但我不能不表达当我看到二进制搜索以这种方式编码时我有多恼火。考虑:

public static boolean binarySearch(int x, int[] sorted {
    int s = 0; // start
    int e = sorted.length; // end

    // Loop invariant: if x is at sorted[k] then s <= k < e

    int mid = (s + e)/2;
    while (mid != s) {
        if (sorted[mid] > x) e = mid; else s = mid;
        mid = (s + e)/2; }
    return (mid < e) && (sorted[mid] == x); // mid == e means the array was empty
    }
当你点击你正在寻找的项目时,你不会使循环短路,这似乎是一个缺陷,但另一方面,你只对你看到的每个项目进行一次比较,而不是对不匹配的每个项目进行两次比较。由于所有项目中有一半是在搜索树的叶子上找到的,所以看起来有缺陷的东西最终成为了一个主要的收获。实际上,短路回路有益的元素数量仅为数组中元素数量的平方根


仔细研究一下这个算法,将摊销搜索成本计算为排序[mid]的比较次数,您将看到这个版本的速度大约是两倍。它还具有±1比较范围内的恒定成本,仅取决于阵列中的项目数量,而不取决于在何处或是否找到项目。这并不重要。

不,摊销并不意味着你将一次跑步的成本除以跑步次数。而是将所有跑步的综合成本除以跑步次数。此外,Olog n是输入大小为n时的复杂度,但有2^n-1。是的,对于以某种方式记住先前运行结果并将其用于后续运行的数据结构来说,摊销是有意义的。否则,正如您所观察到的,它是微不足道的。我不明白摊销与二进制搜索的相互作用,我想它不会。这并不意味着你不能谈论二进制搜索的摊销复杂度,但这意味着谈论它没有用,因为摊销复杂度与正常复杂度相同。我认为这是一道有效但令人困惑的考题。