Angenommen, Sie haben ein sortiertes Zahlenfeld sorted_array
und einen Schwellenwert threshold
. Was ist der schnellste Weg, das längste Unterfeld zu finden, in dem alle Werte innerhalb des Grenzwerts liegen? Mit anderen Worten, finden Indizes i
und j
, so dass:Wie finde ich das längste Sub-Array innerhalb eines Schwellenwerts?
sorted_array[j] - sorted_array[i] <= threshold
j - i
maximal ist
Im Falle eines Unentschiedens, bringen Sie das Paar mit dem kleinsten i
.
Ich habe bereits eine Schleife-basierte Lösung, die ich als Antwort posten werde, aber ich bin gespannt, ob es einen besseren Weg gibt, oder eine Möglichkeit, die Schleife mit einer Vektor-fähigen Sprache oder Bibliothek zu vermeiden wie zum Beispiel NumPy.
Beispiel Ein- und Ausgang:
>>> sorted_array = [0, 0.7, 1, 2, 2.5]
>>> longest_subarray_within_threshold(sorted_array, 0.2)
(0, 0)
>>> longest_subarray_within_threshold(sorted_array, 0.4)
(1, 2)
>>> longest_subarray_within_threshold(sorted_array, 0.8)
(0, 1)
>>> longest_subarray_within_threshold(sorted_array, 1)
(0, 2)
>>> longest_subarray_within_threshold(sorted_array, 1.9)
(1, 4)
>>> longest_subarray_within_threshold(sorted_array, 2)
(0, 3)
>>> longest_subarray_within_threshold(sorted_array, 2.6)
(0, 4)
Ihre eigene Lösung ist schon linear, und ich glaube nicht, dass es möglich ist, für eine einzelne Abfrage asymptotisch schneller zu gehen (obwohl ich es nicht beweisen kann). Wenn Sie viele Abfragen für verschiedene Schwellenwerte verarbeiten möchten und O (n) Speicherplatz und O (n log n) Vorverarbeitungszeit benötigen, können Sie eine Tabelle m [] erstellen, wobei m [i] der minimale Schwellenwert ist, der a erlaubt Subarray der Länge i. Dann kann jede Abfrage in O (log n) -Zeit durch binäre Suche m [] beantwortet werden. –