【问题标题】:Time complexity of regular expression with backreferencing具有反向引用的正则表达式的时间复杂度
【发布时间】:2014-03-21 11:35:02
【问题描述】:

这样的正则表达式的时间复杂度是多少(对任何字符串都可以操作):"(.{5})\1\1"

我的实现是:

reps <- function(s, n) paste(rep(s, n), collapse = "") # repeat s n times

find.string <- function(string, th = 3, len = floor(nchar(string)/th)) {
    for(k in len:1) {
        pat <- paste0("(.{", k, "})", reps("\\1", th-1))
        r <- regexpr(pat, string, perl = TRUE)
        if (attr(r, "capture.length") > 0) break
    }
    if (r > 0) substring(string, r, r + attr(r, "capture.length")-1) else ""
}

请帮忙。谢谢! :)

【问题讨论】:

  • 听起来非常像一个家庭作业问题......
  • 可能取决于您对正则表达式的操作。 grepsystem.time 应该可以完成。

标签: regex string r time-complexity backreference


【解决方案1】:

这取决于实现。由于反向引用,这不是单词严格定义中的正则表达式,但看起来它是最坏的情况 O(15 * length(string))

解释:正则表达式引擎将尝试从位置 0,1,2,3,4..开始匹配字符串中的最后一个位置。由于没有约束(点字符),它将匹配任何前 5 个字符,然后尝试再次匹配它们两次,最坏的情况是执行 15 次查询然后失败。然后它将移动到字符串中的第二个位置并尝试重新执行此操作。因此,在最坏的情况下,它会执行 len(string) 次。

【讨论】:

  • 非常感谢!我在帖子中添加了表达式的实现。我对时间复杂度是否为多项式时间感到困惑,因为某些正则表达式具有指数运行时间。
  • 这是什么语言?
猜你喜欢
  • 2020-09-28
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多