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?

Dec 17, 2024 pm 05:43 PM

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!

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

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Was ist der Unterschied zwischen Unterstrich und ohne Unterstrich?

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren? Mar 03, 2025 pm 05:22 PM

Wie kann ich kurzfristige Informationsübertragung zwischen Seiten im BeEGO-Framework implementieren?

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go? Mar 10, 2025 pm 05:38 PM

Wie schreibe ich Scheinobjekte und Stubs zum Testen in Go?

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen? Mar 10, 2025 pm 05:36 PM

Wie kann ich Tracing -Tools verwenden, um den Ausführungsfluss meiner GO -Anwendungen zu verstehen?

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache? Mar 03, 2025 pm 05:18 PM

Wie konvertieren Sie die Liste der MySQL -Abfrageergebnisse in eine benutzerdefinierte Struktur -Slice in Go -Sprache?

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren? Mar 10, 2025 pm 03:20 PM

Wie kann ich benutzerdefinierte Typ -Einschränkungen für Generika in Go definieren?

Wie schreibe ich Dateien in Go Language bequem? Wie schreibe ich Dateien in Go Language bequem? Mar 03, 2025 pm 05:15 PM

Wie schreibe ich Dateien in Go Language bequem?

Wie schreibe ich Benchmarks, die die reale Leistung in Go genau widerspiegeln? Wie schreibe ich Benchmarks, die die reale Leistung in Go genau widerspiegeln? Mar 10, 2025 pm 05:36 PM

Wie schreibe ich Benchmarks, die die reale Leistung in Go genau widerspiegeln?

See all articles