Golang 高效的原地数组去重


本文摘自网络,作者,侵删。

非排序数组

使用 struct{} 节省空间, 指定 cap=len(arr) 避免 map 扩容。记录非重复元素索引 j,将元素前移,原地去重,只需一次遍历。

时间复杂度:O(n)
空间复杂度:O(n)

func removeDuplication_map(arr []string) []string {
    set := make(map[string]struct{}, len(arr))
    j := 0
    for _, v := range arr {
        _, ok := set[v]
        if ok {
            continue
        }
        set[v] = struct{}{}
        arr[j] = v
        j++
    }

    return arr[:j]
}

已排序数组

时间复杂度:O(n)
空间复杂度:O(1)

func removeDuplication_sort(arr []string) []string {
    length := len(arr)
    if length == 0 {
        return arr
    }

    j := 0
    for i := 1; i < length; i++ {
        if arr[i] != arr[j] {
            j++
            if j < i {
                swap(arr, i, j)
            }
        }
    }

    return arr[:j+1]
}

func swap(arr []string, a, b int) {
   arr[a], arr[b] = arr[b], arr[a]
}

完整代码及测试:https://github.com/win5do/pla...

Reference

Idiomatic way to remove duplicates in a slice : golang (reddit.com)

SliceTricks · golang/go Wiki (github.com)


本文来自:Segmentfault

感谢作者:无风

查看原文:Golang 高效的原地数组去重

相关阅读 >>

Go语言学习(四):数组和切片

新手入门Golang开发的注意事项

Go - httpclient 常用操作

Golang 引用和指针的区别

关于处理电商系统订单状态的流转,分享下我的技术方案(附带源码)

Go语言有什么缺点

面试题:让你捉摸不透的 Go reslice

Go语言 break 语句

10天入门Go语言教程- 常量变量

为什么我们从 docker 转向了 Go

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...