这是来自Cormen等人的Introduction to Algorithms的问题,但这不是一个家庭作业问题。相反,它是自学。
我已经考虑了很多并在Google上搜索过。我能想到的答案是:
但我不认为这些是正确的。更改算法与使算法具有更好的性能不同。使用更好的计算机也可以提高速度,但算法并不是更好。这是本书开头的一个问题,所以我觉得这很简单,我忽略了。
那么我们如何修改几乎所有算法以获得良好的最佳运行时间?
答案 0 :(得分:42)
您可以通过添加特殊情况修改任何算法以使O(n)
的案例时间复杂度最佳,如果输入符合此特殊情况,则返回缓存的硬编码答案(或其他一些容易获得的答案)
例如,对于任何排序,您可以通过检查数组是否已经排序来创建最佳情况O(n)
- 如果已排序,则按原样返回。
请注意,它不会影响平均或最差情况(假设它们不比O(n)
更好),并且您基本上可以提高算法的最佳案例时间复杂度。
注意:如果输入的大小有界,则相同的优化会得到最佳情况O(1)
,因为在这种情况下读取输入是O(1)
。
答案 1 :(得分:5)
如果我们可以在系统本身的计算模型中引入该算法的指令,我们就可以在一条指令中解决问题。
但是你可能已经发现这是一种非常不现实的方法。因此,修改任何算法以获得最佳案例运行时间的通用方法几乎是不可能的。我们在max处可以做的是在算法中应用针对各种问题中发现的一般冗余的调整。
或者你可以通过最好的案例输入来天真。但同样,这实际上并没有修改算法。实际上,将算法引入计算系统本身,而不是非常不现实,也不是算法中的修改。
答案 2 :(得分:1)
我们可以修改算法以获得最佳案例运行时间的方法是:
- 如果算法处于其目的/解决方案的位置,对于ex,对于增加的排序,它已经是升序排序等等。
- 如果我们修改算法,我们输出和退出只是为了它的目的,因此强制多个嵌套循环只是一个
答案 3 :(得分:1)
有时我们可以使用随机选择的随机算法来进行概率分析,从而缩短运行时间。
答案 4 :(得分:0)
我认为解决此问题的唯一方法是输入算法。因为时间复杂度分析中的情况仅取决于我们的输入,所以它有多复杂,有多少次运行该算法。根据此分析,我们确定情况是最佳,平均还是最差。 因此,我们的输入将决定每种情况下算法的运行时间。 或者我们可以更改算法以针对所有情况进行改进(降低时间复杂度)。
这是我们获得最佳的最佳运行时间的方法。
答案 5 :(得分:0)
我们可以针对一些特殊情况修改算法,因此如果输入满足该条件,我们可以输出预先计算的答案。通常,最佳情况运行时间不是算法的好度量。我们需要知道算法在最坏情况下的表现。
答案 6 :(得分:0)
我刚刚在寻找答案时参与了此讨论。我认为只有一种方法可以通过固定输入而不是可变输入来使任何算法成为最佳情况。如果我们总是有一个固定的输入,成本和时间复杂度总是 O(1)