【发布时间】:2023-03-11 07:39:01
【问题描述】:
对于 Advent of Code 中的第一个问题,我有两个解决方案。第一个解决方案 (p1) 的时间复杂度为 O(n)。 O(n^2) 的第二个 (p2)。但是为什么第二个更快呢?
https://adventofcode.com/2020/day/1
基准P1 12684 92239 ns/op BenchmarkP2 3161 90705 ns/op
//O(n)
func p1(value int) (int, int){
m := make(map[int]int)
f, err := os.Open("nums.txt")
printError(err)
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
intVar, err := strconv.Atoi(scanner.Text())
printError(err)
m[intVar]=intVar
}
for _, key := range m {
l, ok := m[value-key]
if ok {
return l, key
}
}
return 0, 0
}
//O(n^2)
func p2(value int) (int, int){
var data []int
f, err := os.Open("nums.txt")
printError(err)
defer f.Close()
scanner := bufio.NewScanner(f)
for scanner.Scan() {
intVar, err := strconv.Atoi(scanner.Text())
printError(err)
data= append(data, intVar)
}
for ki, i := range data {
for kj, j := range data {
if ki != kj && i+j == value {
return i , j
}
}
}
return 0, 0
}
【问题讨论】:
-
代码中n对应什么?
-
输入有多大?对于小输入,O(n2) 可能比 O(n) 快。 Big-O 表示法只描述了渐近复杂度(即当 n 很大时)。
-
@mkrieger1 到搜索循环。对于这两个函数,最后一个循环
-
@jub0bs 我已经用 200 个值和 400 个值对其进行了测试
-
@jub0bs 啊,在 800 它交换。我认为 200 个值就足够了,但显然不是。谢谢