Motivation : Bei der Entwicklung von Tools für die Datenversionierung haben wir uns schließlich mit Algorithmen zum "Unterscheiden" zweier Sätze von Ganzzahlen befasst, indem wir eine Folge von Transformationen entwickelt haben, die einen Satz von Ganzzahlen zum anderen führen. Wir konnten dieses Problem auf das folgende sehr natürliche Problem reduzieren, das Verbindungen zum Bearbeiten der Entfernung, zum Gruppieren durch Austauschen und zur minimalen gemeinsamen Zeichenfolgenpartition zu haben scheint .
Problem : Wir erhalten eine Zeichenfolge, dh eine Folge von Buchstaben, und unser Ziel ist es, sie zu minimalen Kosten zu homogenisieren . Das heißt, wir wollen eine neu angeordnete Sequenz, so dass alle Buchstaben, die gleich sind, nebeneinander liegen.
Die einzige Operation , die erlaubt ist, besteht darin, eine Teilfolge von Buchstaben aufzunehmen, die gleich sind, und diese Teilfolge irgendwohin zu verschieben, was mich 1 Einheit kostet.
Jede Hilfe, die die Komplexität dieses Problems charakterisiert, wäre sehr dankbar!
Beispiel :
- aabcdab: Eingabe
- bcd aa ab: Nach dem Verschieben des ersten aa in die Position direkt nach "d"
- b bcdaaa: Nachdem Sie das nachfolgende b in die erste Position gebracht haben
Da die resultierende Zeichenfolge homogen ist, haben wir Kosten von 2.
Beachten Sie, dass wir in Bezug auf die Ausgabe in keiner Weise eingeschränkt sind: Solange diese homogen ist, müssen wir keine bestimmte Reihenfolge sicherstellen.
quelle
Sehen Sie sich die Anzahl der Änderungen von einem Buchstaben zum anderen in Ihrer Zeichenfolge an, die Sie als Maß für die Inhomogenität der Zeichenfolge sehen können. Bei jeder (nützlichen) Bewegung einer Teilsequenz reduzieren Sie diese Zahl um eins, wenn der von Ihnen verschobenen Teilsequenz zwei unterschiedliche Buchstaben vorangestellt und gefolgt werden. Andernfalls reduzieren Sie die Inhomogenität um zwei.
Für eine Zeichenfolge mit k Änderungen benötigen Sie also höchstens k - l + 1 Züge, wobei l die Anzahl der verschiedenen Buchstaben in der Zeichenfolge ist, da am Ende l - 1 Änderungen verbleiben. Da eine Zeichenfolge mit der Länge n höchstens n-1 Buchstabenänderungen haben kann, kann sie höchstens n-l Züge benötigen . Die geringstmögliche Anzahl ist die Hälfte davon.
Die beste Strategie scheint daher zu sein, nach Teilsequenzen der Form abbba zu suchen und die bbb von dort weg zu bewegen. Wenn keine mehr vorhanden sind, bewegen Sie alles. Sie könnten immer noch versuchen, die Operationen durchzuführen, die neue Abbba-Situationen schaffen, aber ich denke, der Gewinn wird sehr gering sein. Da die schlechtestmögliche Strategie (ohne dumme Bewegungen, die die Inhomogenität erhöhen) höchstens doppelt so viele Bewegungen wie die optimale verwendet, scheint das Wenige, das Sie gewinnen könnten, in keinem vernünftigen Verhältnis zum Aufwand zu stehen, wie die Antwort von isaacg mit der Charakterisierung als NP-hart schlägt vor. Es sei denn, Sie zählen wirklich nur die Anzahl der Bewegungsvorgänge und kümmern sich nicht um die Zeit, um zu entscheiden, welche Bewegungen ausgeführt werden sollen.
Der schlimmste Fall ist daher eine Zeichenfolge, bei der sich jeder Buchstabe von seinem Vorgänger unterscheidet (und Sie keine Abbba-Boni erhalten). Hier benötigen Sie eine Reihe von Operationen, die in der Länge der Zeichenfolge linear sind und fast dieser Länge entsprechen.
In Ihrem Beispiel haben Sie 5 -> 4 -> 3 Änderungen und 3 entspricht der Anzahl der Buchstaben (4) minus 1.
Randnotiz: Bei einem Alphabet mit einer Größe von nur zwei verringert jede Bewegung, bei der kein Präfix oder Suffix der Zeichenfolge verschoben wird, die Inhomogenität um zwei, und daher ist jede Folge vernünftiger Bewegungen optimal.
quelle