有没有办法测试算法进行完美优化?
答案 0 :(得分:8)
没有简单的方法可以证明任何给定的算法都是渐近最优的。
证明最优性(如果有的话)有时会在编写算法后的数年和/或数十年之后。一个典型的例子是Union-Find/disjoint-set data structure。
脱节集林是一种数据结构,其中每个集合由树数据结构表示,其中每个节点都拥有对其父节点的引用。它们首先由Bernard A. Galler和Michael J. Fischer于1964年描述,尽管它们的精确分析需要数年时间。
[...]这两种技术相辅相成;一起应用,每个操作的摊还时间仅为
O(α(n))
,其中α(n)
是函数f(n) = A(n,n)
的倒数,而A
是增长极快的Ackermann
功能。[...]事实上,这是渐近最优的:Fredman和Saks在1989年表明,每个操作平均必须通过任何不相交的数据结构来访问Ω(α(n))个字。
对于某些算法,经过非常仔细的分析可以证明最优性,但一般来说,没有简单的方法可以判断算法一旦写入就是最优的。事实上,要证明算法是否正确并不总是很容易。
O(N
3
)
,Strassen's大致为O(N
2.807
)
,Coppersmith-Winograd是O(N
2.376
)
,我们仍然不知道什么是最优的。 今天许多最着名的算法是否渐近最优是一个悬而未决的问题。例如,有一个
O(nα(n))
算法用于查找最小生成树。该算法是否渐近最优是未知的,并且如果以任何一种方式解决,可能会被视为重要结果。
请注意,由于许多因素(例如,易于实现,实际上对于给定输入参数范围实际上更好的性能等),有时渐近“更差”的算法在实践中更好。
一个典型的例子是quicksort,它具有简单的枢轴选择,可能表现出二次最坏情况的性能,但在许多场景中仍然比较复杂的变体和/或其他渐近最优的排序算法更受青睐。
答案 1 :(得分:4)
对于我们这些只想知道算法的凡人:
有一个简单的步骤称为“基准”。
挑选该地区最好的竞争者,并将其与您的算法进行比较。
如果您的算法获胜,则可以更好地满足您的需求(由...定义的算法) 你的基准)。