Heim > Backend-Entwicklung > Golang > Wie kann bufio.Scanner und optimierte Nummernkonvertierung das Scannen von Eingaben in Go-Programmen beschleunigen?

Wie kann bufio.Scanner und optimierte Nummernkonvertierung das Scannen von Eingaben in Go-Programmen beschleunigen?

Linda Hamilton
Freigeben: 2024-12-17 17:43:11
Original
264 Leute haben es durchsucht

How Can bufio.Scanner and Optimized Number Conversion Speed Up Input Scanning in Go Programs?

Verbesserung der Eingabescangeschwindigkeit für eine schnellere Programmausführung

Problembeschreibung

Der angegebene Code versucht um ein SPOJ-Problem zu lösen, indem man eine Liste von Zahlen durchläuft und ermittelt, ob jede Zahl durch eine Konstante k teilbar ist. Allerdings tritt bei der Ausführung eine Zeitüberschreitung auf, da das Scannen der Eingaben als langsam empfunden wird.

Lösung

Verwendung von bufio.Scanner

Zur Verbesserung Um die Effizienz des Eingabescannens zu verbessern, können wir den bufio.Scanner nutzen, der auf die schnelle zeilenweise Eingabeverarbeitung zugeschnitten ist. Anstelle des standardmäßigen fmt.Scan verwenden wir bufio.Scanner, um Eingabezeilen abzurufen.

Zahlenkonvertierung optimieren

Zur verbesserten Zahlenkonvertierung führen wir toInt() ein Funktion, die Zahlen direkt aus rohen Eingabebytes extrahiert. Dies vermeidet die langsamere Konvertierungsmethode von Scanner.Text() und eliminiert unnötige String-Erstellung.

toInt() erreicht dies, indem es die Eingabebytes durchläuft und das Ergebnis schrittweise mit 10 multipliziert. Die Bytes entsprechen dem UTF- 8 codierte Folge der Dezimaldarstellung der Zahl.

Code Snippet

Das überarbeitete Code-Snippet unten enthält die folgenden Optimierungen:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    var n, k, c int
    scanner := bufio.NewScanner(os.Stdin)

    scanner.Scan()
    fmt.Sscanf(scanner.Text(), "%d %d", &n, &k)

    for ;n > 0; n-- {
        scanner.Scan()
        if toInt(scanner.Bytes())%k == 0 {
            c++
        }
    }

    fmt.Println(c)
}

func toInt(buf []byte) (n int) {
    for _, v := range buf {
        n = n*10 + int(v-'0')
    }
    return
}
Nach dem Login kopieren

Zusätzliche Hinweise

Diese optimierte Lösung zeigt eine deutliche Verbesserung in Ausführungsgeschwindigkeit im Vergleich zu früheren Methoden. Es wird eine gültige Eingabe vorausgesetzt, einschließlich des Vorhandenseins von n Zeilen nach der ersten Eingabe.

Für Szenarien mit geschlossenen Eingaben kann eine vereinfachte for-Schleife verwendet werden:

for scanner.Scan() {
    if toInt(scanner.Bytes())%k == 0 {
        c++
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann bufio.Scanner und optimierte Nummernkonvertierung das Scannen von Eingaben in Go-Programmen beschleunigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage