Merge-Bereiche in Abständen
Gegeben sei eine Menge von Intervallen: {1-4, 6-7, 10-12} hinzufügen eines neuen Intervalls: (9,11), so dass die endgültige Lösung ist 'zusammengefasst': Output: {1-4, 6-7, 9-12}. Die Fusion kann passieren, auf beiden Seiten (low-als auch high range).
Sah ich diese Frage beantwortet wurde, an mehreren Orten, jemand hat sogar vorgeschlagen, Intervall-Bäume, aber nicht erklären, wie genau Sie es verwenden würden. Die einzige Lösung die ich kenne ist, ordnen Sie die Intervalle in aufsteigender Reihenfolge Ihrer start-und iteriert Sie und versuchen, mischen Sie Sie entsprechend.
Wenn mir jemand helfen kann zu verstehen, wie können wir verwenden, Intervall-Bäume in diesem Anwendungsfall wird es großartig sein!
[I wurden folgende Intervall-Bäume in CLRS-Buch, aber sprechen Sie nicht über Fusion, alles, was Sie sprechen, ist, einfügen und suchen.]
- Diese Antwort: stackoverflow.com/a/6462731/1296661 erwähnt Algorithmus für die Zusammenführung der Intervall-Bäume
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Ich gehe davon aus, dass dies bedeutet, dass Intervalle können nie überlappen, da Sie sonst würde zusammengeführt werden.)
Einen Weg, dies zu tun wäre, um zu speichern eine ausgewogene binären Suchbaum einen Knoten pro Endpunkt eines Bereichs sein. Jeder Knoten würde dann so markiert werden, dass entweder eine "offene" Knoten markiert den Beginn eines Intervalls oder ein "schließen" - Knoten markiert das Ende eines Intervalls.
Beim einfügen einer neuen Reihe, einer der beiden Fälle auftreten, in Bezug auf den Startpunkt der Strecke:
Um zu bestimmen, welche, wenn Sie in sind, können Sie eine Vorgänger-Suche in der Baumstruktur für den Bereich start-Punkt. Wenn Sie NULL-oder nahe-Knoten, müssen Sie eine neue open-Knoten, der für den start-Punkt der Reihe. Wenn Sie einen Knoten öffnen, Sie halten gerade die Verlängerung des Intervalls.
Gibt, werden Sie brauchen, um zu bestimmen, wie weit das Spektrum reicht. Um dies zu tun, ständig die Berechnung der Nachfolger des ersten Knotens eingefügt, bis eines der folgenden Ereignisse Eintritt:
Haben Sie schaute auf alle Knoten im Baum. In diesem Fall müssen Sie eine enge Knoten markiert das Ende dieses Intervalls.
Sehen Sie eine enge Knoten nach dem Ende der Reihe. In diesem Fall sind Sie in der Mitte eines vorhandenen Bereichs, wenn der neue Bereich endet, so dass Sie nicht brauchen nichts mehr zu machen. Sie sind fertig.
Sehen Sie ein schließen oder öffnen Sie den Knoten vor dem Ende der Reihe. In diesem Fall müssen Sie entfernen dieses Knotens aus dem Baum, da der alte Bereich wird subsumiert, durch die neue ersetzt.
Sehen Sie eine offene Knoten nach dem Ende der Reihe. In diesem Fall legen Sie eine neue enge Knoten in den Baum, da müssen Sie beenden das aktuelle Angebot zu sehen, bevor der start dieser neuen.
Umgesetzt naiv, die Laufzeit dieses Algorithmus ist O(log n + k log n), wobei n die Anzahl der Intervalle und k ist die Anzahl der Intervalle entfernt, die während dieses Prozesses (da haben Sie zu tun, n löscht). Sie können jedoch die Geschwindigkeit bis zu O(log n) durch Verwendung der folgenden trick. Da der Löschvorgang löscht immer die Knoten in einer Reihenfolge, die Sie verwenden können, eine Nachfolger-Suche für den Endpunkt zu bestimmen, die das Ende des Bereichs zu entfernen. Dann können Sie splice den Teilbereich zu entfernen aus dem Baum durch zwei tree-split-Operationen und ein Baum join-operation. Auf einer geeignet ausgewogenen Baum (rot-schwarz oder einen Winkelbereich, beispielsweise) kann dies in O(log n) Zeit insgesamt, das geht viel schneller, wenn viele Bereiche gehen, subsumiert.
Hoffe, das hilft!
public class MergeIntervals {
Check this out. Es kann Ihnen helfen:- http://www.boost.org/doc/libs/1_46_0/libs/icl/doc/html/index.html
Die Bibliothek bietet die folgenden Funktionalitäten:
1) interval_set
2) separate_interval_set
3) split_interval_set
C#
Das geschieht einfach durch addieren des Intervalls in Frage, um das Ende des Intervalls gesetzt, dann ein merge auf allen teh Elemente des Intervalls festgelegt.
Den merge-Vorgang ist detailliert hier: http://www.geeksforgeeks.org/merging-intervals/
Wenn Sie nicht in der Stimmung für C++ - code, hier ist die gleichen Dinge in python:
Vergessen Sie nicht, Ihre nosetests zu überprüfen, ob Sie tatsächlich die richtige Arbeit: