最近,我经历了一个痛苦的有趣经历,即向一个年轻的,有才华的自学成才的程序员非正式地解释了计算复杂性的概念,他以前从未参加过算法或复杂性方面的正式课程。毫不奇怪,许多概念起初看起来很奇怪,但是对于某些示例(PTIME,难处理性,不可计算性)是有意义的,而其他一些似乎更为自然(通过归约,以时间和空间为资源进行问题分类,渐进分析)。一切都很好,直到我意外地承认了SAT可以在实践中有效地解决*,就像那样,我丢了他们。我试图为理论辩护有多说服力都没关系,孩子坚信他不应该在乎那全是假话。好...
¯\ _(ツ)_ /¯
不,我没有伤心,也没有真正在乎他的想法,这不是这个问题的重点。我们的谈话让我想到了一个不同的问题,
对于理论上棘手的问题(超多项式时间复杂度)但实际上可以解决的问题(通过启发式,逼近,SAT求解器等),我真正了解多少?
我意识到,不多。我知道有一些非常有效的SAT解算器可以有效地解决大量实例,Simplex在实践中效果很好,也许还有其他一些问题或算法。您能帮我画出更完整的图画吗?此类别中哪些著名的问题甚至是几类问题?
TL; DR:在实践中可以解决哪些违反直觉的问题?是否有(更新的)资源来阅读更多内容?我们有他们的特征吗?最后,作为一般性讨论问题,不是吗?
编辑#1:在试图回答有关这种表征的最后一个讨论问题时,我被介绍给算法的平滑分析,这是丹尼尔·斯皮尔曼(Daniel Spielman)和滕尚华(Thang-Hua Teng)在[1]中引入的概念,该概念在最坏情况和最坏情况之间连续插值。算法的平均情况分析。它与上面讨论的特征不完全相同,但是它捕获了相同的概念,我发现它很有趣。
[1] Spielman,Daniel A.和Teng-Hua Teng。“平滑的算法分析:为什么单纯形算法通常需要多项式时间。” ACM杂志(JACM) 51,第 3(2004):385-463。