Algorithmusgymnastik 3

Search Rotated Array Ein sortiertes Array, das um eine beliebige Zahl nach rechts gedreht wurde, und die angegebene Zahl (Schlüssel) werden übergeben und durchsucht.

Erläuterung

Findet die angegebene Nummer (Schlüssel) in einem sortierten Array, das um eine beliebige Nummer gedreht wurde. Gibt -1 zurück, wenn der Schlüssel nicht vorhanden ist. Angenommen, das Array enthält keine Duplikate. Unten ist das ursprüngliche Array vor der Drehung. Screen Shot 2019-12-17 at 15.15.54.png Wenn Sie die Rotation 6 Mal in diesem Array ausführen, ändert sich dies wie folgt. Screen Shot 2019-12-17 at 15.18.04.png

Bedingungen

  1. Die lineare Suche O (n) ist eine inakzeptable Lösung.
  2. Betrachten Sie die geänderte binäre Suche.

Solution Runtime Complexity O(logn) Ich verwende die binäre Suche. Memory Complexity O(logn). Für jede Schleife wird das übergebene Array halbiert und nur eines durchsucht.

Kommentar

Die Lösung ist im Grunde binäre Suche, aber mit einigen Korrekturen. Wenn Sie sich das Beispielarray genau ansehen, sehen Sie, dass immer mindestens die Hälfte des Arrays sortiert ist. Nutzen Sie diese Funktion. Wenn sich die gesuchte Nummer n in der sortierten Hälfte des Arrays befindet, können Sie sie mit der binären Suche finden. Andernfalls verwerfen Sie die sortierten Hälften und untersuchen Sie die unsortierten Hälften weiter. Dies teilt das Array bei jedem Schritt in zwei Hälften, wodurch die Laufzeitkomplexität O (logn) wird. Es gibt einige bedingte Teile des Codes, die etwas schwer zu lesen sind. Unter vier Bedingungen

  1. Wenn das SubArray im Bereich von Start bis Mitte in zwei Hälften geschnitten ** sortiert ** ist und der gesuchte Schlüssel in diesem Bereich vorhanden ist.
  2. Wenn das SubArray im Bereich von Mitte bis Ende halbiert ** sortiert ** ist und der gesuchte Schlüssel in diesem Bereich vorhanden ist.
  3. Wenn das SubArray im Bereich von Start ~ Mid Cut in zwei Hälften nicht ** sortiert ** ist und der gesuchte Schlüssel in diesem Bereich vorhanden ist.
  4. Wenn das SubArray im Bereich von Mitte bis Ende, das in zwei Hälften geschnitten wird, nicht ** sortiert ** ist und der gesuchte Schlüssel in diesem Bereich vorhanden ist. Die Bedingungen sind als solche unterteilt.

Implementierung

Screen Shot 2019-12-17 at 16.05.32.png

Prüfung

Screen Shot 2019-12-17 at 16.07.05.png

Ausgabe

Screen Shot 2019-12-17 at 16.09.54.png

Recommended Posts

Algorithmusgymnastik 12
Algorithmusgymnastik 10
Algorithmusgymnastik 3
Algorithmusgymnastik 9
Algorithmusgymnastik 14
Algorithmusgymnastik 2
Algorithmusgymnastik 7
Algorithmus Gymnastik 15
Algorithmus Gymnastik 16
Algorithmusgymnastik 8
Algorithmus Gymnastik 17
Algorithmus Gymnastik 18
Algorithmusgymnastik 11
Algorithmusübung 5
Algorithmusgymnastik 4
Algorithmus Gymnastik 24 Teilmengen
Algorithmus Gymnastik 23 Zusammenführungsintervalle
Algorithmus Gymnastik 20 Duplikate entfernen
Algorithmus Gymnastik 21 LinkedList-Zyklus
Algorithmus Gymnastik 24 Zyklische Sortierung
Algorithmus Gymnastik 19 No-Repeat-Teilzeichenfolge
Algorithmusübung 6
Algorithmus Gymnastik 24 Eine verknüpfte Liste umkehren
Python-Algorithmus
Algorithmusübungen 13
Algorithmus Gymnastik 20 Paar mit Zielsumme
Algorithmusgymnastik 22 Quadrieren eines sortierten Arrays
Algorithmus Gymnastik 24 Mitte der verknüpften Liste
Python-Memorandum (Algorithmus)
Wörterbuch-Lernalgorithmus
String-Suchalgorithmus