Schreiben Sie eine Dichotomie in Python

TL;DR

――Es ist ein grundlegender Punkt, aber um dies zu berücksichtigen, werde ich den Code für die Dichotomie in Python schreiben und die Erklärung zusammenfassen. ――Ich schreibe den Code selbst zum Lernen (ohne das Standardmodul für die Dichotomie zu verwenden). ―― Da ich ursprünglich Absolvent einer Schule im Bereich Design war, verzeihen Sie mir bitte alle intellektuell komplizierten Punkte im Bereich Informatik.

Was zu verwenden

Was ist eine Zweiteilung?

Die Dichotomie ist einer der Algorithmen zum Auffinden von Werten in einem sortierten Array. Wird auch als binäre Suche bezeichnet.

Die Bedingung ist, dass das Suchzielarray sortiert wurde, aber die Eigenschaft hat, dass die Suche weniger wahrscheinlich langsamer wird, selbst wenn die Zielliste größer als eine normale Suche wird.

Die Methode besteht darin, zuerst den Wert in der Mitte der Liste abzurufen und dann zu vergleichen, ob der Wert in der Mitte größer oder kleiner als der gesuchte Wert ist.

Wenn der zu durchsuchende Wert kleiner als der Mittelwert des Arrays ist, wird der Bereich des Arrays vom linken Rand bis zum Bereich vor dem Mittelpunkt eingegrenzt.

Wenn andererseits der zu durchsuchende Wert größer als der Mittelwert ist, wird der Bereich des Arrays vom Wert eins rechts vom Mittelwert bis zum rechten Ende des Arrays eingegrenzt.

Danach wird der Mittelwert im Bereich des eingegrenzten Arrays genommen, es wird erneut beurteilt, ob der zu durchsuchende Wert größer oder kleiner als der Mittelwert ist, und die Sequenz wird eingegrenzt.

Wenn der zu durchsuchende Wert mit dem Wert in der Mitte des Arrays übereinstimmt, bedeutet dies, dass der zu durchsuchende Wert gefunden wurde und die Suche dort endet.

Stellen Sie sich den Fall vor, in dem Sie in der sortierten Liste nach dem Wert "2" suchen [1, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8] ".

Holen Sie sich zuerst den Wert in die Mitte der Liste. Der erste zentrale Wert ist "4". Der zu suchende Wert "2" ist kleiner als der Mittelwert "4". Grenzen Sie daher die Liste links neben dem Teil "4" und den Wert "[1, 1, 2, 3, 3]" ein Zu

Holen Sie sich den Mittelwert erneut in die verengte Liste. Diesmal ist der Wert in der Mitte der Liste "2". Da dies nicht mit der "2" des Suchziels übereinstimmt, endet die Suche, wenn festgestellt wird, dass das Ziel vorhanden ist.

Vergleich der berechneten Reihenfolge mit der normalen Suche

Im normalen Suchvorgang wird die Suche durchgeführt, um festzustellen, ob sie von Anfang an in der richtigen Reihenfolge übereinstimmen. Die Berechnungsreihenfolge lautet $ O (n) $ (wenn jedoch der zu durchsuchende Wert zu Beginn vorhanden ist, ist er geringer). Je größer die Anzahl der Sequenzen ($ n $) ist, desto länger ist die lineare Verarbeitungszeit. Es wird werden.

Andererseits ist im Fall einer dichotomen Suche die Berechnungsreihenfolge $ O (log_2 n) $. Selbst wenn die Größe des Arrays groß wird, wird die Verarbeitungszeit aufgebläht.

Wann kann es verwendet werden?

Eine dichotome Suche ist zwar schneller als eine normale Suche, kann jedoch nur mit einem sortierten Array für eine dichotome Suche verwendet werden (sofern sie nicht sortiert ist, ist die Größenbeziehung beim Aufteilen des Arrays seltsam. ).

Daher sind in dem Fall, in dem das Suchzielarray nicht sortiert ist und die Suche nur einmal ausgeführt wird, die Berechnungskosten für die Sortierung höher als die für die normale Suche, und der Vorteil der Verwendung der Dichotomie ist Da ist gar nichts.

Wenn andererseits das Array bereits sortiert wurde oder wenn der Suchvorgang viele Male wiederholt wird, können die Berechnungskosten durch Verwendung der Dichotomie niedriger gehalten werden, selbst wenn die Sortierung ausgeführt wird.

Schreiben Sie es selbst in Python

Sie können die Dichotomie sowohl für eine Liste von Zeichen als auch für einen numerischen Wert verwenden. Dieses Mal werden wir jedoch als Beispiel mit einer Liste fortfahren, in der Ganzzahlen gespeichert sind.

Anstatt zu steuern, ob der Index des Suchergebnisses zurückgegeben wird, prüfen wir einfach, ob die Liste Werte enthält.

from typing import List

list_value: List[int] = [
    100, 23, 33, 51, 70, 32, 34, 13, 3, 79, 8, 12, 16, 134, 83]
sorted_list: List[int] = sorted(list_value)



def binary_search(sorted_list: List[int], search_value: int) -> bool:
    """
Führen Sie eine Dichotomie durch, um festzustellen, ob der gesuchte Wert in der Liste enthalten ist
Holen Sie sich den booleschen Wert.

    Parameters
    ----------
    sorted_list : list of int
Eine Liste mit sortierten Ganzzahlwerten.
    search_value : int
Der zu durchsuchende Wert.

    Returns
    -------
    value_exists : bool
Gibt an, ob der Wert in der Liste enthalten ist.
    """
    left_index: int = 0
    right_index: int = len(sorted_list) - 1
    while left_index <= right_index:
        middle_index: int = (left_index + right_index) // 2
        middle_value: int = sorted_list[middle_index]

        if search_value < middle_value:
            right_index = middle_index - 1
            continue
        if search_value > middle_value:
            left_index = middle_index + 1
            continue

        return True

    return False

Ich werde den Code der Reihe nach berühren.

Zunächst muss in der Dichotomie die Zielliste sortiert werden, damit die sortierte Funktion zum Sortieren der Liste verwendet wird (die Sortiermethode usw. ändert sich nicht).

list_value: List[int] = [
    100, 23, 33, 51, 70, 32, 34, 13, 3, 79, 8, 12, 16, 134, 83]
sorted_list: List[int] = sorted(list_value)

Als nächstes folgt die Verarbeitung der Dichotomiefunktion.

    left_index: int = 0
    right_index: int = len(sorted_list) - 1

Variablen für die Behandlung des Indexbereichs der Zielliste werden als left_index und right_index festgelegt. Der Index ganz links in der Liste ist left_index und der Index ganz rechts ist right_index. Diese Werte werden jedes Mal einseitig aktualisiert, wenn sie halbiert werden, bis die Schleife die Suche beendet.

    while left_index <= right_index:

Der Teilungsvorgang wird wiederholt in einer while-Schleife ausgeführt. Diese Schleife wird wiederholt, solange sich der Index ganz links links vom Index ganz rechts befindet oder denselben Intex hat. Befindet es sich rechts neben dem Index am rechten Ende, ist der Bereich der Zielliste verschwunden (alle Ziele wurden durchsucht), sodass die Schleife beendet wird und beurteilt wird, dass das Ziel nicht gefunden wurde. ..

        middle_index: int = (left_index + right_index) // 2
        middle_value: int = sorted_list[middle_index]

Middle_index in der Schleife speichert den Mittelwert im Zielarraybereich. Teilen Sie durch 2 durch // 2 und schneiden Sie den Bruch ab (//verhält sich zusätzlich zur Division wie ein Boden).

Es bezieht sich auch auf diesen Index sowie auf den zentralen Index und setzt den zentralen Wert auf die Variable (middle_value).

        if search_value < middle_value:
            right_index = middle_index - 1
            continue

Wenn in der if-Anweisung der zu durchsuchende Wert kleiner als der Mittelwert ist, wird das Array nur in die linke Hälfte unterteilt, sodass der Index ganz rechts (right_index) links vom Mittelindex (middle_index --1") gesetzt wird. ).

        if search_value > middle_value:
            left_index = middle_index + 1
            continue

Wenn der zu durchsuchende Wert jedoch größer als der Mittelwert ist, passen Sie den Wert des Index ganz links (left_index) so an, dass das Array nur die rechte Hälfte ist.

        return True

Wenn der zu durchsuchende Wert weder kleiner noch größer als der Mittelwert ist, dh wenn er mit dem Mittelwert übereinstimmt, wird True zurückgegeben, da der zu durchsuchende Wert vorhanden ist.

    return False

Ich werde es tatsächlich ausführen. Versuchen Sie zunächst unter der Bedingung, dass das Ziel in der Liste vorhanden ist.

value_exists = binary_search(
    sorted_list=sorted_list,
    search_value=83)
print(value_exists)
True

True wird normal zurückgegeben. Geben Sie als Nächstes die Bedingungen an, unter denen das Suchziel nicht in der Liste enthalten ist.

value_exists = binary_search(
    sorted_list=sorted_list,
    search_value=84)
print(value_exists)
False

Dies ist erwartungsgemäß auch falsch.

Referenzen und Referenzseiten

Recommended Posts

Schreiben Sie eine Dichotomie in Python
Schreiben Sie eine Suche mit Tiefenpriorität in Python
Dichotomie mit Python
Binäre Suche in Python
Binäre Suche in Python / C ++
Algorithmus in Python (Dichotomie)
Schreiben Sie A * (A-Stern) -Algorithmen in Python
Erstellen Sie eine Binärdatei in Python
Schreiben Sie ein Kreisdiagramm in Python
Schreiben Sie das Vim-Plugin in Python
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Algorithmus in Python (ABC 146 C Dichotomie
Schreiben Sie eine kurze Eigenschaftsdefinition in Python
Schreiben Sie ein Caesar-Verschlüsselungsprogramm in Python
Schreiben Sie eine einfache Giermethode in Python
Schreiben Sie ein einfaches Vim-Plugin in Python 3
Schreiben Sie Python in MySQL
Memo zur Bisektionssuche (python2.7)
[Python] Bisection-Suche ABC155D
Lineare Suche in Python
Dichotomie mit Python
Dichotomie mit Python 3
Schreiben Sie Pandec-Filter in Python
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Schreiben Sie die Beta-Distribution in Python
Schreiben Sie Python in Rstudio (reticulate)
Erstellen Sie ein Lesezeichen in Python
Zeichne ein Herz in Python
Schreiben Sie ein super einfaches molekulardynamisches Programm in Python
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Schreiben Sie in Python ein logarithmisches Histogramm auf die x-Achse
Algorithmus in Python (Breitenprioritätssuche, bfs)
Wahrscheinlich in einer Nishiki-Schlange (Originaltitel: Vielleicht in Python)
Schreiben Sie einen tabellengesteuerten Test in C.
[Python] Verwalten Sie Funktionen in einer Liste
Drücken Sie einen Befehl in Python (Windows)
Schreiben Sie ein JSON-Schema mit Python DSL
Speichern Sie die Binärdatei in Python
Erstellen Sie einen DI-Container mit Python
Schreiben Sie einen HTTP / 2-Server in Python
Zeichnen Sie eine Streudiagrammmatrix mit Python
Schreiben Sie die AWS Lambda-Funktion in Python
ABC166 in Python A ~ C Problem
Algorithmus in Python (Tiefenprioritätssuche, dfs)
Schreiben Sie Selentestcode in Python
Löse ABC036 A ~ C mit Python
Implementierung eines einfachen Algorithmus in Python 2
Löse ABC037 A ~ C mit Python
Führen Sie einen einfachen Algorithmus in Python aus
Zeichnen Sie ein CNN-Diagramm in Python
Erstellen Sie eine zufällige Zeichenfolge in Python
Schreiben Sie einen C-Sprach-Unit-Test in Python
Suche nach Tiefenpriorität mit Stack in Python
Schreiben Sie ein Batch-Skript mit Python3.5 ~
Beim Schreiben eines Programms in Python