什么时候使用 O(2^n) 算法是合理的?
When is it justified to use a O(2^n) algorithm?
有许多不同的排序算法选择,是否适合在任何示例中使用更高复杂度的算法?
我能想到的唯一原因是数组非常短,或者数组非常接近排序,或者只包含几个不同的数字。
With many different choices of sorting algorithms, is it ever appropriate to use a higher complexity algorithm in any example?
可能是,如果所关注的大 O 复杂度是最坏的情况,您确定自己不会命中,或者 n
如您所说的那样小(例如 n 是棋盘上剩下的白棋数量)和常数因素更重要。
O(2^n) 是极端的......你还必须考虑使用它的原因的稳定性 - 是否有人(将来包括你)不小心修改了使 O 的适用性无效的代码(2^n) 算法,当应用程序被调用且 n 高于最初预期或数据较少时,有时会导致应用程序锁定 "friendly"?
对于大多数事情,值得提前花时间创建一个相当高效且有望重用的算法,而且不必担心,但有时这可能会非常复杂且容易出错,并且 CPU 或记忆力的好处并不能证明它是合理的。最终,重要的是对您的实际项目的短期和长期影响。
通常在创建算法代码时,有一种非常简单、明显的解决方法,也有一种复杂但有效的解决方法,最好快速编写以前的代码以便您可以使用它来测试后者。前者可以称为 "oracle" 实现,因为它知道真相:正确答案。如果它也恰好足够快并且您有 n 的限制或所讨论的数据场景,您可能不需要进行到复杂的实现。
有许多不同的排序算法选择,是否适合在任何示例中使用更高复杂度的算法?
我能想到的唯一原因是数组非常短,或者数组非常接近排序,或者只包含几个不同的数字。
With many different choices of sorting algorithms, is it ever appropriate to use a higher complexity algorithm in any example?
可能是,如果所关注的大 O 复杂度是最坏的情况,您确定自己不会命中,或者 n
如您所说的那样小(例如 n 是棋盘上剩下的白棋数量)和常数因素更重要。
O(2^n) 是极端的......你还必须考虑使用它的原因的稳定性 - 是否有人(将来包括你)不小心修改了使 O 的适用性无效的代码(2^n) 算法,当应用程序被调用且 n 高于最初预期或数据较少时,有时会导致应用程序锁定 "friendly"?
对于大多数事情,值得提前花时间创建一个相当高效且有望重用的算法,而且不必担心,但有时这可能会非常复杂且容易出错,并且 CPU 或记忆力的好处并不能证明它是合理的。最终,重要的是对您的实际项目的短期和长期影响。
通常在创建算法代码时,有一种非常简单、明显的解决方法,也有一种复杂但有效的解决方法,最好快速编写以前的代码以便您可以使用它来测试后者。前者可以称为 "oracle" 实现,因为它知道真相:正确答案。如果它也恰好足够快并且您有 n 的限制或所讨论的数据场景,您可能不需要进行到复杂的实现。