golang實現常用集合原理介紹


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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM