Finden Sie alle Intervalle, die sich mit einem bestimmten Intervall überschneiden

7

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 O(n)::

Ich habe einen Tisch gegeben T von n Elemente, bei denen jedes Element ein Tupel ist (si,ei) mit si,eiN und si<eiDas heißt, jedes Tupel ist eine Art Intervall. Ich muss alle Intervalle finden, die sich mit einem bestimmten Intervall überschneiden[t0,t1] mit t0,t1N und t0<t1. Außerdem habe ich zwei sortierte Listen zur VerfügungS und E, mit dem s Werte oder e Werte jeweils zusammen mit dem Index i auf den jeweiligen Eintrag in zeigen T. Die Listen sind sortiert nachs Werte oder eWerte jeweils. (Nehmen wir beides an,s und e Werte sind eindeutig.)

Problem:

Wir müssen jedes Intervall / Tupel finden (si,ei)T wo sit1 und eit0.

Meine bisherigen Gedanken:

Wir können einige Elemente ausschließen, indem wir entweder eine der Intervallgrenzen anwenden, dh suchen t1 im S oder t0 im E. Dies gibt uns eine ListeL der verbleibenden Elemente:

L{eEet0} or L{sSst1}
Es gibt jedoch keine Untergrenze für die Anzahl der Elemente in L, egal welche Suche wir durchführen. Außerdem müssen wir jedes Element eincheckenL wenn st1, oder et0 jeweils abhängig davon, welche Suche wir zuvor durchgeführt haben.

Die Komplexität für diese Lösung ist O(n).

Sagen wir das jedoch k ist die maximale Anzahl von Elementen, die sich mit dem Intervall überlappen [t0,t1]. Wenn wir annehmenkndann ist die Komplexität O(n/2) da können wir zumindest ausschließen n/2 Elemente durch Auswahl der entsprechenden Suche nach L. Immer nochO(n/2) ist in O(n).

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 O(logn+k) wo kist 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.s und eseparat. Auf diese Weise kann ich keine überlappenden Intervalle in weniger als findenO(n). Ich müsste einen Intervallbaum erstellen, der ein Suchbaum ist, der beide Intervallgrenzen speichert, d. H.s und ein einer einzigen Datenstruktur. Die Komplexität für die Erstellung des Intervallbaums beträgtO(nlogn). [ http://www.dgp.utoronto.ca/people/JamesStewart/378notes/22intervals/]

sema
quelle
2
Wenn knIch denke, es gibt eine Vorberechnung vonO(nk) Raum, was dazu führt O(k2+logn)Zeitsuchen. Ich frage mich, ob das in Ordnung ist.
Karolis Juodelė

Antworten:

6

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.

DW
quelle
Danke für den Hinweis. Für das anfängliche Problem denke ich jedoch, dass es keine bessere Lösung gibt alsO(n). Nur wenn ich das annehmen kannknWir können jedoch schneller sein, leider gilt diese Annahme in meinem Fall nicht wirklich. Vielen Dank.
Sema
1
@sema, ich bin verwirrt. Wenn es gibtk=Θ(n) Überlappende Intervalle, dann kann man es natürlich nicht besser machen als O(n)Zeit, und in diesem Fall können Sie genauso gut jedes der Intervalle im Set überprüfen - ich bin mir also nicht sicher, was Ihre Frage ist oder warum Sie fragen (Sie haben bereits einen Beweis dafür, dass man es nicht besser machen kann als das naiver Algorithmus). Im Gegensatz dazu, wennk=o(n)Intervallbäume sind besser als nur jedes mögliche Intervall zu überprüfen. Im Allgemeinen basiert die Laufzeit von Intervallbäumen auf der Anzahl der Übereinstimmungen, sodass ihre Laufzeit nahe an der besten liegt, auf die man hoffen kann.
DW
Entschuldigen Sie das Durcheinander. Ich stimme Ihnen nur zu und fasse für mich zusammen, dass es wünschenswert wäre, eine Obergrenze zu findenk so dass kn. Mit dem allgemeinen Problem stecken wir festO(n)wo wir es nicht besser machen können. Vielen Dank für Ihre Antwort und den Verweis auf Intervallbäume.
Sema
Sie sollten wahrscheinlich die Zeit, die Sie für die Erstellung des Intervallbaums aufgewendet haben, in Ihre Antwort aufnehmen.
Raphael
@sema Die Notation knmacht asymptotisch nicht viel Sinn. Sie möchten verwendenko(n).
Raphael