プログラムの実行を高速化するための入力スキャン速度の向上
問題ステートメント
指定されたコードの試行数値のリストを反復処理し、各数値が次のとおりであるかどうかを判断することで、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 サイトの他の関連記事を参照してください。