Java 我们能把背包问题转换成对数时间吗?

Java 我们能把背包问题转换成对数时间吗?,java,big-o,dynamic-programming,Java,Big O,Dynamic Programming,如果我想要一个有保证的最优解,那么我能做的最好的就是一个N^(N-1)解,因为我必须评估每一个可能的组合 如果我想找到一个类似于optional的好的解决方案,那么我认为O(log(N))中有一些算法可以找到这样的解决方案。答案究竟是什么?就是这样,这取决于我、你和你的系统。这类问题的范围惊人地大,即它需要的数据存储容量。关于限制动态编程,挑战在于您修复的代码中不同子问题的数量。挑战总是如此之高,以至于没有时间限制。在这种情况下,我必须优化它。例如,矩阵链的乘法应该属于该组 在某些情况下,我可能

如果我想要一个有保证的最优解,那么我能做的最好的就是一个N^(N-1)解,因为我必须评估每一个可能的组合


如果我想找到一个类似于optional的好的解决方案,那么我认为O(log(N))中有一些算法可以找到这样的解决方案。答案究竟是什么?

就是这样,这取决于我、你和你的系统。这类问题的范围惊人地大,即它需要的数据存储容量。关于限制动态编程,挑战在于您修复的代码中不同子问题的数量。挑战总是如此之高,以至于没有时间限制。在这种情况下,我必须优化它。例如,矩阵链的乘法应该属于该组

在某些情况下,我可能会使用矩阵或哈希表;这是因为两者都有时间进行O(1)查找。时间复杂度可以从O(2^n)指数时间增加到O(2^n)伪多项式时间复杂度(nxw)。这也意味着,如果WW是一个常数,或者在NN(我的背包幂)中有一个多项式,那么动态程序就是多项式时间

但是我需要优化它,从psuedo多项式时间O(nxw)到对数时间复杂度O(logn)。例如,我用动态规划方法解决了一个背包问题,该方法在空间和时间上都采用了多项式时间复杂性O(N x W):

类背包{
静态整数最大值(整数a、整数b)
{返回(a>b)?a:b;}
静态整数背包(整数W,整数wt[],整数val[],整数n)
{ 
int i,w;
整数K[][]=新整数[n+1][W+1];

对于(i=0;i就是这样,这取决于,这取决于我、你和你的系统。这些问题的范围惊人地大,也就是说,它需要的数据存储容量。关于限制动态编程,挑战是你修复的代码中不同子问题的数量。挑战总是如此之高以至于没有时间限制。我必须在这种情况下对其进行优化。例如,矩阵链的乘法应该属于该组

在某些情况下,我可能会使用矩阵或哈希表;这是因为两者都有时间进行O(1)查找。时间的复杂性可以从O(2^n)指数时间增加到O(2^n)伪多项式时间复杂性(nx W)这也意味着,如果WW是一个常数,或由我的背包幂NN中的多项式所限定,则动态程序是多项式时间

但我需要优化它,从伪多项式时间O(nx W)到对数时间复杂性O(logn)。例如,我用动态规划方法解决了一个背包问题,该方法在空间和时间上都考虑了多项式时间复杂性O(nx W):

类背包{
静态整数最大值(整数a、整数b)
{返回(a>b)?a:b;}
静态整数背包(整数W,整数wt[],整数val[],整数n)
{ 
int i,w;
整数K[][]=新整数[n+1][W+1];

对于(i=0;依这种方式,“对数时间”应该是O(logn),而不是O(n logn)。在O(logn)时间内实现合理的近似值显然是不可能的,因为您需要至少访问每个项目一次。顺便说一下,“对数时间”应该是O(logn),而不是O(n logn)。在O(logn)时间内实现合理的近似值时间显然是不可能的,因为你需要至少访问每个项目一次。我不知道为什么将解决方案移动到多项式时间只是使用哈希表。要获得最佳解决方案,你确实需要搜索所有变量。我不认为你能够得到它,@kelly jade,NP Complete是最重要的背包问题,因此没有已知的答案在多项式时间内运行的精确算法,更不用说对数时间了。这取决于你如何处理它。为了最小化计算空间,我不知道为什么将解移动到多项式时间只是使用哈希表。要得到最佳解,你需要搜索所有的变量。我认为你无法得到它,@kelly jade,NP完全是最重要的背包问题,因此没有已知的精确算法可以在多项式时间内运行,更不用说对数时间了。这取决于你如何处理它。为了最小化计算空间,更安全