Questo è venuto in una situazione del mondo reale, e ho pensato di condividerlo, in quanto potrebbe portare ad alcune soluzioni interessanti. Essenzialmente, l'algoritmo ha bisogno di diff due liste, ma lascia che ti dia una definizione più rigorosa del problema.: Algoritmo diffidente interessante
matematica Formulazione
Supponiamo di avere due liste, L
e R
ognuno dei quali contengono elementi da alcune alfabeto sottostante S
. Inoltre, queste liste hanno la proprietà che gli elementi comuni che hanno appaiono in ordine: vale a dire, se L[i] = R[i*]
e L[j] = R[j*]
, e i
< j
poi i
* < j
*. Gli elenchi non hanno bisogno di elementi comuni e uno o entrambi possono essere vuoti. [Chiarimento: non si può assumere alcuna ripetizione di elementi.]
Il problema è quello di realizzare una sorta di "diff" delle liste, che possono essere visti come nuova lista di coppie ordinate (x,y)
dove x
è da L
e y
sia residente R
, con le seguenti proprietà:
- Seappare in entrambi gli elenchi, nel risultato appare
(x,x)
. - Se
x
appare inL
, ma non inR
, nel risultato appare(x,NULL)
. - Se appare in
R
, ma non inL
, nel risultato appare(NULL,y)
.
e infine
- La lista dei risultati ha "lo stesso" ordinamento di ciascuna delle liste di ingresso: IT azioni, grosso modo, la stessa proprietà ordinamento come sopra, con ciascuna delle liste individualmente (vedi esempio).
Esempi
L = (d)
R = (a,b,c)
Result = ((NULL,d), (a,NULL), (b,NULL), (c,NULL))
L = (a,b,c,d,e)
R = (b,q,c,d,g,e)
Result = ((a,NULL), (b,b), (NULL,q), (c,c), (d,d), (NULL,g), (e,e))
Qualcuno ha qualche buoni algoritmi per risolvere questo? Qual è la complessità?
Per favore fatemi sapere se testate i risultati. Voglio conoscere anche la risposta di lavoro per i miei compiti. – sblom
Suppongo che l'ordinamento relativo di NULL sia arbitrario? Cioè, nel tuo primo esempio, (NULL, d) potrebbe apparire ovunque, giusto? –
Conosci l'algoritmo di ordinamento o no? (se il primo, è banale e O (n)) –