Frage

würde Ich mag wissen, ob es ein effizienter Algorithmus die größten m Elemente in einer N x N-Matrix, mit einem Verfahren Header wie folgt zu finden:

double[] greatestValues(double[][] matrix, int numberOfElements);

Irgendwelche Ideen?

War es hilfreich?

Lösung

Wenn Sie die N x N-Matrix als ein Array von N x N Artikel behandeln können Sie eine der folgenden Techniken anwenden:

  

Die direkte Anwendung des schnellen Art basierten Algorithmus zur Auswahl Die schnellen   Art basierend Auswahlalgorithmus kann sein   zu finden k kleinsten oder k verwendet größten   Elemente. Für k kleinsten Elemente   finden Sie die k-te kleinste Element mit   der Median der Mediane schnelle Art basiert   Algorithmus. Nach der Partition,   findet das kleinste Element k-ten, die alle   die Elemente, die kleiner als die k-te   wird kleines Element vorhanden seine linke   auf das k-te Element und alle Elemente   größer wird anwesend sein Recht auf die   kte kleinstes Element. So sind alle   Elemente vom 1. bis k-te Element   einschließlich bilden die k kleinsten   Elemente. Die Zeitkomplexität ist   linear in der n, die Gesamtzahl der   Elemente.

     

Datenstruktur basierte Lösungen Eine weitere einfache Methode ist jeder hinzufügen   Element der Liste, in eine geordnete   Satz-Datenstruktur, wie beispielsweise ein Haufen oder   Balancierter Baum,   mit höchstens k Elementen. Jedes Mal, wenn die   Datenstruktur mehr als k   Elemente, entfernen wir die größte   Element, das in O durchgeführt werden kann (log k)   Zeit. Jeder Einführvorgang auch   nimmt O (log k) der Zeit, was zu   O (nlog k) Zeit insgesamt.

     

Es ist möglich, um die Liste zu transformieren   in einen Haufen in Θ (n) Zeit, und dann   durchqueren des Heap eines abgewandelte Verwendung   Breitensuche Algorithmus,   legt die Elemente in einer Priorität   Queue (anstelle der normalen Warteschlange   dass normalerweise in einer BFS verwendet) und   beenden Sie den Scan nach Durchlaufen   genau Elemente k. Da die Größe der Warteschlange   bleibt O (k) während der Traversierung,   es würde O (klog k) Zeit erfordern, um   vollständig, was zu einer Zeit gebunden   O (n + klog k) zu diesem Algorithmus.

hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top