Finde das zweithöchste Element

7
  1. Wie finden Sie in einem gegebenen Array den 2., 3., 4. oder 5. Wert?

  2. Auch wenn wir die Funktion max() in Python verwenden, ist die Reihenfolge der Komplexität, d. h. in Verbindung mit dieser Funktion max() ?

.

%Vor%     
Hulk 31.08.2013, 15:31
quelle

6 Antworten

15

Ich würde gehen nach:

%Vor%

Dies ist effizienter, als die gesamte Liste zu sortieren und dann die ersten n viele Elemente zu verwenden. Weitere Informationen finden Sie in der Heapq-Dokumentation .

    
Jon Clements 31.08.2013, 15:34
quelle
4

Sie könnten sorted(set(element)) :

verwenden %Vor%

als Funktion:

%Vor%

test:

%Vor%

Hinweis: Hier müssen Sie die Duplikate nur einmal sortieren und entfernen, wenn Sie sich Sorgen um die Leistung machen, in der Sie das Ergebnis von sorted(set(li)) zwischenspeichern könnten.

    
user1129665 31.08.2013 15:38
quelle
2

Wenn die Leistung ein Problem ist (zB: Sie beabsichtigen, dies viel zu nennen), sollten Sie die Liste unbedingt immer sortiert und dedupliziert halten, und einfach das erste, zweite oder n-te Element (das ist% Code%).

Verwenden Sie dazu das o(1) Modul - es ist schneller als ein "Standard" bisect .

Mit

sort können Sie ein Element einfügen, und mit insort können Sie herausfinden, ob Sie überhaupt einfügen sollen (um Duplikate zu vermeiden).

Wenn nicht, würde ich das einfachere vorschlagen:

%Vor%

Wenn die umgekehrte Indizierung für Sie hässlich aussieht, können Sie Folgendes tun:

%Vor%     
Thomas Orozco 31.08.2013 15:33
quelle
2

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.

    
Shashank 31.08.2013 16:09
quelle
0
___ qstntxt ___
  1. Wie finden Sie in einem gegebenen Array den 2., 3., 4. oder 5. Wert?

  2. Auch wenn wir die Funktion import numpy as np in Python verwenden, ist die Reihenfolge der Komplexität, d. h. in Verbindung mit dieser Funktion partition(a, kth) ?

.

%Vor%     
___ answer18549800 ___

Sie könnten k :

verwenden %Vor%

als Funktion:

%Vor%

test:

%Vor%

Hinweis: Hier müssen Sie die Duplikate nur einmal sortieren und entfernen, wenn Sie sich Sorgen um die Leistung machen, in der Sie das Ergebnis von %code% zwischenspeichern könnten.

    
___ qstnhdr ___ Finde das zweithöchste Element ___ answer18549768 ___

Ich würde gehen nach:

%Vor%

Dies ist effizienter, als die gesamte Liste zu sortieren und dann die ersten %code% viele Elemente zu verwenden. Weitere Informationen finden Sie in der Heapq-Dokumentation .

    
___ answer18550080 ___

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 %code% 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 %code% anstelle von %code% verwendet wird.

Wenn Sie andererseits nur Abfragen mit niedrigem Index durchführen, kann Ihre Funktion effizient sein, da sie nur die Funktion O (n) %code% 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 %code% -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 %code% 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.

    
___ antwort43171103 ___

Wenn es Ihnen nichts ausmacht mit numpy ( %code% ):

%Vor%

gibt Ihnen das i größte Element der Liste mit einer garantierten Worst-Case O (n) Laufzeit .

Die Methode %code% gibt ein Array zurück, in dem das Element %code% th dasselbe ist wie in einem sortierten Array, alle Elemente davor sind kleiner und alle dahinter sind größer.

    
___ answer18549747 ___

Wie wäre es mit:

%Vor%     
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ answer18549753 ___

Wenn die Leistung ein Problem ist (zB: Sie beabsichtigen, dies viel zu nennen), sollten Sie die Liste unbedingt immer sortiert und dedupliziert halten, und einfach das erste, zweite oder n-te Element (das ist% Code%).

Verwenden Sie dazu das %code% Modul - es ist schneller als ein "Standard" %code% .

Mit

%code% können Sie ein Element einfügen, und mit %code% können Sie herausfinden, ob Sie überhaupt einfügen sollen (um Duplikate zu vermeiden).

Wenn nicht, würde ich das einfachere vorschlagen:

%Vor%

Wenn die umgekehrte Indizierung für Sie hässlich aussieht, können Sie Folgendes tun:

%Vor%     
___
serv-inc 02.04.2017 17:09
quelle
-1

Wie wäre es mit:

%Vor%     
Jo Are By 31.08.2013 15:33
quelle

Tags und Links