Golang Go语言中请教一个 leetcode 上的内存消耗问题
https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
这道题两种解法, 第一种使用额外的数组来保存, 第二种直接在原始数组上存储:
func findDisappearedNumbers1(nums []int) (res []int) {
x := make([]int, len(nums))
for _, num := range nums {
x[num-1] = num
}
for i, n := range x {
if n == 0 {
res = append(res, i+1)
}
}
return
}
func findDisappearedNumbers2(nums []int) (res []int) {
l := len(nums)
for _, num := range nums {
nums[(num-1)%l] += l
}
for i, n := range nums {
if n <= l {
res = append(res, i+1)
}
}
return
}
按理说, 第二种使用的内存会低一些, 使用 go benchmem 也可以看到 第一种 3 allocs/op, 第二种 2 allocs/op:
goos: windows
goarch: amd64
cpu: AMD Ryzen 5 5600X 6-Core Processor
Benchmark1-12 20885110 57.44 ns/op 88 B/op 3 allocs/op
Benchmark2-12 21033442 58.17 ns/op 24 B/op 2 allocs/op
但是在 leetcode 上提交的结果却是第一种消耗的内存更低些, 这是为什么呢?
Golang Go语言中请教一个 leetcode 上的内存消耗问题
更多关于Golang Go语言中请教一个 leetcode 上的内存消耗问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
看 leetcode 的耗时和内存没意义,时间空间复杂度是对的就行吧
更多关于Golang Go语言中请教一个 leetcode 上的内存消耗问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
#1 懂了,谢谢大佬
leetcode 的耗时和内存仅在对比的时候有点用,有些时候题目还会加强数据集或者升级版本,都会导致性能有差距
在LeetCode上使用Go语言解决算法问题时,内存消耗的优化通常涉及多个方面,包括但不限于数据结构的选择、算法逻辑的改进以及内存管理的精细控制。以下是一些建议,帮助你减少内存消耗:
-
选择合适的数据结构:
- 优先使用内存占用较小的数据结构,例如使用切片(slice)而不是数组(array),因为切片在动态扩展时更加高效。
- 对于需要频繁查找的场景,考虑使用哈希表(map)来替代链表或数组,以降低时间复杂度并间接减少内存使用(因为减少了不必要的遍历)。
-
优化算法逻辑:
- 尝试减少不必要的变量和中间结果的存储。
- 利用原地算法(in-place algorithm)来减少额外的空间开销。
- 分析算法的时间复杂度和空间复杂度,寻找更优的解法。
-
精细控制内存管理:
- 避免内存泄漏,及时释放不再使用的资源。
- 在处理大数据集时,考虑使用流式处理或分批处理来减少内存占用。
- 使用Go的内置函数(如
copy
)来高效地复制切片,避免不必要的内存分配。
-
利用Go的特性:
- Go的编译器和运行时已经做了很多内存管理的优化,但你可以通过了解Go的内存模型来更好地编写高效的代码。
- 使用Go的
sync
包中的数据结构(如sync.Map
)来在多线程环境中安全地共享数据,同时减少内存开销。
总之,优化内存消耗需要综合考虑数据结构、算法逻辑和内存管理等多个方面。希望这些建议能对你有所帮助!