如何基于旧数组拆分新数组?寻求Go语言实现优化方案
优化Go语言拆分ID数组的实现方案
问题背景
给定两个数组oldIDs(已存在的ID集合)和newIDs(待拆分的ID集合),需要将newIDs拆分为两组:一组是存在于oldIDs中的ID,另一组是不存在的新ID。示例如下:
// 示例1 oldIDs = [1, 2] newIDs = [2, 3, 4] // 拆分结果:[[2], [3,4]] 或两个独立数组 [2]、[3,4] // 示例2 oldIDs = [1, 2, 4] newIDs = [2, 3, 4] // 拆分结果:[[2, 4], [3]]
现有实现代码存在效率瓶颈:每次判断ID是否存在时都要遍历oldIDs,时间复杂度为O(m*n),当oldIDs元素较多时性能会明显下降。
优化实现方案
通过将oldIDs转换为哈希表(map),可以将查找操作的时间复杂度降至O(1),整体时间复杂度优化为O(m + n),同时简化判断逻辑:
方案1:返回两个独立数组
func splitIDs(oldIDs []int64, newIDs []int64) (existingIDs []int64, newIDsOnly []int64) { // 用map存储旧ID,空结构体不占用额外内存 oldIDMap := make(map[int64]struct{}, len(oldIDs)) for _, id := range oldIDs { oldIDMap[id] = struct{}{} } for _, id := range newIDs { if _, exists := oldIDMap[id]; exists { existingIDs = append(existingIDs, id) } else { newIDsOnly = append(newIDsOnly, id) } } return }
方案2:返回二维数组
如果需要直接返回题目示例中的二维数组格式,可调整如下:
func splitIDsTo2D(oldIDs []int64, newIDs []int64) [][]int64 { oldIDMap := make(map[int64]struct{}, len(oldIDs)) for _, id := range oldIDs { oldIDMap[id] = struct{}{} } var existing, newOnly []int64 for _, id := range newIDs { if _, exists := oldIDMap[id]; exists { existing = append(existing, id) } else { newOnly = append(newOnly, id) } } return [][]int64{existing, newOnly} }
优化点说明
- 效率提升:将
oldIDs转为map后,每个ID的存在性判断从O(n)变为O(1),避免了原代码中重复遍历oldIDs的冗余操作 - 内存优化:使用
map[int64]struct{}而非map[int64]bool,空结构体不占用内存空间,更节省资源 - 语义清晰:变量名改为
existingIDs和newIDsOnly,比原代码的arr1、arr2更具可读性 - 逻辑简化:每个ID仅做一次存在性判断,原代码中对同一个ID执行了两次
contains调用,优化后减少了一半的查找操作
内容的提问来源于stack exchange,提问作者Rza
相关产品推荐
相关产品推荐

