【问题标题】:Dynamic programming: how to design algorithm for when there are two factors to consider?动态规划:当需要考虑两个因素时如何设计算法?
【发布时间】:2023-03-27 00:12:02
【问题描述】:

我有以下问题,我对此只有一点想法:

考虑磁带存储问题。给定长度为l1,...,lnn 文件和访问它们的频率f1,...,fn,其中所有频率的总和为1 和0<fi<1。 “最优”是指最小化这些文件的平均检索时间。例如,如果你有两个文件,每个文件长度10, 4和频率0.8, 0.2,如果先存储文件1,则平均检索时间为10 x 0.8 + 14 x 0.2 = 10.8

设计一个算法来找到最优顺序并证明它有效。

我的想法: 顺序前面的频率越大,长度越长,但应该优先考虑哪个因素?

【问题讨论】:

  • 只是澄清一下-我需要通过第一个文件才能到达第二个文件?否则,为什么要... + 14 x 0.2
  • 磁带自动倒带可能在每次阅读后开始?这可能就是为什么14 x 0.2

标签: algorithm optimization dynamic-programming frequency


【解决方案1】:

这个问题不需要动态规划。这是一个简单的排序问题,略有不同。

为每个文件查找frequency / length。这让您了解文件的每个单位长度访问的频率。因为每个文件都被前一个文件的长度“惩罚”,所以按降序对它们进行排序。

证明:

假设订单以某种方式固定。然后,交换任何两个相邻文件不会影响除交换位置之外的任何其他li * fi。调用交换中左边的一个x 和另一个y == x+1。那么,平均检索时间的变化是ly*fx - lx*fy。如果fx/lx < fy/ly,那么ly*fx < lx*fy表示ly*fx - lx*fy < 0,表示平均检索时间减少了。这意味着我们有优势进行这种交换。每当fx/lx < fy/ly 时,我们都会继续进行此类交换,并且我们将达到不再可能的地步。这一定是最佳答案。

每当left < right时交换相邻的东西,类似于降序的冒泡排序,所以我们通常可以使用任何排序来代替。

【讨论】:

    【解决方案2】:

    让文件的长度为升序(l1<l2<l3<l4<...<ln),频率为降序。 因为

    average retrieval time =
    ART1 = 
    (l1)*f1 +
    (l1+l2)*f2 +
    (l1+l2+l3)*f3 +
    ...
    

    假设我们交换 l1 和 l2。所以我们打破了长度的升序。

    ART2 =
    (l2)*f1 + 
    (l2+l1)*f2 + 
    (l1+l2+l3)*f3 + 
    ...
    

    如果它使(ART1 < ART2),它使情况变得更糟。 看这个。 我们应该检查ART1-ART2 < 0

    ART1-ART2 = 
    { (l1)*f1 + (l1+l2)*f2 }
    - 
    { (l2)*f1 + (l2+l1)*f2 }
    
    = l1*f1-l2*f1
    = (l1-l2)*f1.
    

    根据假设l1<l2,我们得出结论ART1-ART2<0

    所以长度应该是升序。

    同样,如果你交换 f1 和 f2,你可以探测频率应该是降序。

    【讨论】:

    • 恐怕频率被长度锁定(因为它们属于同一个文件),你不能交换长度而不交换相应的频率。
    【解决方案3】:

    DP 可以工作,但不是解决这个问题的好方法,因为虽然检查所有选项的蛮力方法需要 O(n!) 时间,但 DP 方法需要的时间与不同子问题的数量成正比。比如说,首先我们做出所有可能的 n 个选择,然后我们将留下 n 个大小 (n-1) 不同的子问题。要使 DP 起作用,主问题的最优解应该来自子问题的最优解。现在,对于大小 (n-1) 的问题,假设我们知道解决方案,所以

    total average retreival time = (length of first chosen file * 1) + (retrieval time for (n-1) size problem)
    

    由于上述等式,会出现重叠的子问题,但不同子问题的总数会是

    nC1 + nC2 + ... nCn = 2^n
    

    仍然是指数级的。

    因此,DP 会降低复杂性,但问题的性质仍然是指数级的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2016-08-22
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多