通过动态编程构建最小尺寸Trie(战争故事:Steven S Skiena的算法设计手册中的Prolog过去)

时间:2017-06-27 10:16:17

标签: algorithm

我正在阅读Steven S Skiena的The Algorithm Design Manual,并试图理解War Story: What’s Past is Prolog问题的解决方案。 问题也很好地描述了here

基本上,问题是,给定一个有序的字符串列表,给出一个最佳解决方案来构造一个具有最小大小的trie(字符串字符作为节点),其约束条件是必须保留字符串的顺序,而字符索引可以重新排序。

也许这对于stackoverflow来说不是一个合适的问题,我仍然想知道是否有人能给我一些关于解决方案的暗示,特别是这个重现意味着它的论点: the recurrence for the Dynamic Programming algorithm

1 个答案:

答案 0 :(得分:0)

你可以这样思考:

  1. 我们假设我们修复了第一个字符的索引。根据此位置中字符的值,所有字符串都会分成r个bin(bin基本上是子树)。

  2. 我们可以独立使用每个垃圾箱。它不会改变不同bin中的顺序,因为不同bin中的两个字符串在第一个字符中是不同的。

  3. 因此,我们可以独立解决每个垃圾箱的问题。之后,我们只需要一条边将根连接到每个bin(即子树)。这就是公式的地方 C[i_k, j_k] + 1来自。

  4. 由于我们希望最小化边缘总数并且我们可以自由选择第一个位置,我们只需尝试m个位置中的所有可能选项。

  5. 注意:假设我们可以独立地重新排序每个子树中的其余字符,此算法是正确的。如果不是这样,则动态编程解决方案不正确。