每个算法都有“最佳案例”和“最坏情况”,这是一个人提出的问题吗?我认为每个算法都有一个案例取决于它的输入,因此一个算法发现一组特定的输入是最好的情况,但其他算法认为它是最坏的情况。
那么哪个答案是正确的,如果有没有最佳案例的算法,你能给出一个例子吗?
谢谢你:)
答案 0 :(得分:3)
不,并非每个算法都有最佳和最差的情况。一个例子是线性搜索,以查找未排序数组中的max / min元素:无论如何,它总是检查数组中的所有项。因此,时间复杂度是Theta(N),它与特定输入无关。
答案 1 :(得分:1)
嗯,我相信每个算法都有最好和最坏的情况,尽管不能保证它们会有所不同。例如,返回数组中第一个元素的算法具有WM_PAINT
最佳,最差和平均的情况。
Contrived,我知道,但我所说的是,它完全取决于算法的最佳和最差情况,但案例将存在,即使它们是相同的,或者在高端无限制。
答案 2 :(得分:1)
我认为可以合理地说大多数算法都有最佳和最差的情况。如果您根据渐近分析考虑算法,可以说O(n)搜索算法的性能比O(log n)算法差。但是,如果您为O(n)算法提供搜索项在数据集中早期的数据,并且O(log n)算法提供数据,其中搜索项位于要找到的最后一个节点中的O(n)将比O(log n)执行得更快。
然而,每次必须检查每个输入的算法(例如平均算法)将不具有最佳/最差,因为无论数据处理时间是否相同。
如果您不熟悉渐近分析(AKA大O),我建议您了解它以便更好地了解您的要求。
答案 3 :(得分:1)
最佳案例输入是您的代码占用最少:
的情况。例如。您的代码中有procedure calls
,并且在if
部分中为每个元素进行迭代而不执行此类功能。因此,代码未输入else
块的任何输入都将是if
,相反,代码输入此输入的任何输入,如果此算法将为best case input
。
如果对于任何算法,分支或递归或循环导致该算法的worst case
存在差异,则它将具有complexity factor
或possible best case
方案。否则,你可以说它没有或者它有possible worst case
表示最佳情况或最坏情况。
谈到排序算法,我们举例说明similar complexity
和merge
排序。 (我相信你很了解它们,以及它们的复杂性)。
在每次quick
中,数组被分为两个相等的部分,因此在重组时采用merge sort
因子分割,需要log n
时间(对于每个分割,当然)。因此,总复杂度始终为O(n)
,并且不依赖于输入。因此,您可以说合并排序没有最佳/最差情况,或者其最佳/最差情况的复杂性相同。
另一方面,如果快速排序(非随机,枢轴始终是第一个元素)被赋予随机输入,它将始终将数组分成两部分,(可能相同也可能不相等)无所谓)如果它这样做,O(n log n)
就会出现(虽然基数并不总是2)。但是,如果输入已经排序(升序或降序),它将始终将其拆分为log factor of its complexity
,因此需要1 element + rest of array
次迭代来拆分数组,这会将其n-1
因子更改为{ {1}}从而将复杂性更改为O(log n)
。因此,快速排序将具有不同时间复杂性的最佳和最差情况。