2009-10-02 12 views

risposta

15

Un diff è essenzialmente solo a solution per il longest common sub-sequence problem.

La soluzione ottimale richiede la conoscenza di dynamic programming quindi è un problema abbastanza complesso da risolvere.

Tuttavia, può anche essere fatto costruendo un suffisso-albero. Entrambi gli algoritmi sono delineati here.

+1

Generalmente si presuppone che il documento sia un flusso di caratteri o byte.Qui la domanda è comunque sul documento word. Prima di implementare un tale algoritmo è necessario porsi una domanda: "Ciao mondo" in blu 8pt Verdana uguale a "Ciao mondo" in rosso 10pt Arial, ecc. – quosoo

+1

Sì, ovviamente gli algoritmi di base richiedono una logica aggiuntiva da analizzare per tale differenze, ma il nucleo dell'algoritmo sarà sempre lo stesso. –

2

Come indicato da Ben S, il problema delle differenze può essere risolto in generale risolvendo il problema di sottosquadra più lungo comune. Più specificamente, lo Hunt-McIlroy algorithm è uno dei classici algoritmi che sono stati applicati al problema (ad esempio, nell'implementazione dell'utilità di Unix 'diff).

28

Bene, in generale, diff viene risolto in genere dallo Longest common subsequence problem. Vedere anche il "Algorithm" sezione alle voci di Wikipedia Diff:.

Il funzionamento del diff si basa sulla risolvere il più lungo comune sottosequenza problema

In questo problema, si hanno due sequenze di articoli :

a b c d f g h j q z 

    a b c d e f g i j k r x y z 

e si desidera trovare la più lunga sequenza di elementi che è presente in Bot h sequenze originali nello stesso ordine . Cioè, si desidera trovare una nuova sequenza che può essere ottenuta da la prima sequenza eliminando alcuni elementi e dalla seconda sequenza da eliminando altri elementi. Si desidera anche questa sequenza fino a possibile. In questo caso è

a b c d f g j z 

dalla più lunga sottosequenza comune è solo un piccolo passo per ottenere l'output diff-like:

e h i q k r x y 
    + - + - + + + + 

Detto questo, tutto questo funziona bene con il testo base documenti. Poiché i documenti di Word sono effettivamente in un formato binario e includono molte informazioni e dati di formattazione, questo sarà molto più complesso. Idealmente, si potrebbe guardare in automazione di Word per sé in quanto ha la capacità di "diff" tra i documenti, come dettagliato qui:

Microsoft Word Tip: How to compare two documents for differences

+0

Ci sono due scopi per avere un'implementazione dell'algoritmo diff: per memorizzare solo le differenze tra le versioni, o per mostrare le differenze tra le versioni. Questi sono molto diversi (nessun gioco di parole). LCS è solitamente utilizzabile solo per mostrare le differenze, ma per una conservazione ottimale sono necessari algoritmi più avanzati. Ad esempio, se si taglia una porzione grande di una sezione del documento e la si incolla in un'altra sezione, un buon algoritmo di archiviazione lo rileva e non lo memorizza come "hey, molti nuovi dati sono appena apparsi qui". –

+2

@Lasse - Concordato. Dal momento che il richiedente la domanda originale stava parlando di documenti di Word, ho pensato che sarebbero stati più interessati al lato "visivo" del lato diffidente, piuttosto che al lato dello storage. Tuttavia, hai ragione sul lato dello storage, dovresti esaminare Codifica/Compressione Delta (http://en.wikipedia.org/wiki/Delta_encoding) ecc. Il link alla carta – CraigTP