![](https://img-blog.csdnimg.cn/20190905110246213.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
go数据结构
用Go语言实现的数据结构与算法
参考:liuyubobobo老师《玩转数据结构》
哥斯拉啊啊啊哦
这个作者很懒,什么都没留下…
展开
-
(1)Go实现栈和leetcode-20解答
栈是一种线性结构,遵循先进后出的原则在操作上类似数组的子集只能从一端添加元素,也只能从一端取出元素这一端成为栈顶应用地方:撤销操作,程序调用的系统栈,括号匹配等等// 栈类定义和操作方法的实现package stackimport ( "github.com/pkg/errors")type arrayStack []interface{}func NewArray...原创 2019-09-01 09:30:56 · 103 阅读 · 0 评论 -
(16)Go实现的trie解答leetcode-208
实现代码type Trie struct { isWord bool next map[rune]*Trie }/** Initialize your data structure here. */func Constructor() Trie { return Trie{ isWord:false, next: make(map[r...原创 2019-09-04 14:45:57 · 60 阅读 · 0 评论 -
(17)Go实现的trie解答leetcode-211
用数组实现的trie来解决type WordDictionary struct { isWord bool next [26]*WordDictionary}func Constructor() WordDictionary { return WordDictionary{ isWord:false, next:[26]*WordDiction...原创 2019-09-04 14:46:40 · 76 阅读 · 0 评论 -
(18)Go实现的trie解答leetcode-677
用数组trie解决type MapSum struct { value int next [26]*MapSum}func Constructor() MapSum { return MapSum{}}func (this *MapSum) Insert(key string, val int) { if len(key) == 0 { return } for...原创 2019-09-04 14:47:15 · 78 阅读 · 0 评论 -
(19)Go实现并查集
并查集Union find,用来表示网络节点之间是否连接的集合。这里的网络是一抽抽象的概念,不仅包括互联网,人与人形成的网络,道路之间形成的网络,迷宫网络等等。数据存储格式如下1)i 为节点索引, set[i] 为所属集合,若两个索引所属集合相同,表示这两节点相连2)跟传统树结构不同的是,并查集是一种子节点指向父节点的数据结构对并查集来说,主要支持两个动作:1)union(p,q) ...原创 2019-09-04 14:51:15 · 650 阅读 · 0 评论 -
(20)Go实现并查集-路径压缩
如上图,这3种树结构效果都是一样的,但是时间复杂度却不相同优化思路如上图(5)第五版union find特点:在第四版的基础上加入路径压缩压缩功能,每次在寻找父节点时,让该节点指向父节点的父节点,能达到上图效果,这个时候rank代表的不再是高度,更像是一种优先级,让优先级别低的指向优先级高的。// 实现type unionSet struct { rank []int // ...原创 2019-09-04 14:53:07 · 517 阅读 · 0 评论 -
(21)Go实现AVL树-算法解析
了解avltree树之前先了解几个概念 //1)什么是二分搜索树;2)什么是平衡树;3)什么自平衡二分搜索树;1)二分搜索树以及缺陷 //如上图,是一颗二分搜索树,从添加查找节点,时间复杂度均为O(h),但在极端情况下,如按顺序向一个空二分搜索树中添加0,1,2,3,4,二分搜索数会退化为单链,这时候时间时间复杂度会变成O(n),如下图,为了避免这种情况需要结合平衡树做改进...原创 2019-09-04 14:54:25 · 171 阅读 · 0 评论 -
(22)Go实现AVL树-实现和测试
继上一篇 《(21)Go实现AVL树-算法解析》 的后续https://www.jianshu.com/p/943243f5ee1eAVL树的定义和实现type node struct { key int value int height int left *node right *node}type avlTree struct { size int Ro...原创 2019-09-04 14:56:04 · 287 阅读 · 2 评论 -
(23)Go实现红黑树-算法解析
红黑树,叫red black tree/2b tree,了解红黑树之前,先了解下2-3树,2-3树容易理解且和红黑树有某种等价性,了解2-3树有助于了解红黑树 //如以上图过程: //1)每次插入新节点时,都是先找到要插入的最后节点,与最后节点相融合;2)融合后如果是3节点,则后续不变;3)融合后如果是4节点,则分裂一棵子树,并将其父节点向上一级融合,直到根节点为止2-3树和...原创 2019-09-04 14:56:35 · 297 阅读 · 0 评论 -
(24)Go实现红黑树-实现和总结
继上一篇《(23)Go实现红黑树-算法解析》的后续:https://www.jianshu.com/p/8c41d1e52c32红黑树的定义和实现const ( Red = true Black = false)type node struct { key int value int color bool left *node right *node}ty...原创 2019-09-04 14:57:56 · 374 阅读 · 0 评论 -
(25)Go实现反向索引堆
普通堆(10)Go实现二叉堆-数组实现:https://www.jianshu.com/p/37bca5f2a6e9为什么要有索引堆?原因如下主要有以下两个:1)如上图,对于一组数据来说,经过堆整理后,数据的大多数索引都发生了变化,之后如果还想改变数组内的值,会找不到对应的数据,除非去遍历数组,不过这样太消耗资源2)如果这组数据中存储的是比较大的数据,如是1个10000字节长度的字符串...原创 2019-09-04 14:58:47 · 301 阅读 · 1 评论 -
(26)Go-什么是图,图怎么实现?
图主要分为4种:有向图,无向图,有权图,无权图,如下图示:以下图的一些特点:以下图的两种实现方式:邻接矩阵,邻接表接下一篇《(27)Go邻接矩阵和邻接表实现无权图》https://www.jianshu.com/p/ad9fed1836d9...原创 2019-09-04 14:59:21 · 400 阅读 · 0 评论 -
(27)Go邻接矩阵和邻接表实现无权图
上一篇《(26)Go-什么是图,图怎么实现?》后续:https://www.jianshu.com/p/e373ded1fd97邻接矩阵实现无权图 //// 稠密图 - 邻接矩阵type denseGraph struct { n int //节点数 m int //边数 directed bool //有向图 or 无向图 graph ...原创 2019-09-04 15:00:31 · 197 阅读 · 0 评论 -
(15)Go实现trie-字典树/前缀树
下面用2种分别用map和数组实现字典树:(方法1)map实现,用map实现的方法意义不大,还不如直接用map,主要是实现方法里面分为非递归和递归两种算法type trieNode struct { isWord bool // 是否是单词结尾 next map[rune]*trieNode}type trie struct { size int // 节点数量...原创 2019-09-04 14:44:59 · 698 阅读 · 0 评论 -
(14)Go实现的线段树解答leetcode-307
// 这类问题用线段树解决是比较好的选择 解决方法的定义:type NumArray struct { tree []int data []int}func Constructor(nums []int) NumArray { length := len(nums) if length==0{ return NumArray{} } tree := &...原创 2019-09-04 14:44:20 · 179 阅读 · 0 评论 -
(2)Go实现顺序队列
队列是一种线性结构只能从一端(队尾)添加元素,只能从另一端(队首)取出元素,属于先进先出的结构// 顺序队列的实现type queue interface{}type sliceQueue struct { queues []queue}func NewQueue() *sliceQueue { return &sliceQueue{}}func (i *sli...原创 2019-09-04 14:32:49 · 169 阅读 · 0 评论 -
(3)Go实现循环队列
队列的实现方法2,循环队列循环队列实现思路:1.循环队列须要几个參数来确定 front,tail,length,capacity front指向队列的第一个元素,tail指向队列最后一个元素的下一个位置 length表示当前队列的长度,capacity标示队列最多容纳的元素2.循环队列各个參数的含义(1)队列初始化时,front和tail值都为零(2)当队列不为空时,fron...原创 2019-09-04 14:33:24 · 605 阅读 · 0 评论 -
(4)Go实现单链表
链表(Linked list)是一种 “动态数据结构”,链表由节点构成node链接构成,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。相比数组,数组的内存地址是连续的,而链表不用连续的内存地址链表是动态数据结构,用链表组成的栈和队列数据结构,不用做扩容和缩容操作node 节点一般存储两个元素,本节点内容content和下一个节点指针next,结构如下type No...原创 2019-09-04 14:35:41 · 93 阅读 · 0 评论 -
(5)Go实现链表栈
链表在对头节点进行操作时,时间复杂度是O(1),因此用链表来实现栈是一种不错的方式// 链表的实现定义和栈的实现定义type node struct {Item interface{}Next *node}// 链表type linkedList struct {Length intDummyHead *node //虚拟头节点//end n...原创 2019-09-04 14:36:08 · 117 阅读 · 0 评论 -
(6)Go实现链表队列
用链表实现队列的思路如上图,这样插入和取出操作时间复杂度都是O(1)// 链表实现队列的方法定义type node struct { Item interface{} Next *node}type linkedListQueue struct { Length int head *node //头节点 tail *node //尾节点}func NewNode...原创 2019-09-04 14:37:10 · 438 阅读 · 1 评论 -
(7)Go实现二分搜索树-前中后序递归
上图是一种树数据结构,由n>=1个节点组成的有层次的关系集合,每个节点有0或多个子节点,没有父节点的节点称为跟节点root,有父节点但没有子节点的节点称为叶子节点。为什么要有树数据结构,因为树是一种天然的组织结构,具有高效的性质,在很多场景,数据采用树结构存储后,会更高效下面是树结构的一种实现类型:二分搜索树(1)二分搜索数存储的数值要有可比性(2)二分搜索树左子树的值都小于父节...原创 2019-09-04 14:38:35 · 131 阅读 · 0 评论 -
(8)Go实现二分搜索树-删除任意节点
https://blog.csdn.net/weixin_43456598/article/details/100538627继上一篇《Go–二分搜索树1–前中后序递归》的后续找出最小值,最大值,删除最小值,最大值,删除任意节点的非递归算法和递归算法实现// 找出最小值,并将该值返回,非递归算法func (tree *node) FindMinVal() *int { if tree.v...原创 2019-09-04 14:39:37 · 233 阅读 · 0 评论 -
(9)Go实现映射和集合
映射:Mapmap 是一种无序的键值对的集合。映射的key是不重复的,因此map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。map 是一种集合,所以我们可以像迭代数组和 slice 那样迭代它。不过,map 是无序的,我们无法决定它的返回顺序,这是因为 map 是使用 hash 表来实现的,hash算法看下面:《从头到尾彻底解析Hash表算法》https:...原创 2019-09-04 14:40:12 · 148 阅读 · 0 评论 -
(10)Go实现二叉堆-数组实现
二叉堆是树结构的一种,它满足以下性质:(1) 堆中任意节点的值总是不大于(不小于)其子节点的值;(2) 堆总是一棵完全树;(3) 节点和节点之间应具有某种可比性将任意节点不小于/不大于其子节点的堆叫做最大堆/最小堆,图示如下:二叉堆中添加元素的思路,最大堆为例(最大值在最上面):(1)将元素添加到堆最后,并根据其索引计算出父节点的索引;(2)比较父节点和该节点,该节点大于父节点...原创 2019-09-04 14:41:09 · 303 阅读 · 0 评论 -
(11)Go实现的最小堆求前K个最大值
在1,000,000个数字中,选出前100个最大的数字// 在n个元素中选出前m个元素// 如果用排序算法,最快时间 NlogN// 用最小二叉堆形式实现的优先队列,最快时间是 NlogM算法思路:(1)最小堆中每次取出来的值都是堆中的最小值,利用这个性质维护一个m个节点最小堆;(2)遍历一篇数组,每次取出来的值和最小堆中的最小值做对比,如果大于最小堆中的最小值,则和该最小值做替换;...原创 2019-09-04 14:41:53 · 479 阅读 · 0 评论 -
(12)Go实现的最小堆求前m个高频数字
算法思路:(1)创建map[int]int,k为数值中元素,v表示出现的次数,用map去重;(2)维护一个K个节点的最小堆,堆中存储k,v;(3)遍历map取出k,v,若v大于堆中最小v,则替换堆中最小的k,v;(4)之后取出堆中的k,则为前m个高频数字最小二叉堆的实现:type minHeap struct { size int nums [][2]int}func Ne...原创 2019-09-04 14:42:31 · 103 阅读 · 0 评论 -
(13)Go实现线段树-数组实现
线段树,也叫区间树,segmengt-tree,是一种长度不变的平衡树结构,父节点存储的结果是左右子节点的总计。以数组arrs求和为例子:1)每个父节点存储的都是所有子节点的总和2)所有叶子节点均为arrs的单个元素值如下图问:数组arrs有n个元素,依此创建的线段树需要由多少个节点?//答:需要4n的空间,解答如下图使用线段树时,不考虑添加元素,一般采用4n的静态空间即可...原创 2019-09-04 14:43:44 · 248 阅读 · 0 评论 -
(28)Go邻接矩阵和邻接表实现有权图
继上一篇《(27)Go实现邻接矩阵和邻接表无权图》后续:https://www.jianshu.com/p/ad9fed1836d9邻接矩阵实现有权图// 边类type Edge struct { a int //a节点 b int //b节点 weight float64 //权值}func newEdge(a, b int, weig...原创 2019-09-04 15:01:46 · 870 阅读 · 0 评论