【问题标题】:Why does word segmentation require dynamic programming?为什么分词需要动态编程?
【发布时间】:2015-08-19 22:21:49
【问题描述】:

我指的是这个问题:

给定一个字典,即一组字符串和一个字符串 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算法?

【问题讨论】:

    标签: python dynamic-programming


    【解决方案1】:
    1. (副词qqqqqqqqqqq)
    2. ad,verb,(qqqqqqqqqqq)
    3. 副词,(qqqqqqqqqqq)

    会有两个 getwords('adverbqqqqqqqqqqq', 6) 调用,不是吗?

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

    adverbhamstringadverbhamstring...adverbhamstringhorsepowerqqq

    【讨论】:

    • 感谢您的回答。表明某人错了的最好方法总是提出一个病态的案例。我很感激!
    • 这是一个非常愉快和亲切的回应。 提示帽子
    【解决方案2】:

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

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

    在您发布的链接中查找 TulsiRam 和 geekyandgirly 的 cmets,他们有助于理解问题的两面性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 2023-04-10
      • 2014-12-05
      • 2011-08-29
      • 2010-12-08
      相关资源
      最近更新 更多