Friday 10 February 2017

Moving Average Rekursive Implementierung

Wie Sortierung sortieren. QuickSort ist ein Divide - und Conquer-Algorithmus. Es wählt ein Element als Pivot und trennt das angegebene Array um den ausgewählten Pivot. Es gibt viele verschiedene Versionen von quickSort, die Pivot auf unterschiedliche Weise auswählen. Wählen Sie immer das erste Element als Pivot aus. Wählen Sie immer das letzte Element als Pivot (implementiert unten) Wählen Sie ein zufälliges Element als Pivot. Wählen Sie Median als Pivot. Der Schlüsselprozess in quickSort ist partition (). Das Ziel der Partitionen ist ein Array und ein Element x des Arrays als Pivot, setzen Sie x an seiner korrekten Position im sortierten Array und setzen alle kleineren Elemente (kleiner als x) vor x und setzen alle größeren Elemente (größer als x) nach X. All dies sollte in linearer Zeit erfolgen. Pseudo-Code für rekursive QuickSort-Funktion: Partition Algorithmus Es gibt viele Möglichkeiten, um Partition zu tun, nach Pseudo-Code übernimmt die Methode, die in CLRS Buch. Die Logik ist einfach, wir beginnen von dem am weitesten links liegenden Element und halten den Index der kleineren Elemente (oder gleich) als i. Beim Durchqueren, wenn wir ein kleineres Element finden, tauschen wir das aktuelle Element mit arri aus. Andernfalls ignorieren wir das aktuelle Element. Pseudo-Code für partition () Abbildung von partition (): Implementation: Im Folgenden werden C-, Java - und Python-Implementierungen von QuickSort beschrieben. Analyse der QuickSort Zeit, die von QuickSort im Allgemeinen genommen wird, kann wie folgt geschrieben werden. Die ersten beiden Terme sind für zwei rekursive Aufrufe, der letzte Term für den Partitionsprozess. K ist die Anzahl der Elemente, die kleiner als die Drehachse sind. Die Zeit, die QuickSort benötigt, hängt von der Eingabe-Array - und Partitionsstrategie ab. Im Folgenden sind drei Fälle. Worst Case: Der schlimmste Fall tritt auf, wenn der Partitionsprozeß immer das größte oder kleinste Element als Pivot auswählt. Wenn wir eine Partitionsstrategie betrachten, bei der das letzte Element immer als Pivot ausgewählt wird, würde der schlimmste Fall auftreten, wenn das Array bereits in aufsteigender oder absteigender Reihenfolge sortiert ist. Im Folgenden ist das Rezidiv für den schlimmsten Fall. Bester Fall: Der beste Fall tritt auf, wenn der Partitionsprozess immer das mittlere Element als Pivot auswählt. Das folgende ist Wiederholung für besten Fall. Durchschnittlicher Fall: Um die durchschnittliche Fallanalyse durchzuführen, müssen wir alle möglichen Permutationen des Arrays berücksichtigen und die Zeit berechnen, die von jeder Permutation genommen wird, die nicht einfach aussieht. Wir können eine Idee des durchschnittlichen Falles erhalten, indem wir den Fall betrachten, in dem die Partition O (n9) Elemente in einem Satz und O (9n10) Elemente in einem anderen Satz setzt. Das folgende ist Wiederholung für diesen Fall. Lösung des obigen Rezidivs ist auch O (nLogn) Obwohl die schlimmste Zeitkomplexität von QuickSort O (n 2) ist, die mehr ist als viele andere Sortieralgorithmen wie Merge Sort und Heap Sort. QuickSort ist in der Praxis schneller, weil seine innere Schleife effizient auf den meisten Architekturen und in den meisten realen Daten implementiert werden kann. QuickSort kann auf unterschiedliche Weise implementiert werden, indem die Wahl des Pivots geändert wird, so dass der schlimmste Fall für einen bestimmten Datentyp selten auftritt. Zusammenfassungssortierung wird jedoch allgemein als besser betrachtet, wenn Daten riesig sind und in einem externen Speicher gespeichert werden. Was ist 3-Wege QuickSort In einfachen QuickSort-Algorithmus, wählen wir ein Element als Pivot, partitionieren das Array um Pivot und Recur für Subarrays auf links und rechts von Pivot. Betrachten Sie ein Array mit vielen redundanten Elementen. Beispielsweise, . Wenn 4 als Pivot in Simple QuickSort ausgewählt wird, regeln wir nur eine 4 und rekursiv verarbeiten verbleibende Vorkommen. In 3 Way QuickSort ist ein Array arrl..r in 3 Teile geteilt: a) arrl..i Elemente weniger als Pivot. B) arri1..j-1 Elemente gleich Pivot. C) Elemente, die größer sind als Gelenke. Sehen Sie dies für die Umsetzung. Können wir QuickSort Iterativ implementieren Ja, bitte Iterative Quick Sort. Warum Schnelle Sortierung über MergeSort für Sortierung Arrays Quick Sort in seiner allgemeinen Form ist eine In-Place-Sortierung bevorzugt (dh es erfordert keine zusätzliche Speicherung), während Merge-Sortierung erfordert O (N) zusätzlichen Speicher, N die Array-Größe, die sein kann ziemlich teuer. Das Zuordnen und das Zuordnen des zusätzlichen Speicherplatzes, der für die Zusammenführungssortierung verwendet wird, erhöht die Laufzeit des Algorithmus. Vergleicht man die mittlere Komplexität, so finden wir, daß beide Arten O (NlogN) durchschnittliche Komplexität haben, aber die Konstanten verschieden sind. Für Arrays wird die Sortierreihenfolge durch die Verwendung von zusätzlichem O (N) - Speicherplatz verliert. Die meisten praktischen Implementierungen von Quick Sort verwenden randomisierte Version. Die randomisierte Version hat die erwartete Zeitkomplexität von O (nLogn). Der schlimmste Fall ist in der randomisierten Version auch möglich, aber schlimmsten Fall tritt nicht für ein bestimmtes Muster (wie sortierte Array) und randomisierte Quick Sort funktioniert gut in der Praxis. Quick Sort ist auch ein Cache-freundlicher Sortieralgorithmus, da er eine gute Referenzreferenz hat, wenn er für Arrays verwendet wird. Quick Sort ist auch tail-rekursiv, daher werden Schwanz-Call-Optimierungen durchgeführt. Warum MergeSort gegenüber QuickSort für verknüpfte Listen bevorzugt wird Im Falle von verknüpften Listen unterscheidet sich der Fall hauptsächlich aufgrund der unterschiedlichen Speicherzuweisung von Arrays und verknüpften Listen. Im Gegensatz zu Arrays können verknüpfte Listenknoten nicht im Speicher benachbart sein. Im Gegensatz zum Array können wir in der verketteten Liste Objekte in der Mitte in O (1) Extraraum und O (1) Zeit einfügen. Daher kann der Merge-Vorgang der Merge-Sortierung ohne zusätzlichen Platz für verknüpfte Listen implementiert werden. In Arrays können wir wahlfreien Zugriff machen, da Elemente im Speicher kontinuierlich sind. Nehmen wir an, wir haben ein Integer-Array (4-Byte), und die Adresse von A0 sei dann x, um auf Ai zuzugreifen, können wir direkt auf den Speicher (xi4) zugreifen. Im Gegensatz zu Arrays, können wir nicht tun, random access in verketteten Liste. Schnelles Sortieren erfordert eine Menge dieser Art von Zugriff. In verketteter Liste auf ith Index zugreifen, müssen wir jeden Knoten vom Kopf zum ithten Knoten reisen, da wir keinen durchgängigen Speicherblock haben. Daher erhöht sich der Overhead für schnelle Sortierung. Merge-Sortierung greift auf Daten sequentiell zu und die Notwendigkeit eines zufälligen Zugriffs ist niedrig. Merge Sort Like QuickSort. Merge Sortieren ist ein Divide - und Conquer-Algorithmus. Es teilt Eingangs-Array in zwei Hälften, ruft sich für die beiden Hälften und vereinigt dann die beiden sortierten Hälften. Die merge () - Funktion wird verwendet, um zwei Hälften zusammenzuführen. Der Merge (arr, l, m, r) ist ein Schlüsselprozess, der annimmt, dass arrl..m und arrm1..r sortiert werden und die zwei sortierten Sub-Arrays zu einem zusammenführen. Siehe C-Implementierung für Details. Das folgende Diagramm aus wikipedia zeigt den kompletten Merge-Sortierprozess für ein Beispiel-Array. Wenn wir uns das Diagramm genauer ansehen, können wir sehen, dass das Array rekursiv in zwei Hälften geteilt wird, bis die Größe 1 ist. Sobald die Größe 1 ist, kommen die Merge-Prozesse in Aktion und beginnen, Arrays zurück zu verschmelzen, bis das gesamte Array vorliegt Zusammengeführt. Zeitkomplexität: Sortierfelder auf verschiedenen Maschinen. Merge Sort ist ein rekursiver Algorithmus, und die Zeitkomplexität kann als folgende Rekursionsrelation ausgedrückt werden. T (n) 2T (n2) Das obige Rezidiv kann entweder mit dem Recurrence-Tree-Verfahren oder dem Master-Verfahren gelöst werden. Es fällt in Fall II der Master-Methode und Lösung des Rezidivs ist. Die Zeitkomplexität von Merge Sort ist in allen 3 Fällen (schlechteste, durchschnittliche und beste), da merge sort immer das Array in zwei Hälften teilt und lineare Zeit zum Zusammenführen von zwei Hälften nimmt. Algorithmisches Paradigma: Teilung und Eroberung Sortierung an Ort und Stelle: Nein in einer typischen Implementierung Anwendungen von Merge Sort Merge Sort ist nützlich, um verkettete Listen in O (nLogn) Zeit zu sortieren. Bei verketteten Listen unterscheidet sich der Fall vor allem durch die unterschiedliche Speicherzuteilung Von Arrays und verknüpften Listen. Im Gegensatz zu Arrays können verknüpfte Listenknoten nicht im Speicher benachbart sein. Im Gegensatz zum Array können wir in der verketteten Liste Objekte in der Mitte in O (1) Extraraum und O (1) Zeit einfügen. Daher kann der Merge-Vorgang der Merge-Sortierung ohne zusätzlichen Platz für verknüpfte Listen implementiert werden. In Arrays können wir wahlfreien Zugriff machen, da Elemente im Speicher kontinuierlich sind. Nehmen wir an, wir haben ein ganzzahliges (4-Byte) Array A und lassen uns die Adresse von A0 x dann auf Ai zugreifen, wir können direkt auf den Speicher (x i4) zugreifen. Im Gegensatz zu Arrays, können wir nicht tun, random access in verketteten Liste. Schnelles Sortieren erfordert eine Menge dieser Art von Zugriff. In verketteter Liste auf ith Index zugreifen, müssen wir jeden Knoten vom Kopf zum ithten Knoten reisen, da wir keinen durchgängigen Speicherblock haben. Daher erhöht sich der Overhead für schnelle Sortierung. Merge-Sortierung greift auf Daten nacheinander zu und die Notwendigkeit eines zufälligen Zugriffs ist gering. Inversionszähler Problem bei der externen Sortierung


No comments:

Post a Comment