C #: Effizienter Algorithmus größte m Elemente in einer N x N-Matrix finden
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?
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 .