降低DP算法时间复杂度的一般技巧

时间:2012-10-18 05:04:57

标签: algorithm

因此,当我在编程竞赛(ACM ICPC等)中遇到一些练习问题时,人们经常会使用O(N ^ 2)解决方案,甚至更糟糕的是,使用Heap(C ++中的priority_queue)或者一个deque来降低复杂性。 (作为某种优化,在注意到模式中的“某些东西”之后)

例如在“最大滑动窗口”问题中,这几乎是:

For each window of size K in an array of size N, compute the maximum.

有一个简单的O(NK)算法,一个相当容易的O(nlogn)解决方案(甚至我可以看到它,使用堆)和O(N)解决方案,使用双端队列。

这些原则似乎是“抛弃”无用值,或查询某个地区以寻找财产(最大值,累计金额,最小值等)的原则。

例如,要将一些O(N ^ 2)算法转换为O(NlogN),有时您可以使用priority_queue并保持弹出值,直到您在某个窗口中获得一个值,而不是循环遍历所有先前的N个元素找到最大值。

任何人都有好的建议吗? (除了做更多的问题......我正试图这样做)

1 个答案:

答案 0 :(得分:0)

DP算法的基础是分裂问题。

为了减少时间复杂度,让我们以不同的方式分解问题。

对于实施DP算法,我们使用许多简单的子算法,例如sort,tree(即使它不是算法),...

如果您想降低时间复杂度,请更快地体现此算法。

如果您使用排序,请使用快速排序或堆排序,而不是选择/冒泡排序。

如果要获取最小/最大值,请使用堆或优先级队列。

如果你不能制作更快的递推公式,那么使用更快的子算法减少时间。