Rileva le modifiche degli ordini in una lista

3

Supponiamo che tu abbia un elenco di valori

  1. a
  2. b
  3. c
  4. d
  5. e

L'ordine sulla lista potrebbe essere cambiato.

  1. a
  2. c
  3. d
  4. b
  5. e

Come rileveresti questo cambiamento? Avevamo bisogno di qualcosa di simile quando stavamo costruendo una pagina di cronologia delle revisioni per il nostro strumento di creazione di moduli online . Abbiamo trovato una soluzione rapida e sporca, ma sto cercando una soluzione più elegante per questo. Ecco come appaiono le descrizioni delle revisioni:

Ecco la parte difficile: Gli elementi possono essere rimossi / aggiunti da / a in qualsiasi punto dell'elenco. Pertanto, l'algoritmo dovrebbe essere in grado di ignorare tali modifiche.

    
posta Aytekin 31.01.2014 - 11:03
fonte

3 risposte

5

Ci sono due approcci:

  1. Cerca di trovare un modo per applicare l'algoritmo diff al tuo modello. Ciò diventa più semplice quando c'è una rappresentazione testuale sottostante (ad esempio, sorgente HTML o un'altra DSL).
  2. Non fare in modo che il tuo generatore di moduli emetta stati completi, ma solo emetti differenze che puoi facilmente registrare. Invece di avere gli elenchi prima e dopo , devi registrare l'operazione " sposta il campo da x a y ".
risposta data 31.01.2014 - 11:20
fonte
1

Crea un doppio elenco collegato per i record. Nel tuo esempio:

per il primo elenco:

a: {prev: -1, next: b}
b: {prev: a, next: c}
c: {prev: b, next: d}
d: {prev: c, next: e}
e: {prev: d, next: -1}

e per la seconda lista

a: {prev: -1, next: c}
c: {prev: a, next: d}
d: {prev: c, next: b}
b: {prev: d, next: e}
e: {prev: b, next: -1}

Ora, quando confronti entrambi gli elenchi, solo le questioni relative alla modifica degli ordini dovrebbero essere "b", poiché è possibile modificare sia il valore precedente sia quello successivo. Solo i record modificati precedenti o successivi al valore non devono essere presi in considerazione poiché si spostano a causa del cambiamento di ordine di "b"

    
risposta data 31.01.2014 - 17:12
fonte
0

Tratterò questa come una domanda sull'algoritmo. Potrebbe non essere ciò che era inteso.

  1. Passa attraverso il primo elenco, creando una ricerca da key- > index. Nel tuo esempio, a- > 1, b- > 2, c- > 3, d- > 4 e così via.
  2. Passa attraverso il secondo elenco, cercando ogni elemento e confrontando il suo indice con l'indice del suo vicino. Nel tuo caso b- > 2 appare dopo d- > 4, che è fuori uso.

Ciascuno degli elementi fuori ordine in base a questo criterio è uno che è stato spostato. Gli elementi inseriti non hanno indice e gli elementi eliminati non saranno esaminati.

    
risposta data 31.01.2014 - 14:46
fonte

Leggi altre domande sui tag