菠菜网

阳江海陵岛:golang实现常用聚集原理先容

时间:1个月前   阅读:28

golang自己对常用聚集的封装照样比较少的,主要有数组(切片)、(双向链表)、堆等。在工作中可能用到其他常用的聚集, 于是我自己对常用的聚集进行了封装[,【并对原理做了简朴先容】,代码库地址:https://github.com/chentaihan/container,<代码都是经由测试>的,迎接下载使用,反馈的问题【我会第一时间修复】

 

ArraySort排序数组

ArraySort「使用数组保留数据」,【『‘新增’』的时刻通过】类似二分查找找到插入位置,{插入位置后面的数据往后移动一位},【插入新元素】,查找(就是)二分查找,{{删除}}(就是)通过二分查找找到对应的元素,‘之后的元素都向前移’动一位。「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
『‘新增’』 O(n)
{{删除}} O(n)
查找 O(logn)

LinkList“单链表”

通过链表头指针和链表尾两个指针将所有元素链接在一起[,可以快速的在表头和表尾插入元素,{{删除}}和查找都是遍历链表,查找对应的元素,{{删除}}还需要改变指针指向。「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
『‘新增’』 O(1)
{{删除}} O(n)
查找 O(n)

Queue循环行列

(行列先进先出),循环行列接纳数组保留元素,以循环的方式在数组中添加元素,当数组写满之后自动扩容,元素个数小于1M时二倍扩容,大于即是1M时每次加1M,{{删除}}元素的时刻需要将对应的位置赋值为空指针,利便被{{删除}}的元素被接纳。「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
【(进行列)】 O(1)
出行列 O(1)

QueueLink链表行列

(行列先进先出),实现和“单链表”类似,〖进栈是在表尾添加元〗素,出栈(就是)表头出栈,即表头指向表头的下一个元素,‘相对数组实’现的循环行列,“链表行列不存在扩容的问题”,但每个元素多了一个指针。「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
【(进行列)】 O(1)
出行列 O(1)

PriorityQueue优先级行列

【优先级行列接纳小堆实现】,小堆接纳数组保留数据,根据完全二叉树的方式操作数据,每个节点的值都小于即是左右子节点的值,保证了每次出队的都是最小值,即根据顺序出队。

「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
【(进行列)】 O(logn)
出行列 O(logn)

Stack栈

栈先进后出,接纳数组保留元素,每次进栈的是栈顶元素, 出栈的也[是栈顶元素,当数组写满之后自动扩容,元素个数小于1M时二倍扩容,大于即是1M时每次加1M。「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
进栈 O(1)
出栈 O(1)

StackLink链表栈

(行列先进先出),接纳“单链表”保留数据,进栈是在表头添加元素,出栈(就是)表头出栈,即表头指向表头的下一个元素,‘相对数组实’现的循环行列,“链表行列不存在扩容的问题”,但每个元素多了一个指针。「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
进栈 O(1)
出栈 O(1)

Map

对golang的map简朴封装,〖增加了一些〗方式。对于golang中map的实现原理请看我的这篇文章:https://www.cnblogs.com/hlxs/p/10408961.html,「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
『‘新增’』 O(1)
「修改」 O(1)
“【查询】” O(1)
{{删除}} O(1)

MapSync同步map

(就是)map+读写锁,「【时间复杂度】」和map“一样”

LinkMap

(双向链表) + map,(双向链表)根据顺序保留『‘新增’』的元素,可以根据添加的顺序遍历数据,增删改查「【时间复杂度】」都和map“一样”

TreeMap

通过二叉搜索树保留数据,后面会详细先容二叉搜索树,使用二叉搜索树就不存在扩容的问题,hashmap则存在扩容的问题,「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
『‘新增’』 O(logn)
「修改」 O(logn)
“【查询】” O(logn)
{{删除}} O(logn)

LRU

lru的实现原理实在和LinkMap险些“一样”,只不过lru在「修改」或是“【查询】”的时刻都市将被接见的元素移到链表的表头, 表尾的数据是最先被镌汰的[,「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
『‘新增’』 O(1)
「修改」 O(1)
“【查询】” O(1)
{{删除}} O(1)

BinaryTree二叉搜索树

提供二叉搜索树的增删改查{《< 功效[>》},{{删除}}相对复杂点,「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
『‘新增’』 O(logn)
「修改」 O(logn)
“【查询】” O(logn)
{{删除}} O(logn)

heap“大堆”

「『堆是对』」golang自己container/heap“的简朴封装”,“大堆”中某个节点的值总是不大于其父节点的值;‘堆总是一棵完全二叉树’。,「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
『‘新增’』 O(logn)
“【查询】” O(n)
{{删除}} O(logn)

heap小堆

「『堆是对』」golang自己container/heap“的简朴封装”,<小堆中某个节点的值总是不小于其父节点的值>;‘堆总是一棵完全二叉树’。,「【时间复杂度】」如下:

{《< 功效[>》} 「【时间复杂度】」
『‘新增’』 O(logn)
“【查询】” O(n)
{{删除}} O(logn)

 

  <“项目地址”>:https://github.com/chentaihan/container <“项目地址”>:https://github.com/chentaihan/container <“项目地址”>:https://github.com/chentaihan/container,

阳光在线

阳光在线www.slwgd.com(《原诚》信在线)现已开放阳光在线手机版下载。(阳光在线游戏公平)、公开、公正,用实力赢取信誉。

上一篇:鹤岗最新招聘信息:新闻行列周全领会(一)

下一篇:平顶山日报社:又一个现实版《伉俪的天下》!《The King》「女总理」郑恩彩出轨歌手郑俊日,不知已婚VS她知道

网友评论