簡體   English   中英

最長的公共子序列已優化

[英]Longest common subsequence optimized

我目前正在嘗試查找和打印2個給定字符串的最長公共子序列。 我使用最常見的算法而無需遞歸。 如果保留整個數組,這是簡單的任務,但是我嘗試對其進行一點優化,僅使用2行,您可以在下面的代碼中看到。 通過此更改,找到長度仍然很簡單並且可以正常工作,但是恢復子序列不再那么容易了。 我嘗試了幾種方法,但是都沒有用。 您可以在下面看到我的最后一次嘗試。 盡管它適用於相同情況,但在某些情況下也會失敗。 經過長時間的思考,我開始相信沒有辦法使用只有2行的數組來恢復子序列。 我的研究沒有給我確切的答案,所以我問是否有一種方法可以實現我想做的事情? 還是我想保留整個陣列以進行打印?

//finding length of longest common subsequence
for(int i=1; i<m; i++) {
    for(int j=1; j<n; j++) {
        if(sequece1[i-1] == sequence2[j-1]) {
            tab[i%2][j] = tab[(i-1)%2][j-1] + 1;
        } else {
            tab[i%2][j] = max(tab[i%2][j-1],tab[(i-1)%2][j]);
        }
    }
}

//trying to reconstruct longest common subsequence
int last_row = (m-1)%2;
for(int j=n-1; j>0; j--) {
    if(tab[last_row][j-1] < tab[last_row][j]) {
        if(last_row == 0) {
            common_part += sequence2[j];
            } else {
            common_part += sequence2[j-1];
        }
    }
}

似乎沒有簡單的方法可以完成,因為如果僅保留最后兩列,則會丟失信息的重要部分。

例如,考慮兩種情況:( abccacc )字符串和( abccbcc )字符串。 這些情況的矩陣為

1 1 1 1    and  0 1 1 1
1 1 2 2         0 1 2 2
1 1 2 3         0 1 2 3

您會看到后兩種情況在兩種情況下是相同的,因此您不會僅通過后兩種情況來區分這些情況。 但是您需要區分它們,因為答案是不同的( accbcc )。 當然,您仍然擁有原始字符串,並且可以從那里使用信息,但是我認為(盡管我還沒有證明這一點),這差不多等於為原始字符串的某些前綴找到一個LCS。

同時,還有一個更高級的算法可以在二次時間和線性空間中工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM