Welche Methode die geringste Zeitkomplexität haben würde, hängt stark davon ab, welche Art von Abfragen Sie durchführen möchten.
Wenn Sie vorhaben, Abfragen in hohe Indizes zu verwandeln (z. B. das 36. größte Element in einer Liste mit 38 Elementen), wird Ihre Funktion nth_largest(li,n)
eine Zeitkomplexität von 0 (n ^ 2) haben, da dies erforderlich ist max, das ist O (n), mehrmals. Es wird dem Selection Sort-Algorithmus ähnlich sein, außer dass max()
anstelle von min()
verwendet wird.
Wenn Sie andererseits nur Abfragen mit niedrigem Index durchführen, kann Ihre Funktion effizient sein, da sie nur die Funktion O (n) max
einige Male anwendet und die Komplexität der Zeit nahe bei O liegt ( n). Es ist jedoch möglich, in der linearen Zeit O (n) einen Max-Heap zu erstellen, und es wäre besser, wenn Sie nur diesen verwenden. Nachdem Sie sich die Mühe gemacht haben, einen Heap zu erstellen, werden alle Ihre max()
-Operationen auf dem Heap O (1) sein, was eine bessere langfristige Lösung für Sie sein könnte.
Ich glaube, der am besten skalierbare Weg (um das n-te größte Element für any n abfragen zu können) besteht darin, die Liste mit der Zeitkomplexität O (n log n) zu sortieren sort
function und dann O (1) Abfragen aus der sortierten Liste. Natürlich ist das nicht die speichereffizienteste Methode, aber in Bezug auf die zeitliche Komplexität ist es sehr effizient.