Dies kam in einer realen Situation, und ich dachte, ich würde es teilen, da es zu einigen interessanten Lösungen führen könnte. Im Wesentlichen muss der Algorithmus zwei Listen unterscheiden, aber lassen Sie mich eine genauere Definition des Problems geben.Algorithmen: Interessante diffing algorithm
mathematische Formulierung
Angenommen, Sie zwei Listen haben, L
und R
von denen jeder S
Elemente aus irgendeinem Grunde liegenden Alphabet enthalten. Darüber hinaus haben diese Listen die Eigenschaft, dass die gemeinsamen Elemente, die sie erscheinen, um haben: das heißt, wenn L[i] = R[i*]
und L[j] = R[j*]
und i
< j
dann i
* < j
*. Die Listen müssen überhaupt keine gemeinsamen Elemente haben, und eines oder beide können leer sein. [Erläuterung: Sie dürfen keine Wiederholungen von Elementen annehmen.]
Das Problem ist es, eine Art „diff“ der Listen zu erzeugen, die als neue Liste geordneter Paare betrachtet werden können (x,y)
wo x
von L
und y
ist aus R
, mit den folgenden Eigenschaften:
- Wenn
x
in beiden Listen angezeigt wird, erscheint(x,x)
im Ergebnis. - Wenn
x
inL
, aber nicht inR
erscheint, dann erscheint(x,NULL)
im Ergebnis. - Wenn
y
inR
, aber nicht inL
angezeigt wird, erscheint(NULL,y)
im Ergebnis.
und schließlich
- Die Ergebnisliste haben „die gleiche“ Bestellung als jedes der Eingangslisten: es Aktien, grob gesprochen, die gleiche Ordnungseigenschaft wie oben mit jedem der Listen einzeln (siehe Beispiel).
Beispiele
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))
Hat keine gute Algorithmen jemand dieses Problem zu lösen? Was ist die Komplexität?
Bitte lassen Sie mich wissen, wenn Sie die Ergebnisse testen. Ich möchte auch die funktionierende Antwort für meine Hausaufgaben wissen. – sblom
Ich nehme an, die relative Reihenfolge von NULL ist beliebig? Das heißt, in Ihrem ersten Beispiel könnte (NULL, d) irgendwo erscheinen, oder? –
Kennen Sie den Bestellalgorithmus oder nicht? (Wenn der erste, es ist trivial und O (n)) –