Hinweis: Ich habe diese Frage von stackoverflow.com verschoben
Ich habe ein algorithmisches Problem, bei dem ich sehen möchte, ob es besser gelöst werden kann als ::
Ich habe einen Tisch gegeben von Elemente, bei denen jedes Element ein Tupel ist mit und Das heißt, jedes Tupel ist eine Art Intervall. Ich muss alle Intervalle finden, die sich mit einem bestimmten Intervall überschneiden mit und . Außerdem habe ich zwei sortierte Listen zur Verfügung und , mit dem Werte oder Werte jeweils zusammen mit dem Index auf den jeweiligen Eintrag in zeigen . Die Listen sind sortiert nach Werte oder Werte jeweils. (Nehmen wir beides an, und Werte sind eindeutig.)
Problem:
Wir müssen jedes Intervall / Tupel finden wo und .
Meine bisherigen Gedanken:
Wir können einige Elemente ausschließen, indem wir entweder eine der Intervallgrenzen anwenden, dh suchen im oder im . Dies gibt uns eine Liste der verbleibenden Elemente:
Die Komplexität für diese Lösung ist .
Sagen wir das jedoch ist die maximale Anzahl von Elementen, die sich mit dem Intervall überlappen . Wenn wir annehmendann ist die Komplexität da können wir zumindest ausschließen Elemente durch Auswahl der entsprechenden Suche nach . Immer noch ist in .
Können Sie sich einen besseren Ansatz zur Lösung dieses Problems vorstellen?
Für die Aufzeichnung:
Die Komplexität zum Finden aller Intervalle, die sich mit einem bestimmten Intervall überlappen, unter Verwendung eines Intervallbaums ist wo ist die Anzahl der überlappenden Intervalle. In meinem praktischen Fall verwende ich jedoch eine MySQL-Datenbank, die Indexbäume für jeden Wert bereitstellt, d. H. und separat. Auf diese Weise kann ich keine überlappenden Intervalle in weniger als finden. Ich müsste einen Intervallbaum erstellen, der ein Suchbaum ist, der beide Intervallgrenzen speichert, d. H. und in einer einzigen Datenstruktur. Die Komplexität für die Erstellung des Intervallbaums beträgt. [ http://www.dgp.utoronto.ca/people/JamesStewart/378notes/22intervals/]
Antworten:
Ich glaube, dass Intervallbäume eine Lösung für Ihr Problem bieten. Grundsätzlich speichern Sie Ihre Intervalle in der Intervallbaum-Datenstruktur. dann, um alle Intervalle zu finden, die sich mit überlappen[t0,t1] Sie führen eine Abfrage in den Intervallbaum durch. Dies sollte Ihr Problem lösen und schneller laufen alsO(n) Zeit.
quelle