以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 算法理论与分析 』  (http://bbs.xml.org.cn/list.asp?boardid=60)
----  问一个算法的题目!请高手指点!  (http://bbs.xml.org.cn/dispbbs.asp?boardid=60&rootid=&id=16758)


--  作者:pczhang
--  发布时间:4/7/2005 10:52:00 PM

--  问一个算法的题目!请高手指点!
字符序列的子序列由删除该序列任意位置的任意个元素而得.序列x和y的最长公共子序列记为Lcs(x,y),是x和y的公共子序列,且长度最大.例如,adcbcb是x=abdcbcbb和y=adacbcb的最长公共子序列.设x长度为n,y长度为m,设计一算法计算x和y的最长公共子序列的长度,尽可能改进你的算法,使它的时间复杂性为O(n*m)
--  作者:pczhang
--  发布时间:4/7/2005 10:55:00 PM

--  
晕!发现有人贴过了!
想请教一下具体的解法!
复杂度在O(n*m)
之内的?
--  作者:eyounx
--  发布时间:4/8/2005 10:28:00 AM

--  
LCS(a[1..m],b[1..n]) = a[1]==b[1] ? 1+LCS(a[2..m],b[2..n]) : max(LCS(a[1..m],b[2..n]),LCS(a[2..m],b[1..n])  )

dp之


--  作者:xzjxu
--  发布时间:4/8/2005 11:09:00 AM

--  
类似"卷积"一样的比较方法,就是O(mn)的
--  作者:pczhang
--  发布时间:4/8/2005 11:59:00 AM

--  
thanks懂了!
就是动态规划啊!


--  作者:eyounx
--  发布时间:4/8/2005 12:58:00 PM

--  
以下是引用xzjxu在2005-4-8 11:09:40的发言:
类似"卷积"一样的比较方法,就是O(mn)的


卷积?卷积是local的,LCS是全局的
--  作者:xzjxu
--  发布时间:4/8/2005 4:43:00 PM

--  
以下是引用eyounx在2005-4-8 12:58:52的发言:
卷积?卷积是local的,LCS是全局的


卷积,就是个比喻
就是一个从头一个从尾开始到一个到尾一个到头的比较
--  作者:eyounx
--  发布时间:4/8/2005 5:44:00 PM

--  
不如写出来看看
--  作者:xzjxu
--  发布时间:4/11/2005 7:22:00 PM

--  
以下是引用eyounx在2005-4-8 17:44:45的发言:
不如写出来看看


如两个字串123456789和abcdefghijklm.
以下比较上下重叠的部分
开始:
123456789
              abcdefghijklm
然后
123456789
            abcdefghijklm
.............................
                123456789
abcdefghijklm

比较重叠部分,记录最长相同的长度,即可!


--  作者:xzjxu
--  发布时间:4/11/2005 7:23:00 PM

--  
呵呵,显示的效果,不一样了
--  作者:eyounx
--  发布时间:4/11/2005 8:53:00 PM

--  
写出来的意思是写算法出来,况且上面的完全看不懂
--  作者:eyounx
--  发布时间:4/11/2005 8:55:00 PM

--  
不过,好歹要拿两个有点公共部分的字符串来比吧,123456789和abcdefghijklm会有重叠的部分?
--  作者:xzjxu
--  发布时间:4/11/2005 9:39:00 PM

--  
以下是引用eyounx在2005-4-11 20:55:32的发言:
不过,好歹要拿两个有点公共部分的字符串来比吧,123456789和abcdefghijklm会有重叠的部分?


呵呵,你能看懂就行了,写代码太麻烦
--  作者:eyounx
--  发布时间:4/11/2005 9:51:00 PM

--  
看不懂的说
--  作者:Logician
--  发布时间:4/11/2005 9:52:00 PM

--  
以下是引用xzjxu在2005-4-11 21:39:21的发言:
[quote]以下是引用eyounx在2005-4-11 20:55:32的发言:
不过,好歹要拿两个有点公共部分的字符串来比吧,123456789和abcdefghijklm会有重叠的部分?
[/quote]
呵呵,你能看懂就行了,写代码太麻烦

eyounx的上一个帖子好像是说他没看懂。


--  作者:xzjxu
--  发布时间:4/12/2005 1:38:00 PM

--  
重看了一下楼主的题目,看来是我看错题目了,sorry
--  作者:xzjxu
--  发布时间:4/12/2005 2:45:00 PM

--  

用VB写的
Private Function lcs(s1 As String, s2 As String) As Integer
    Dim L1 As Integer, L2 As Integer, t As Integer
    L1 = Len(s1): L2 = Len(s2)
    If s1 = "" Or s2 = "" Then
        lcs = 0
        Exit Function
    End If
    lcs = 0
    For i = 1 To L1
        For j = 1 To L2
            If Mid(s1, i, 1) = Mid(s2, j, 1) Then
                lcs = lcs(Right(s1, L1 - i), Right(s2, L2 - j)) + 1
                Exit Function
            End If
        Next j
    Next i
End Function

--  作者:xzjxu
--  发布时间:4/12/2005 5:10:00 PM

--  
好象还有错误!
以下是引用xzjxu在2005-4-12 14:45:17的发言:
用VB写的
Private Function lcs(s1 As String, s2 As String) As Integer
     Dim L1 As Integer, L2 As Integer, t As Integer
     L1 = Len(s1): L2 = Len(s2)
     If s1 = "" Or s2 = "" Then
         lcs = 0
         Exit Function
     End If
     lcs = 0
     For i = 1 To L1
         For j = 1 To L2
             If Mid(s1, i, 1) = Mid(s2, j, 1) Then
                 lcs = lcs(Right(s1, L1 - i), Right(s2, L2 - j)) + 1
                 Exit Function
             End If
         Next j
     Next i
End Function



--  作者:eyounx
--  发布时间:4/12/2005 5:35:00 PM

--  
我用dp写一段,你比比看:

dim dparray(1 to 1) as integer, L1 as integer, L2 as integer

function LCS( stra as string, strb as string) as integer
   dim i as integer
   L1 = len(stra) : L2 = len(strb)
   redim dparray(1 to L1*L2+L2)      '忘记二维数组了,就这样吧
   for i=1 to L1*L2+L2
      dparray(i) = -1
   next
   LCS = LCS_Sub(stra,strb,1,1)
end function

function LCS_Sub( stra as string, strb as string, indexa as integer, indexb as integer) as integer)
    if stra>L1 OR strb>L2 then
        LCS_Sub = 0
    else
        if dparray(indexa*L1+indexb)<0 then
            if mid(stra,indexa,1)=mid(strb,indexb,1) then
                dparray(indexa*L1+indexb) = 1 + LCS_Sub(stra,strb,indexa+1,indexb+1)
            else
                dim leftLen as integer, rightLen as integer
                leftLen = LCS_Sub(stra,strb,indexa+1,indexb)
                rightLen = LCS_Sub(stra,strb,indexa,indexb+1)
                if( leftlen > rightlen ) then
                    dparray(indexa*L1+indexb) = leftlen
                else
                    dparray(indexa*L1+indexb) = rightlen
                endif
            end if
        end if
        LCS_Sub = dparray(indexa*L1+indexb)
    end if
end function

我手上没有basic编译器,可能有语法错误。


--  作者:xzjxu
--  发布时间:4/12/2005 7:14:00 PM

--  
你那个数组用的罗嗦
看下面的
Private Sub Form_Click()
    Dim s1 As String, s2 As String
    s1 = text1: s2 = text2
    Print lcs(s1, s2)
End Sub
Private Function lcs(s1 As String, s2 As String) As Integer
    Dim L1 As Integer, L2 As Integer, L As Integer
    L1 = Len(s1): L2 = Len(s2)
    If s1 = "" Or s2 = "" Then
        lcs = 0
    Else
        If Mid(s1, 1, 1) = Mid(s2, 1, 1) Then
            lcs = lcs(Right(s1, L1 - 1), Right(s2, L2 - 1)) + 1
        Else
            L = lcs(Right(s1, L1 - 1), s2)
            lcs = lcs(s1, Right(s2, L2 - 1))
            If lcs < L Then lcs = L
        End If
    End If
End Function

--  作者:phoenixinter
--  发布时间:4/12/2005 7:45:00 PM

--  
时间复杂度O(mn)就是trivial的dp
可以用memoization或者是bottom-up approach
LCS[i,j]=1+LCS[i-1,j-1] if A[i]=B[j]
          =max(LCS[i-1,j],LCS[i,j-1]) o.w.
--  作者:eyounx
--  发布时间:4/12/2005 7:53:00 PM

--  
你知道那个数组的作用吗?
你拿两个1000长度的字符串跑跑你的算法和我的算法,就知道区别了
--  作者:Logician
--  发布时间:4/12/2005 7:54:00 PM

--  
呵呵!
版大终于来了。:)

--  作者:eyounx
--  发布时间:4/12/2005 7:56:00 PM

--  
嘿嘿,透露一下,版大的LCS的PAPER快要写好了
--  作者:xzjxu
--  发布时间:4/12/2005 7:58:00 PM

--  
以下是引用eyounx在2005-4-12 19:53:33的发言:
你知道那个数组的作用吗?
你拿两个1000长度的字符串跑跑你的算法和我的算法,就知道区别了


是,那个数组可以不需要重新计算,我也常用这种方法,呵呵,一时忘了
--  作者:Logician
--  发布时间:4/12/2005 8:00:00 PM

--  
牛啊..............
写好后发给偶们瞻仰一下啊?
--  作者:phoenixinter
--  发布时间:4/12/2005 8:03:00 PM

--  
刚才没有细细看……
你说的数组是哪个数组啊?
eyounx?
--  作者:phoenixinter
--  发布时间:4/12/2005 8:04:00 PM

--  
sigh
还是上ieee吧……
在校内上woft好慢啊……………………
5555

PS:所谓的LCS paper就是在灌水……
完全是瞎写的……


--  作者:injuredwolf
--  发布时间:10/9/2005 9:39:00 AM

--  
如果要求输出全部的LCS呢,一般的动态规划只能输出一个LCS.
复杂度不能高

--  作者:lovelove
--  发布时间:5/7/2006 7:39:00 PM

--  
用动态规划法拉!时间复杂度也是(n*m)
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
398.438ms