Dieser Artikel beschreibt den von Java implementierten linearen Zeitauswahlvorgang basierend auf dem Verteilungs- und Eroberungsalgorithmus. Teilen Sie es für Ihre Referenz wie folgt weiter:
Lineares Zeitauswahlproblem: Gegebene Nelemente und eine Ganzzahl k, 1 ≤ k ≤ N ist es notwendig, das kleinste Element dieser N -Elemente herauszufinden (der hier angegebene lineare festgelegte hier ist ungeordnet).
Zufällig geteilte lineare Auswahl
Die Methode für zufällige Divisionen der linearen Zeitauswahl kann das Design des randomisierten Schnellsortalgorithmus imitieren. Die Grundidee besteht darin, das Eingangsarray rekursiv zu teilen. Im Gegensatz zum schnellen Sortieren verarbeitet es nur einen der geteilten Subtarrays rekursiv.
Programm Erläuterung: Verwenden Sie eine zufällige Funktion, um einen Abteilungs -Benchmark zu generieren, das Array A [P: R] in zwei Subarrays A [P: I] und A [I+1: R], so dass jedes Element in einem [p: i] nicht größer als jedes Element in einem [i+1: r] ist. Dann berechnet "J = I-P+1" die Anzahl der Elemente J in a [p: i]. Wenn k <= j, dann befindet sich das k-te kleinste Element in a [p: r] im Unterarray A [P: I], und wenn k> j, ist das k-te kleinste Element im Sub-Array A [i+1: r]. HINWEIS: Da bekannt ist, dass die Elemente im Unterarray A [p: i] alle kleiner sind als das zu findene K-te kleine Element, ist das k-te kleine Element in a [p: r] das k-te kleine Element in a [i+1: r].
Zum Beispiel im schlimmsten Fall: Wenn das kleinste Element immer gefunden wird, ist es immer auf das größte Element unterteilt, nämlich die zeitliche Komplexität von O (n^2) . Die durchschnittliche Zeitkomplexität ist jedoch linear mit N zusammenhängen, dh o (n)
Paket math; import Java.util.scanner; Import Java.util.random; öffentliche Klasse RandomSelect {public static void Swap (int x, int y) {int temp = x; x = y; y = temp; } public int random (int x, int y) {randal randomy = new random (); int num = random.nextint (y)%(y - x + 1) + x; Rückgabe num; } public int partition (int [] liste, int niedrig, int hoch) {int tmp = list [niedrig]; // Das erste des Arrays ist die Mittelachse, während (niedrig <hoch) {while (niedrig <hoch && liste [hoch]> tmp) {High-; } list [niedrig] = list [hoch]; // Aufzeichnungen kleiner als die Mittelachse werden auf das niedrige Ende verschoben, während (niedrige <hoch && Liste [niedrig] <tmp) {Low ++; } list [hoch] = list [niedrig]; // Aufzeichnungen größer als die Mittelachse werden in die High -End -Liste [niedrig] = TMP verschoben; // Aufzeichnungen größer als die Mittelachse werden niedrig zurückgegeben. // kehre zur Position der Mittelachse zurück. Swap (Arrays [i], Arrays [links]); Return Partition (Arrays, links, rechts); } public int randomizedSelect (int [] Arrays, int links, int rechts, int k) {if (links == rechts) {return arrays [links]; } int i = randomisierte Teil (Arrays, links, rechts); int j = i - links + 1; if (k <= j) {randomizedSelect zurückgeben (Arrays, links, i, k); } else {randomizedSelect zurückgeben (Arrays, i+1, rechts, kJ); }} public static void main (String args []) {System.out.println ("Wulin.com Testergebnis:"); int [] a = {7,5,3,4,8,6,9,1,2}; für (int i = 0; i <9; i ++) {System.out.print (a [i]+""); } System.out.println (); RandomSelect r = neuer randomSelect (); System.out.println ("Welches kleinste Element möchten Sie im Array abfragen?"); @SuppressWarnings ("Ressourcen") Scanner sc = neuer Scanner (System.in); int m = sc.Nextint (); int n = r.randomizedSelect (a, 0,8, m); System.out.println ("Das" Th "in diesem Array" + m + "Das kleinste Element ist:" + n); }}Auslaufergebnisse:
Für weitere Informationen zu Java -Algorithmen können Leser, die an dieser Website interessiert sind, die Themen "Java -Datenstruktur und Algorithmus -Tutorial", "Zusammenfassung der Java -Operation DOM -Knoten -Tipps", "Zusammenfassung der Java -Datei- und Verzeichnisoperationstipps" und "Zusammenfassung der Java -Cache -Operation Tipps" anzeigen
Ich hoffe, dieser Artikel wird für Java -Programme aller hilfreich sein.