首页 > 后端开发 > Golang > bufio.Scanner 和优化的数字转换如何加速 Go 程序中的输入扫描?

bufio.Scanner 和优化的数字转换如何加速 Go 程序中的输入扫描?

Linda Hamilton
发布: 2024-12-17 17:43:11
原创
264 人浏览过

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

提高输入扫描速度以加快程序执行速度

问题陈述

给定的代码尝试通过迭代数字列表并确定每个数字是否是来解决 SPOJ 问题可被常数 k 整除。然而,由于感知输入扫描速度较慢,执行超时。

解决方案

利用 bufio.Scanner

来增强输入扫描效率,我们可以利用bufio.Scanner,它是为高速逐行输入处理而定制的。我们使用 bufio.Scanner 来检索输入行,而不是默认的 fmt.Scan。

优化数字转换

为了改进数字转换,我们引入了 toInt()函数,它直接从原始输入字节中提取数字。这避免了 Scanner.Text() 的较慢转换方法,并消除了不必要的字符串创建。

toInt() 通过迭代输入字节并将结果逐渐乘以 10 来实现这一点。这些字节对应于 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)
}

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板