ホームページ > バックエンド開発 > Golang > bufio.Scanner と最適化された数値変換はどのようにして Go プログラムの入力スキャンを高速化できるのでしょうか?

bufio.Scanner と最適化された数値変換はどのようにして Go プログラムの入力スキャンを高速化できるのでしょうか?

Linda Hamilton
リリース: 2024-12-17 17:43:11
オリジナル
267 人が閲覧しました

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

プログラムの実行を高速化するための入力スキャン速度の向上

問題ステートメント

指定されたコードの試行数値のリストを反復処理し、各数値が次のとおりであるかどうかを判断することで、SPOJ 問題を解決します。定数 k で割り切れます。ただし、入力スキャンが遅いと認識されるため、実行がタイムアウトします。

解決策

bufio.Scanner を利用する

強化するには入力スキャンの効率を高めるには、高速なラインごとに調整された bufio.Scanner を活用できます。入力処理。デフォルトの fmt.Scan の代わりに、bufio.Scanner を使用して入力行を取得します。

数値変換の最適化

数値変換を改善するために、toInt() を導入します。生の入力バイトから数値を直接抽出する関数。これにより、Scanner.Text() の遅い変換方法が回避され、不必要な文字列の作成が排除されます。

toInt() は、入力バイトを反復処理し、結果を段階的に 10 倍することでこれを実現します。バイトは UTF- 8 数値の 10 進表現のエンコードされたシーケンス。

コードスニペット

以下の改訂されたコード スニペットには、次の最適化が組み込まれています。

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
}
ログイン後にコピー

追加メモ

この最適化されたソリューションは、次の最適化を示しています。以前の方法と比較した実行速度。最初の入力の後の n 行の存在を含む、有効な入力を前提としています。

閉じた入力を含むシナリオでは、簡略化された for ループを使用できます。

for scanner.Scan() {
    if toInt(scanner.Bytes())%k == 0 {
        c++
    }
}
ログイン後にコピー

以上がbufio.Scanner と最適化された数値変換はどのようにして Go プログラムの入力スキャンを高速化できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート