每个算法都有最佳案例数据输入吗?

Does every algorithm has a best case data input?

是不是每个算法都有'best case'和'worst case',这是有人提出的问题,回答没有!我认为每个算法都有一个取决于其输入的情况,因此一个算法发现一组特定的输入是最好的情况,但其他算法认为它是最坏的情况。

所以哪个答案是正确的,如果有没有最佳情况的算法,你能举个例子吗?

谢谢 :)

好吧,我相信每个算法都有最好和最坏的情况,尽管不能保证它们会有所不同。例如,return 数组中第一个元素的算法具有 O(1) 最佳、最差和平均情况。

人为的,我知道,但我要说的是,这完全取决于算法,他们最好和最坏的情况是什么 但是这些情况会存在,即使它们是相同的,或者在顶端是无界的。

不,不是每个算法都有最好和最坏的情况。一个示例是在未排序的数组中查找 max/min 元素的线性搜索:无论如何,它总是检查数组中的所有项目。因此它的时间复杂度是 Theta(N) 并且它独立于特定的输入。

我认为说大多数算法都有最好和最坏的情况是合理的。如果您从渐近分析的角度考虑算法,您可以说 O(n) 搜索算法的性能比 O(log n) 算法差。但是,如果您为 O(n) 算法提供搜索项位于数据集中早期的数据,并为 O(log n) 算法提供搜索项位于要找到的最后一个节点中的数据,则 O(n)将比 O(log n) 执行得更快。

但是,每次都必须检查每个输入的算法(例如平均算法)不会有 best/worst,因为无论数据如何,处理时间都是相同的。

如果您不熟悉渐近分析(又名大 O),我建议您了解一下,以便更好地理解您的问题。

最佳案例输入是您的代码采用最少数量 procedure calls 的案例。例如。您的代码中有一个 if,并且在其中迭代每个元素,而 else 部分没有此类功能。因此,对于此算法,代码未进入 if 块的任何输入都将是 best case input,相反,代码进入此 if 的任何输入都将是 worst case

如果对于任何算法,分支或递归或循环导致该算法的 complexity factor 不同,它将具有 possible best casepossible worst case 场景。否则,您可以说它没有或它有 similar complexity 最好的情况或最坏的情况。

说到排序算法,我们以mergequick排序为例。 (我相信您很了解它们,以及它们在这方面的复杂性)。
每次merge sort,数组被分成两个相等的部分,因此拆分需要log n个因子,而重组需要O(n)次(因为当然是每次拆分)。因此,总复杂度总是 O(n log n) 并且它不依赖于输入。因此,您可以说合并排序没有 best/worst 个案例条件,或者它的复杂性与 best/worst 个案例相同。
另一方面,如果给快速排序 (不是随机的,主元总是第一个元素) 一个随机输入,它总是将数组分成两部分,(可能是也可能不是相等,无关紧要),如果这样做,log factor of its complexity 就会出现(尽管基数并不总是 2)。但是,如果输入已经排序(升序或降序),它将始终将其拆分为 1 element + rest of array,因此将需要 n-1 次迭代来拆分数组,这会将其 O(log n) 因子更改为 O(n) 从而将复杂度更改为 O(n^2)。因此,快速排序将具有不同时间复杂度的最佳和最坏情况。