2008-10-25 170 views
1

我將如何去實現diff函數,比如stackoverflow的問題修訂歷史記錄。如何實現diff功能?

+0

我想你需要提供更多信息... – 2008-10-25 07:04:28

回答

3

您在這裏有一個javascript example差異算法的實現。基於

P. Heckel, A technique for isolating differences between files 通訊。 ACM,21,(4),264--268(1978)。

實施,本身具有兩種功能,其中之一是推薦使用:

diffString(String oldFile, String newFile) 

此方法需要兩個字符串並計算各個差異。最終的結果是用HTML標記的'newFile'(以表示舊文件的刪除和newFile的添加)。

+0

謝謝!我相信這是js的一個好方法。 – nowa 2008-10-25 07:18:17

0

我想唯一的方法是比較形成2個字符串的每個字符。類似這樣的:


void diff(String first,String second) { 
    int biggest = (first.length() > second.length()) ? first.length() : second.length(); 
    for(int i = 0;i < biggest;i++) { 
     //compare each char from the longest string with each char from the shorter 
     // do something with them if they're not equal 
    } 
} 

這只是我如何去做的一個草圖。一切都取決於你想要對數據做什麼。

2

我會找到FreeBSD diff實用程序的代碼並將其用作基準。當許可證允許進行這種複製時,重新制造輪子沒有意義。

+0

這將是一個選項,但在這種特殊情況下(diff代碼庫),從零開始編寫它會容易十倍。至少可以說,diff代碼庫是拜占庭式的。這是足夠古老的,讓你看到它不到10分鐘後發出尖叫聲。我知道,我看了:) – 2008-10-25 08:34:04

0

如果你想要的是修訂歷史,不要重新開始差異化的輪子。只需將所有內容都投入到版本控制中,並使用它的差異和日誌功能對於簡單的線性歷史記錄,就像RCS那樣簡單。或者你可以扔最新的大炮,並使用git

大多數差異公用事業公司做一行一行的差異。堆棧溢出做逐字比較。對於那樣的東西wdiff是必要的。大多數版本控制系統都允許您插入diff實用程序。開箱即用,git diff --color-words非常接近這裏所做的。稍微擺弄一下這些設置,你就可以得到它來吐出一些你可以製作成漂亮的網頁的東西。

1

大多數算法都基於LCS:Longest common subsequence。以有效的方式實施它並不明顯。你可能會在網上找到各種各樣的語言實現。