ホームページ >バックエンド開発 >Golang >タイムアウトを回避するために Go での入力スキャンを最適化するにはどうすればよいですか?

タイムアウトを回避するために Go での入力スキャンを最適化するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-17 17:04:10313ブラウズ

How Can I Optimize Input Scanning in Go to Avoid Timeouts?

実行を高速化するための入力スキャンの最適化

SPOJ の質問で発生するタイムアウトの問題に対処するには、入力スキャンを高速化するために特定の最適化が必要です。

LINE用bufio.Scannerの利用読み取り

fmt.Scan を単独で使用するのではなく、bufio.Scanner を活用して入力から行を効率的に読み取ります。

速度を高めるための数値変換のカスタマイズ

数値入力のみが予期されるため、カスタム数値コンバータを実装して生データから直接整数を抽出できます。バイト。これにより、不必要な文字列変換とオーバーヘッドが回避されるため、Scanner.Text を使用する場合に比べてパフォーマンスが大幅に向上します。

カスタム数値コンバータの実装

関数 toInt は、生のバイトを次の形式に変換するように設計されています。整数を効率的に変換します:

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

この関数は、数値の 1 対 1 マッピングを利用して、入力内の UTF-8 エンコードされたバイト。

洗練されたソリューション

これらの最適化を組み合わせると、改善されたソリューションは次のようになります:

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)
}

の利点最適化

この最適化されたソリューションにより、入力スキャン速度が大幅に向上し、プログラムが割り当てられた制限時間内に必要な入力を処理できるようになります。カスタム数値コンバーターと bufio.Scanner の使用により、実行時のオーバーヘッドが最小限に抑えられ、プログラムの効率が向上します。

以上がタイムアウトを回避するために Go での入力スキャンを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。