天天看點

檔案比較算法(2)

 對檔案比較(1)進行了修改:

将行列資料顯示與作者的一緻;

得到原作者的回複,将D(l,r)計算進行修改;

将left與right與作者算法中的描述一緻。

檔案比較算法(2)

#  -*- coding: cp936 -*-

檔案比較算法(2)

'''

檔案比較算法(2)

檔案比較算法:

檔案比較算法(2)

算法模型參見:

檔案比較算法(2)

# 參考文章:http://blog.csdn.net/clariones/archive/2006/11/19/1396880.aspx

檔案比較算法(2)

#           http://blog.csdn.net/clariones/archive/2006/11/24/1412394.aspx

檔案比較算法(2)

1.确定最大比對率

檔案比較算法(2)

2.确定最優比對路徑

檔案比較算法(2)

'''

檔案比較算法(2)

right  =   ' ABCACADF '

檔案比較算法(2)

left  =   ' BCXCADFESBABCACA '

檔案比較算法(2)

all  =  []

檔案比較算法(2)

#  建立矩陣,行數與列數均為left,right的長度+1,并将所有元素置0

檔案比較算法(2)

for  l  in  range(len(left)  +   1 ):

檔案比較算法(2)

    all.append([])

檔案比較算法(2)

     for  r  in  range(len(right)  +   1 ):

檔案比較算法(2)

        all[l].append(0)

檔案比較算法(2)

# #for i in all:

檔案比較算法(2)

# #    print i

檔案比較算法(2)

#  比較left與right的值,相同的将矩陣中對應元素置1    

檔案比較算法(2)

for  l  in  range(len(left)):

檔案比較算法(2)

     for  r  in  range(len(right)):

檔案比較算法(2)

         if  left[l]  ==  right[r]:

檔案比較算法(2)

            all[l][r]  =   1

檔案比較算法(2)

# #print '*'* 10

檔案比較算法(2)

# #for i in all:

檔案比較算法(2)

# #    print i

檔案比較算法(2)

#  計算最大比對數

檔案比較算法(2)

for  l  in  range(len(left)  -   1 , - 1 , - 1 ):

檔案比較算法(2)

     for  r  in  range(len(right)  -   1 , - 1 , - 1 ):

檔案比較算法(2)

        all[l][r]  =  max(all[l][r + 1 ],all[l + 1 ][r + 1 ] +  all[l][r],all[l + 1 ][r])

檔案比較算法(2)

# #print '*' * 20

檔案比較算法(2)

for  i  in  all:

檔案比較算法(2)

     print  i

檔案比較算法(2)

'''

檔案比較算法(2)

最大比對數結果,注意最後一行和一列

檔案比較算法(2)

[6, 6, 5, 4, 4, 3, 2, 1, 0]

檔案比較算法(2)

[6, 5, 5, 4, 4, 3, 2, 1, 0]

檔案比較算法(2)

[6, 5, 4, 4, 4, 3, 2, 1, 0]

檔案比較算法(2)

[6, 5, 4, 4, 4, 3, 2, 1, 0]

檔案比較算法(2)

[6, 5, 4, 3, 3, 3, 2, 1, 0]

檔案比較算法(2)

[6, 5, 4, 3, 2, 2, 2, 1, 0]

檔案比較算法(2)

[6, 5, 4, 3, 2, 1, 1, 1, 0]

檔案比較算法(2)

[6, 5, 4, 3, 2, 1, 0, 0, 0]

檔案比較算法(2)

[6, 5, 4, 3, 2, 1, 0, 0, 0]

檔案比較算法(2)

[6, 5, 4, 3, 2, 1, 0, 0, 0]

檔案比較算法(2)

[6, 5, 4, 3, 2, 1, 0, 0, 0]

檔案比較算法(2)

[5, 5, 4, 3, 2, 1, 0, 0, 0]

檔案比較算法(2)

[4, 4, 4, 3, 2, 1, 0, 0, 0]

檔案比較算法(2)

[3, 3, 3, 3, 2, 1, 0, 0, 0]

檔案比較算法(2)

[2, 2, 2, 2, 2, 1, 0, 0, 0]

檔案比較算法(2)

[1, 1, 1, 1, 1, 1, 0, 0, 0]

檔案比較算法(2)

[0, 0, 0, 0, 0, 0, 0, 0, 0]

檔案比較算法(2)

'''

檔案比較算法(2)

# ## 計算最短路徑        

檔案比較算法(2)

for  l  in  range(len(left)  -   1 , - 1 , - 1 ):

檔案比較算法(2)

     for  r  in  range(len(right)  -   1 , - 1 , - 1 ):

檔案比較算法(2)

         if  left[l]  ==  right[r]:

檔案比較算法(2)

            all[l][r]  =  all[l  +   1 ][r  +   1 ]  +   1

檔案比較算法(2)

         else :

檔案比較算法(2)

             if  all[l][r + 1 ]  >=  all[l + 1 ][r]:

檔案比較算法(2)

                all[l][r]  =  all[l][r  +   1 ]

檔案比較算法(2)

             else :

檔案比較算法(2)

                all[l][r]  =  all[l + 1 ][r]  +   1

檔案比較算法(2)
檔案比較算法(2)

print   ' * '   *   20

檔案比較算法(2)

for  i  in  all:

檔案比較算法(2)

     print  i

檔案比較算法(2)

'''

檔案比較算法(2)

最優比對路徑計算結果,注意最後一行和一列

檔案比較算法(2)

[16, 14, 14, 14, 7, 7, 7, 7, 0]

檔案比較算法(2)

[15, 15, 13, 13, 6, 6, 6, 6, 0]

檔案比較算法(2)

[14, 14, 12, 12, 5, 5, 5, 5, 0]

檔案比較算法(2)

[13, 13, 11, 11, 4, 4, 4, 4, 0]

檔案比較算法(2)

[12, 12, 12, 10, 10,3, 3, 3, 0]

檔案比較算法(2)

[11, 11, 11, 9,  9, 6, 2, 2, 0]

檔案比較算法(2)

[10, 10, 10, 8,  8, 5, 1, 1, 0]

檔案比較算法(2)

[9,  9,  9,  7,  7, 4, 0, 0, 0]

檔案比較算法(2)

[8,  8,  8,  6,  6, 3, 0, 0, 0]

檔案比較算法(2)

[7,  7,  7,  5,  5, 2, 0, 0, 0]

檔案比較算法(2)

[6,  6,  6,  4,  4, 1, 0, 0, 0]

檔案比較算法(2)

[5,  5,  5,  5,  3, 3, 0, 0, 0]

檔案比較算法(2)

[4,  4,  4,  4,  2, 2, 0, 0, 0]

檔案比較算法(2)

[3,  3,  3,  3,  3, 1, 0, 0, 0]

檔案比較算法(2)

[2,  2,  2,  2,  2, 2, 0, 0, 0]

檔案比較算法(2)

[1,  1,  1,  1,  1, 1, 0, 0, 0]

檔案比較算法(2)

[0,  0,  0,  0,  0, 0, 0, 0, 0]

檔案比較算法(2)

'''

檔案比較算法(2)

繼續閱讀