每个算法都有最佳案例数据输入吗?
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 case
或 possible worst case
场景。否则,您可以说它没有或它有 similar complexity
最好的情况或最坏的情况。
说到排序算法,我们以merge
和quick
排序为例。 (我相信您很了解它们,以及它们在这方面的复杂性)。
每次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)
。因此,快速排序将具有不同时间复杂度的最佳和最坏情况。
是不是每个算法都有'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 case
或 possible worst case
场景。否则,您可以说它没有或它有 similar complexity
最好的情况或最坏的情况。
说到排序算法,我们以merge
和quick
排序为例。 (我相信您很了解它们,以及它们在这方面的复杂性)。
每次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)
。因此,快速排序将具有不同时间复杂度的最佳和最坏情况。