【问题标题】:Why is insertion sort not dynamic programming为什么插入排序不是动态编程
【发布时间】:2014-12-13 15:08:41
【问题描述】:

动态规划问题具有最优子结构,并且有一个可以用递推关系描述的解。

排序列表是向已排序列表添加元素,因此插入排序具有最佳子结构。递归关系可以描述为

Sorted_List_n = Sorted_list_n-1 + next element

那么为什么不将插入排序视为一种动态编程算法呢?我了解它是如何应用于斐波那契数列和编辑距离的,但并没有真正超越。

【问题讨论】:

  • 这似乎更适合 cs.stackexchange.com。
  • 不,在我看来,如果它是计算机科学,而不是计算机编程,它属于 cs.stackexchange.com。这是一个概念问题,而不是实际编程问题。
  • @stackoverflowuser2010 见stackoverflow.com/help/on-topic
  • 这是一个非常好的问题。编程从算法开始;否则,如果您在不理解的情况下进行编码,那么您只是一个可替换的代码猴子。
  • 也许是因为 BK(即 Knuth 之前)广为人知的东西都被认为配得上 Dynamic Programming 这个绰号。

标签: algorithm sorting dynamic-programming


【解决方案1】:

如果问题具有以下两个属性,则可以使用动态规划 (DP) 解决给定问题。

1)重叠子问题(osp)

2) 最优子结构(oss)

尽管插入排序算法具有最优子结构属性,但它不具有重叠子问题属性。稍微细化的解释如下..

在斐波那契数计算案例中,我们显然具有上述两个属性。

osp : fib(5) 计算将 fib(3) 作为其子问题。同时,fib(4) 的计算以 fib(3) 为子问题。但是 fib(5) = fib(4) + fib(3)。如果我们在没有 DP 技术的情况下盲目地计算 fib(5),我们最终会计算 fib(3) 两次(一次用于 fib(4),一次用于 fib(3) 本身)。这里,重叠的子问题之一是 fib(3)

oss : 同理,如果我们可以计算出fib(4)和fib(3)的最优解,那么fib(5)的解也可以得到最优解。因为 fib(5) 只是 fib(4) 和 fib(3) 的和。

现在,让我们尝试检查这两个属性是否存在于插入排序中。 假设您正在对一个数字数组 {5, 2, 3, 1} 进行排序。

osp :根据您认为子问题的重复出现如下..

  • {5、2、3、1}

  • {5、2、3}

  • {5, 2}

  • {5}

如果我们仔细观察,我们可以看到没有两个相似的子问题。这意味着不存在重叠子问题属性。

oss : 如果我们可以对大小为 (n-1) 的数组进行最优排序,那么我们也可以对大小为 (n) 的数组进行最优排序。所以存在最优子结构性质。

总之,插入排序算法没有重叠子问题的属性。因此,它不是 DP 解决方案。

【讨论】:

    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 2016-02-01
    • 2023-02-05
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多