最长公共子序列的界限

碳纳米管

我需要找到递归最长公共子序列问题(仅它的长度)的最紧密边界(最坏的情况)。我的意思是按照m和n表示复杂度,m是字符串s的长度,n是字符串t的长度。谁能帮我吗?

代码是:

def lcs_len_v1(s, t): 
    n = len(s)
    m = len(t)
    return lcs_len_rec(s,n,t,m)

def lcs_len_rec(s,size_s,t,size_t):

    if size_s==0 or size_t==0: #if one of the strings is empty
        return 0

    if s[0] == t[0]: #if we find a common char
        return lcs_len_rec(s[1:],len(s[1:]), t[1:],len(t[1:]))+1
    else:
        return max(lcs_len_rec(s,len(s),t[1:],len(t[1:])), lcs_len_rec(s[1:],len(s[1:]),t,len(t)))
皮特·达布科夫斯基

这是我能够用Python编写的最快的实现:

def lcs(x, y):
    '''returns the length of longest common subsequence of x and y.
       >>> lcs('abcde','aebd')
       3
    '''
    s_x, s_y = len(x), len(y)
    if s_x>s_y: 
        x, y = y, x
        s_x, s_y = s_y, s_x
    y_previous = s_x*[0]
    for y_char in y:
        left_value = 0
        diagonal_value = 0
        n=0
        for x_char in x:
            up_value = y_previous[n]
            if y_char==x_char:
                left_value = diagonal_value+1
            else:
                if left_value<up_value: 
                    left_value = up_value 
            diagonal_value = up_value
            y_previous[n] = left_value 
            n+=1
    return y_previous[-1]

如果要提高性能,可以使用Cython进行编译。它的运行速度提高了90倍!

cimport cython
from libc.stdlib cimport malloc, free

def lcs(x, y):
    cdef int s_x
    cdef int s_y
    s_x, s_y = len(x), len(y)
    if s_x>s_y: 
        x, y = y, x
        s_x, s_y = s_y, s_x

    cdef int i

    temp_y_previous = s_x*[0]
    cdef int *y_previous
    y_previous = <int *>malloc(s_x*cython.sizeof(int))
    if y_previous is NULL:
        raise MemoryError()
    for i in xrange(s_x):
        y_previous[i] = temp_y_previous[i]

    cdef char *cx
    cx = <char *>malloc(s_x*cython.sizeof(char))
    if cx is NULL:
        raise MemoryError()
    i=0
    for character in x:
        cx[i]=ord(character)
        i+=1

    cdef char *cy
    cy = <char *>malloc(s_y*cython.sizeof(char))
    if cy is NULL:
        raise MemoryError()
    i=0
    for character in y:
        cy[i]=ord(character)
        i+=1

    cdef int k=0
    cdef int left_value
    cdef int diagonal_value
    cdef int n
    cdef str y_char
    cdef str x_char
    while k<s_y:
         left_value = 0
         diagonal_value = 0
         n=0
         while n<s_x:
             if cy[k]==cx[n]:
                 left_value = diagonal_value+1
             else:
                 if left_value<y_previous[n]:
                     left_value = y_previous[n]
             diagonal_value = y_previous[n]
             y_previous[n] = left_value 
             n+=1
         k+=1
    with nogil:
        free(y_previous)
        free(cx)
        free(cy)  
    return y_previous[s_x-1]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

openMP的最长公共子序列

来自分类Dev

最长公共子序列算法说明

来自分类Dev

三个整数序列的最长公共子序列

来自分类Dev

固定长度子串的最长公共子序列

来自分类Dev

固定长度子串的最长公共子序列

来自分类Dev

Python:列表的最长公共子序列的长度

来自分类Dev

最长公共子序列(LCS)蛮力算法

来自分类Dev

最长公共子序列(LCS)蛮力算法

来自分类Dev

Scheme中的LCS(最长公共子序列)

来自分类Dev

最长公共子序列矩阵差分python

来自分类Dev

最长公共序列优化问题

来自分类Dev

c中3+个序列的最长公共子序列

来自分类Dev

c中3+个序列的最长公共子序列

来自分类Dev

N 个序列的最长公共子序列(用于 diff 目的)

来自分类Dev

最长公共子串的方法

来自分类Dev

Lucene 搜索最长公共子串

来自分类Dev

尤金·迈尔斯(Eugene Myers)的Diff算法:找到“ A”和“ B”的最长公共子序列

来自分类Dev

如何用间隔条件求解LCS(最长公共子序列)

来自分类Dev

了解最长公共子序列算法的时间复杂度

来自分类Dev

查找2个字符串的最长公共子序列?

来自分类Dev

有人可以解释这种“最长公共子序列”算法吗?

来自分类Dev

最长公共序列的长度Python递归函数

来自分类Dev

最长的公共子序列算法

来自分类Dev

Java:最长的公共子序列

来自分类Dev

最长的公共子序列算法

来自分类Dev

如何找到使用较少内存的最长公共子串?

来自分类Dev

使用grep的最长公共子字符串

来自分类Dev

返回最长公共子串函数 c++

来自分类Dev

最长的公共子序列-优化内存