就这样,这取决于,这取决于我,你,还有你的系统。这类问题的范围惊人地大,即它需要的数据存储容量。关于限制动态规划,挑战在于您修复的代码中不同子问题的数量。挑战总是那么高,没有时间限制。我将不得不在这种情况下优化它。例如,矩阵链的乘法应该属于这个组。 在某些情况下,我可能会使用矩阵或哈希表;这是因为两者都有时间进行o(1)查找。时间复杂度可以从o(2^n)指数时间增加到o(2^n)psuedo多项式时间复杂度(nxw)。这也意味着,如果ww是一个常数,或者在nn(我的背包幂)中有一个多项式,那么动态程序就是多项式时间。 但是我需要从psuedo多项式时间o(nxw)到对数时间复杂度o(logn)进行优化。例如,我用动态规划方法解决了一个背包问题,它在空间和时间上都采用多项式时间复杂性o(n x w):
class Knapsack {
static int max(int a, int b)
{ return (a > b) ? a : b; }
static int knapSack(int W, int wt[], int val[], int n)
{
int i, w;
int K[][] = new int[n + 1][W + 1];
for (i = 0; i<= n; i++) {
for (w = 0; w<= W; w++) {
if (i == 0 || w == 0)
K[i][w] = 0;
else if (wt[i - 1]<= w)
K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]);
else
K[i][w] = K[i - 1][w];
}
}
return K[n][W];
}
public static void main(String args[])
{
int val[] = new int[] { 60, 100, 120 };
int wt[] = new int[] { 10, 20, 30 };
int W = 50;
int n = val.length;
System.out.println(knapSack(W, wt, val, n));
}
}
1条答案
按热度按时间osh3o9ms1#
就这样,这取决于,这取决于我,你,还有你的系统。这类问题的范围惊人地大,即它需要的数据存储容量。关于限制动态规划,挑战在于您修复的代码中不同子问题的数量。挑战总是那么高,没有时间限制。我将不得不在这种情况下优化它。例如,矩阵链的乘法应该属于这个组。
在某些情况下,我可能会使用矩阵或哈希表;这是因为两者都有时间进行o(1)查找。时间复杂度可以从o(2^n)指数时间增加到o(2^n)psuedo多项式时间复杂度(nxw)。这也意味着,如果ww是一个常数,或者在nn(我的背包幂)中有一个多项式,那么动态程序就是多项式时间。
但是我需要从psuedo多项式时间o(nxw)到对数时间复杂度o(logn)进行优化。例如,我用动态规划方法解决了一个背包问题,它在空间和时间上都采用多项式时间复杂性o(n x w):
但dp在实际应用中需要很大的存储容量,并且容易随向量空间维数的增加而扩展。