为什么分词需要动态编程?

时间:2015-08-19 22:21:50

标签: python dynamic-programming

我指的是这个问题:

  

给定一个字典,即一组字符串和一个字符串s,设计一个   高效的算法,检查s是否是a的串联   字典序列。如果存在这样的连接,那么你的   算法应该输出它。

以下是我如何在不使用DP的情况下解决它:

def getwords(s, start = 0):
  # Find a valid word as a prefix, and try to made the rest work
  for i in range(start + 1, len(s) + 1):
    prefix = s[start:i]
    if isind(prefix):
      # We used the whole thing, but it's a word!
      if i == len(s):
        return [prefix]
      words = getwords(s, i)
      if words:
        return [prefix] + words

  # We made it to the end without finding a word configuration
  return False

记录了DP算法here,以及“编程访谈元素”一书。我的问题是: 为什么?

我找不到任何我的非DP解决方案重新计算相同子问题的实例。谁能解释为什么这个算法不如DP算法?

2 个答案:

答案 0 :(得分:2)

  1. (adverbqqqqqqqqqqq)
  2. 广告,动词,(qqqqqqqqqqq)
  3. 副词,(qqqqqqqqqqq)
  4. 会有两个getwords(' adverbqqqqqqqqqqq',6)来电,不是吗?

    如果你有类似的东西,它会变得非常讨厌:

    ... adverbhamstringadverbhamstring adverbhamstringhorsepowerqqq

答案 1 :(得分:1)

据我了解,如果您的w字母带有n个字母,并且k中有w[0:n-1]个有效字组合(即{{1}可以在不同的地方(w[0:n-1]次)拆分成有效的单词,你会在字典k中查找w[n]次(假设k不是有效的当然,这个词)。这就是ozangds在他的回答中所表现出来的。

使用动态编程方法,由于您只跟踪字符串有效的索引(可以拆分为单词),因此您只会查找w[n]一次。

在您发布的链接中查找TulsiRam和geekyandgirly的评论,它们有助于理解问题的两个方面。