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)
 

golang实现常用集合原理介绍的更多相关文章

  1. 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍

    液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...

  2. elasticsearch学习笔记--原理介绍

    前言:上一篇中我们对ES有了一个比较大概的概念,知道它是什么,干什么用的,今天给大家主要讲一下他的工作原理 介绍:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户 ...

  3. Java set接口之HashSet集合原理讲解

    Set接口 java.util.set接口继承自Collection接口,它与Collection接口中的方法基本一致, 并没有对 Collection接口进行功能上的扩充,只是比collection ...

  4. 04 MapReduce原理介绍

    大数据实战(上) # MapReduce原理介绍 大纲: * Mapreduce介绍 * MapReduce2运行原理 * shuffle及排序    定义 * Mapreduce 最早是由googl ...

  5. C#常用控件介绍

                                                  目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichTe ...

  6. Android Animation学习(一) Property Animation原理介绍和API简介

    Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...

  7. Kylin系列之二:原理介绍

    Kylin系列之二:原理介绍 2018年4月15日 15:52 因何而生 Kylin和hive的区别 1. hive主要是离线分析平台,适用于已经有成熟的报表体系,每天只要定时运行即可. 2. Kyl ...

  8. DBoW2算法原理介绍

    本篇介绍DBoW2算法原理介绍,下篇介绍DBoW2的应用. DBow2算法 DBow2是一种高效的回环检测算法,DBOW2算法的全称为Bags of binary words for fast pla ...

  9. LDAP概念和原理介绍

    LDAP概念和原理介绍 相信对于许多的朋友来说,可能听说过LDAP,但是实际中对LDAP的了解和具体的原理可能还比较模糊,今天就从“什么是LDAP”.“LDAP的主要产品”.“LDAP的基本模型”.“ ...

随机推荐

  1. 【java I/O流总结】基于源码比较FileReader和BufferReader

    上一篇博客中,测试分析了FileReader&FileWriter,和BufferWriter&BufferReader之间的性能对比.仅仅只是简单分析.现在我基于源码的角度,来分析B ...

  2. 拜托,别再问我什么是 B+ 树了

    前言 每当我们执行某个 SQL 发现很慢时,都会下意识地反应是否加了索引,那么大家是否有想过加了索引为啥会使数据查找更快呢,索引的底层一般又是用什么结构存储的呢,相信大家看了标题已经有答案了,没错!B ...

  3. 动态规划/MinMax-Stone Game

    2019-09-07 16:34:48 877. Stone Game 问题描述: 问题求解: 典型的博弈问题,也是一个典型的min-max问题.通常使用算diff的方法把min-max转为求max. ...

  4. Qt 事件和信号的关系

    Qt的事件是windows的底层消息封装而成的.这个消息和MFC里的消息是同一概念,都是指键盘.鼠标等的按压.松开等消息.例如按下键盘后,windows系统会发出一个 WM_KEYDOWN的消息,Qt ...

  5. Nature重磅:华裔科学家成功解码脑电波,AI直接从大脑中合成语音

    [导读]Nature发表华裔作者论文:通过解码大脑活动提升语音的清晰度,使用深度学习方法直接从大脑信号中产生口语句子,达到150个单词,接近正常人水平. 大脑活动能够解码成语音了. 说话似乎是一项毫不 ...

  6. 面试都在问的微服务、服务治理、RPC、下一代微服务框架... 一文带你彻底搞懂!

    文章每周持续更新,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( ...

  7. [vijos]1051送给圣诞夜的极光<BFS>

    送给圣诞夜的极光 题目链接:https://www.vijos.org/p/1051 这是一道很水很水的宽搜水题,我主要是觉得自己在搜素这一块有点生疏于是随便找了一题练手,找到这么一道水题,原本以为可 ...

  8. 用css3实现摩天轮旋转的动画效果

    用css3实现摩天轮旋转的动画效果 1.CSS3 @keyframes 规则如需在 CSS3 中创建动画,您需要学习 @keyframes 规则.@keyframes 规则用于创建动画.在 @keyf ...

  9. Chart控件的使用

    1.开启滚动条(ScaleView.Size除以Interval ,大概是中间出现纵线的数量,一般动ScaleView.Size) chart1.ChartAreas[0].CursorX.AutoS ...

  10. 粘包处理现象及其解决方案——基于NewLife.Net网络库的管道式帧长粘包处理方法

    [toc] #1.粘包现象 每个TCP 长连接都有自己的socket缓存buffer,默认大小是8K,可支持手动设置.粘包是TCP长连接中最常见的现象,如下图 socket缓存中有5帧(或者说5包)心 ...