Mein anfänglicher Algorithmus:
- Vergleichen Sie Element 0 mit jedem anderen Element und verfolgen Sie, wie viele Elemente kleiner sind.
- Wiederholen Sie diesen Vorgang für jedes Element, bis ein Element gefunden wird, das größer als genau (k-1) Elemente ist.
Ich gehe davon aus, dass dies im schlimmsten Fall dauern würde . Kann eine schnellere Laufzeit erreicht werden, ohne die Liste zu sortieren?
search-algorithms
lists
WARUM
quelle
quelle
Antworten:
Verwenden Sie den Auswahlalgorithmus für die lineare Zeit https://en.m.wikipedia.org/wiki/Selection_algorithm
quelle
Leider kann ich nicht nur einen Kommentar abgeben, sondern muss ihn als Antwort posten.
Wie auch immer, Sie könnten versuchen, einen Min-Heap für Ihr unsortiertes Array zu verwenden. Sie sollten in der Lage sein, eine Zeitkomplexität von O (n + k * logn) zu erhalten.
quelle
Der Quickselect-Algorithmus kann dies bei einer durchschnittlichen Komplexität von O (n) tun. Er ist laut Wikipedia einer der am häufigsten verwendeten Auswahlalgorithmen .
Es ist von QuickSort abgeleitet und leidet als solches unter einer O (n²) Worst-Case-Komplexität, wenn Sie einen schlechten Pivot verwenden (ein Problem, das in der Praxis vermieden werden kann).
Der Algorithmus auf den Punkt gebracht: Steigen Sie nach dem Schwenken wie in QuickSort nur in die untere oder obere Seite des Arrays ab - je nachdem, welches von ihnen das gewünschte Element enthält.
quelle
quelle