Esto surgió en una situación del mundo real, y pensé que podría compartirlo, ya que podría conducir a algunas soluciones interesantes. Esencialmente, el algoritmo necesita diferir dos listas, pero déjame darte una definición más rigurosa del problema.Algoritmos: interesante algoritmo de diferencia
Formulación Matemática
Suponga que tiene dos listas, L
y R
cada uno de los cuales contienen elementos de algún alfabeto subyacente S
. Por otra parte, estas listas tienen la propiedad de que los elementos comunes que tienen que aparecen en orden: es decir, si L[i] = R[i*]
y L[j] = R[j*]
y i
< j
continuación i
* * j
<. Las listas no necesitan tener ningún elemento común, y una o ambas pueden estar vacías. [Aclaración: puede suponer que no hay repeticiones de elementos.]
El problema es producir una especie de "diff" de las listas, que puede ser vista como nueva lista de pares ordenados (x,y)
donde x
es de L
y y
es de R
, con las siguientes propiedades:
- Si aparece
x
en ambas listas,(x,x)
aparece en el resultado. - Si aparece
x
enL
, pero no enR
, aparece(x,NULL)
en el resultado. - Si aparece
y
enR
, pero no enL
, aparece(NULL,y)
en el resultado.
y finalmente
- La lista de resultados tiene "el mismo" ordenamiento como cada una de las listas de entrada: comparte, en términos generales, la misma propiedad de ordenación que el anterior con cada una de las listas de forma individual (ver ejemplo).
Ejemplos
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))
cualquier persona tiene buenos algoritmos para resolver esto? ¿Cuál es la complejidad?
Háganme saber si prueba los resultados. También quiero saber la respuesta de trabajo para mi tarea. – sblom
Supongo que el orden relativo de NULL es arbitrario? Es decir, en su primer ejemplo, (NULL, d) podría aparecer en cualquier lugar, ¿verdad? –
¿Conoces el algoritmo de pedido o no? (si el primero, es trivial y O (n)) –