algorithm - 区间动态规划

标签 algorithm dynamic

我正在研究一个算法问题,但在加快速度方面遇到了瓶颈。

我有一个函数 f(i,j) , 其中ij是满足 1 <= i <= j <= n 的整数对于某些上限 n .这个函数已经写好了。

此外,这个函数满足等式f(i, j) + f(j, k) = f(i, k) .

我需要计算 f(x, y)对于许多不同的对 x, y .假设 n足够大,可以存储 f(x,y)对于每一对可能的 x,y会占用太多空间。

是否有针对此类问题的已知算法?我现在使用的是内存 f并尝试减少 x,y通过使用上面提到的等式将之前计算的数字对计算出来,但我的猜测是我没有以一种聪明的方式减少,而且它正在浪费我的时间。

编辑:假设f(i, j)花费的时间与 j-i 成正比当以朴素的方式计算时。

最佳答案

您可以使用二次方大小间隔的隐式树:

  • 商店 f(i,i+1)对于每个 i
  • 商店 f(i,i+2)对于每个偶数 i
  • 商店 f(i,i+4)对于每个 i能被四整除
  • ...

会有O(log n)表( floor(log_2(n)) ,确切地说),总大小为 O(n) (~ 2*n ).

检索f(i,j)其中 i<=j :

  • 找到i的最高位, j不同。
  • n是设置此位且清除所有低位的值。这保证了以下步骤将始终成功:
  • 找到f(i, n)反复从右侧切掉尽可能大的 block
  • 找到f(n, j)通过从左侧重复切掉尽可能大的 block

retreival 最多访问每个表两次,因此在 O(log n) 中运行.

关于algorithm - 区间动态规划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15874244/

相关文章:

r - 使用 R 将值移到 data.frame 的左侧

c++ - 算法成本

ios - 如何将项目排列成表格 View 中的部分?

c# - 如何最好地通过配置在 .NET (C#) 类中动态创建和执行方法

algorithm - 查找构建二叉搜索树的时间复杂度

c++ - 汽油泵循环游

javascript - 在 AJAX 上传期间显示进度条的百分比值

c# - System.__ComObject 的动态转换

C - 如何将指针值返回给 main?

algorithm - 如何找到所有最短路径