Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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
Java 为什么在数组/堆栈/队列和其他数据结构中没有大O表示法的最佳情况?_Java_Data Structures - Fatal编程技术网

Java 为什么在数组/堆栈/队列和其他数据结构中没有大O表示法的最佳情况?

Java 为什么在数组/堆栈/队列和其他数据结构中没有大O表示法的最佳情况?,java,data-structures,Java,Data Structures,我正在看这张备忘单,我想知道为什么网站上没有提到最好的案例。为什么只有一般和最坏的情况 主要原因与您购买汽车保险或医疗保险的原因相同,但不要购买中奖保险或我是健康保险:防范异常(或恶意)大型下跌异常值事件有价值,但没有必要“保护”类似的上扬事件 第二个原因是,与最坏情况下的保证不同,无输入将触发行为,“最佳情况”保证在没有进一步准确描述哪些输入触发最佳情况的情况下并不十分有用。许多算法实现确实将此类信息作为额外细粒度性能保证的一部分,但这主要不在经典复杂性分析范围内 下行保险 本部分假设“预期”

我正在看这张备忘单,我想知道为什么网站上没有提到最好的案例。为什么只有一般和最坏的情况

主要原因与您购买汽车保险医疗保险的原因相同,但不要购买中奖保险我是健康保险:防范异常(或恶意)大型下跌异常值事件有价值,但没有必要“保护”类似的上扬事件

第二个原因是,与最坏情况下的保证不同,输入将触发行为,“最佳情况”保证在没有进一步准确描述哪些输入触发最佳情况的情况下并不十分有用。许多算法实现确实将此类信息作为额外细粒度性能保证的一部分,但这主要不在经典复杂性分析范围内

下行保险 本部分假设“预期”复杂性的有用性是显而易见的——如果您的输入与平均案例复杂性分析中假设的分布相匹配,那么它就是您应该期望的性能。这自然提出了一个问题,为什么要包括(不太可能的)最坏情况分析,而不包括表面对称的最佳情况分析。 一般来说,最好的情况当然是可计算的1,并且它们倾向于围绕两个值进行聚类:
O(1)
(例如,对于大多数结构操作)或
O(n)
(对于至少需要检查其所有输入的算法,并且如果它们有特殊情况来检测输入是否已处于所需格式),所以最好的情况其实并不重要。通常,算法甚至不会对最佳情况场景进行特殊处理,并且平均和最佳情况复杂度是相同的

基本上,在选择算法时,您应该期望平均情况。然后你必须看看异常值:在最坏的情况下会发生什么,在最好的情况下会发生什么

最坏情况非常重要,因为如果您通常有
n*lg(n)
行为,但偶尔有
n
2^n
甚至
n^5
行为,可能会关闭您的应用程序,使您的服务不可用等。因此,最坏的情况值得考虑,包括可能无意触发它的输入,以及可能故意触发它的恶意使用

在最好的情况下,您的某些行为要么平平,要么优于一般情况。这并不重要。您已经在为一个通常结果是平均情况的系统进行设计,因此,如果您有一些非常奇怪的输入碰巧触发了最佳情况,这很酷-但这不是您用来选择系统的核心标准,因为它是一个异常值

最佳情况输入的特征化 现在,您可能会争辩说,您的特定输入将一直触发最佳案例,因此最佳案例复杂性非常重要。问题是,单是最好的案例复杂性不足以保证任何事情。它只是告诉你,对于至少一个输入,这就是复杂性,而没有告诉你这类输入是什么。你必须知道具体算法的细节才能找到答案。您很容易做出错误的假设:例如,如果排序算法具有
O(n)
最佳情况复杂性,您可能会假设它适用于已排序的输入,对吗?事实上,对于“密集输入”,它可能使用基数排序,但对于稀疏或非数值输入,则返回到merge/quick/which排序

一旦你接受了“最好的情况”是不够的,你就需要为你的特定输入描述算法的性能。这将其转换为针对特定输入分布的平均案例分析(所有平均案例分析都需要假设输入分布,并且“一致随机”是典型的)。在这一点上,您最好完全不用O表示法,只描述感兴趣的平台上的实际运行时

另一方面,最坏情况复杂性没有这个问题-它保证不存在任何触发最坏情况行为的输入。这一保证非常有用。最好的保证是至少存在一个算法非常快的输入,这并没有多大帮助

最后,如果发布的最佳案例真的是一个重要的选择标准,那么大多数算法都可以简单地将单个已知输入编码到返回已知输出的算法中,并且性能损失最小(另一方面,为获得良好性能而检测一组通常有用的特殊情况通常会减慢非最佳情况的使用)

它主要是关于什么是有趣的。。。 平心而论,您经常会发现列出的最佳案例复杂性,可能只是出于对对称性的渴望,或者因为这样做很容易。维基百科肯定会将算法与其他案例一起排序。因此,它们并不是不存在的(正如您在标题中所暗示的)只是因为你发现了一个没有列出它们的
.pdf
,但大多数情况下它们并不有趣


1在许多情况下,它们比一般情况(通常是最困难的)更容易计算,通常是微不足道的或者是最坏的情况。这是你没有看到最好的案例复杂度的另一个原因:它经常被检查明显。你可以认为第三个原因是最好的案例复杂度不有趣。< /P>什么是“最佳”案例的意义?因为最好的情况总是O(1)。.相当于翻开牌组中的第一张牌,而它正是你要看的那张