Aus der Frage geht hervor, dass Sie die Indexpositionen für jede Ihrer n "Suchwörter" (Wort1, Wort2, Wort3, ..., Wort n ) im Dokument. Mit Hilfe eines Sortieralgorithmus wird die n Unabhängige Arrays, die Suchwörtern zugeordnet sind, lassen sich leicht als ein einziges Array mit allen Indexpositionen in aufsteigender numerischer Reihenfolge und einer Wortbezeichnung darstellen, die jedem Index in dem Array zugeordnet ist (das Index-Array).
Der grundlegende Algorithmus:
(Diese Funktion ist so konzipiert, dass sie unabhängig davon funktioniert, ob der Fragesteller beabsichtigt, zwei verschiedene Suchbegriffe unter derselben Indexnummer nebeneinander zuzulassen).
Zunächst definieren wir eine einfache Funktion zur Messung der Länge eines Snippets, das alle n Etiketten mit einem Startpunkt im Index-Array. (Aus der Definition unseres Arrays ist ersichtlich, dass jeder Startpunkt im Array notwendigerweise der indizierte Ort eines der n Suchbezeichnungen). Die Funktion merkt sich einfach die eindeutigen Suchbezeichnungen, während die Funktion die Elemente im Array durchläuft, bis alle n Etiketten beobachtet worden. Die Länge des Snippets ist definiert als die Differenz zwischen dem Index des letzten gefundenen eindeutigen Labels und dem Index des Startpunktes im Index-Array (dem ersten gefundenen eindeutigen Label). Wenn alle n Beschriftungen nicht vor dem Ende des Arrays beobachtet werden, gibt die Funktion einen Nullwert zurück.
Jetzt kann die Funktion "Snippet-Länge" für jedes Element in Ihrem Array ausgeführt werden, um eine Snippet-Größe zuzuordnen, die alle n Suchwörter, beginnend mit jedem Element im Array. Der kleinste Wert, der nicht Null ist und von der Funktion snippet length über das gesamte Index-Array zurückgegeben wird, ist der gesuchte Ausschnitt in Ihrem Dokument.
Erforderliche Optimierungen:
- Behält den Wert der aktuell kürzesten Snippet-Länge im Auge, so dass der Wert sofort bekannt ist, nachdem einmal durch das Index-Array iteriert wurde.
- Wenn Sie durch Ihr Array iterieren, beenden Sie die Funktion "Snippet-Länge", wenn das aktuell untersuchte Snippet die Länge des kürzesten zuvor gesehenen Snippets überschreitet.
- Wenn die Funktion "Snippetlänge" Null zurückgibt, weil nicht alle Snippets gefunden wurden n Suchwörter in den verbleibenden Index-Array-Elementen, assoziieren Sie eine Null-Snippet-Länge mit allen aufeinanderfolgenden Elementen im Index-Array.
- Wenn die Funktion "Snippet-Länge" auf ein Wort-Etikett angewandt wird und das unmittelbar darauf folgende Etikett mit dem Start-Etikett identisch ist, wird dem Start-Etikett ein Nullwert zugewiesen und mit dem nächsten Etikett fortgefahren.
Computerkomplexität:
Offensichtlich kann der Sortierteil des Algorithmus in O( n Protokoll n ).
So würde ich die Zeitkomplexität des zweiten Teils des Algorithmus berechnen (für Kritik und Korrekturen wäre ich sehr dankbar).
Im besten Fall wendet der Algorithmus die Snippet-Längenfunktion nur auf das erste Element im Index-Array an und stellt fest, dass kein Snippet mit allen Suchwörtern existiert. Dieses Szenario würde in nur n Berechnungen, bei denen n ist die Größe des Index-Arrays. Noch schlimmer ist es, wenn das kleinste Snippet gleich der Größe des gesamten Arrays ist. In diesem Fall beträgt der Rechenaufwand etwas weniger als 2 n (einmal durch das Array, um die kleinste Snippetlänge zu finden, ein zweites Mal, um zu zeigen, dass keine anderen Snippets existieren). Je kürzer die durchschnittlich berechnete Snippetlänge ist, desto öfter muss die Snippetlängenfunktion auf das Index-Array angewendet werden. Wir können davon ausgehen, dass unser Worst-Case-Szenario der Fall sein wird, in dem die Snippet-Längenfunktion auf jedes Element im Index-Array angewendet werden muss. Um einen Fall zu entwickeln, in dem die Funktion auf jedes Element im Index-Array angewendet wird, müssen wir ein Index-Array entwerfen, bei dem die durchschnittliche Snippet-Länge über das gesamte Index-Array vernachlässigbar ist im Vergleich zur Größe des Index-Arrays insgesamt. In diesem Fall können wir unsere Berechnungskomplexität als O(C n ), wobei C eine Konstante ist, die deutlich kleiner ist als n . Daraus ergibt sich eine endgültige rechnerische Komplexität von:
O( n Protokoll n + C n )
Dónde:
C << n
Edit :
AndreyT weist zu Recht darauf hin, dass anstelle der Sortierung der Wortindizes in n Protokoll n Zeit, könnte man sie genauso gut zusammenführen (da die Unterfelder bereits sortiert sind) in n Protokoll m Zeit, in der m ist die Anzahl der Suchwortfelder, die zusammengeführt werden sollen. Dies beschleunigt den Algorithmus offensichtlich in Fällen, in denen m < n .