具有反向引用的正则表达式的时间复杂度

时间:2014-03-21 11:35:02

标签: regex string r time-complexity backreference

这样的正则表达式的时间复杂度是什么(对任何字符串进行操作):"(。{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 ""
}

请帮忙。谢谢! :)

1 个答案:

答案 0 :(得分:2)

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

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