golang實現常用集合原理介紹

2022-02-27 01:30:26 字數 1936 閱讀 6968

arraysort使用陣列儲存資料,新增的時候通過類似二分查詢找到插入位置,插入位置後面的資料往後移動一位,插入新元素,查詢就是二分查詢,刪除就是通過二分查詢找到對應的元素,之後的元素都向前移動一位。時間複雜度如下:

功能時間複雜度

新增o(n)

刪除o(n)

查詢o(logn)

功能時間複雜度

新增o(1)

刪除o(n)

查詢o(n)

佇列先進先出,迴圈佇列採用陣列儲存元素,以迴圈的方式在陣列中新增元素,當陣列寫滿之後自動擴容,元素個數小於1m時二倍擴容,大於等於1m時每次加1m,刪除元素的時候需要將對應的位置賦值為空指標,方便被刪除的元素被**。時間複雜度如下:

功能時間複雜度

進佇列o(1)

出佇列o(1)

佇列先進先出,實現和單鏈表類似,進棧是在表尾新增元素,出棧就是表頭出棧,即表頭指向表頭的下乙個元素,相對陣列實現的迴圈佇列,鍊錶佇列不存在擴容的問題,但每個元素多了乙個指標。時間複雜度如下:

功能時間複雜度

進佇列o(1)

出佇列o(1)

優先順序佇列採用小堆實現,小堆採用陣列儲存資料,按照完全二叉樹的方式運算元據,每個節點的值都小於等於左右子節點的值,保證了每次出隊的都是最小值,即按照順序出隊。

時間複雜度如下:

功能時間複雜度

進佇列o(logn)

出佇列o(logn)

棧先進後出,採用陣列儲存元素,每次進棧的是棧頂元素,出棧的也是棧頂元素,當陣列寫滿之後自動擴容,元素個數小於1m時二倍擴容,大於等於1m時每次加1m。時間複雜度如下:

功能時間複雜度

進棧o(1)

出棧o(1)

佇列先進先出,採用單鏈表儲存資料,進棧是在表頭新增元素,出棧就是表頭出棧,即表頭指向表頭的下乙個元素,相對陣列實現的迴圈佇列,鍊錶佇列不存在擴容的問題,但每個元素多了乙個指標。時間複雜度如下:

功能時間複雜度

進棧o(1)

出棧o(1)

對golang的map簡單封裝,增加了一些方法。對於golang中map的實現原理請看我的這篇文章:時間複雜度如下:

功能時間複雜度

新增o(1)

修改o(1)

查詢o(1)

刪除o(1)

就是map+讀寫鎖,時間複雜度和map一樣

雙向鍊錶 + map,雙向鍊錶按照順序儲存新增的元素,可以按照新增的順序遍歷資料,增刪改查時間複雜度都和map一樣

通過二叉搜尋樹儲存資料,後面會詳細介紹二叉搜尋樹,使用二叉搜尋樹就不存在擴容的問題,hashmap則存在擴容的問題,時間複雜度如下:

功能時間複雜度

新增o(logn)

修改o(logn)

查詢o(logn)

刪除o(logn)

lru的實現原理其實和linkmap幾乎一樣,只不過lru在修改或是查詢的時候都會將被訪問的元素移到鍊錶的表頭,表尾的資料是最先被淘汰的,時間複雜度如下:

功能時間複雜度

新增o(1)

修改o(1)

查詢o(1)

刪除o(1)

提供二叉搜尋樹的增刪改查功能,刪除相對複雜點,時間複雜度如下:

功能時間複雜度

新增o(logn)

修改o(logn)

查詢o(logn)

刪除o(logn)

堆是對golang本身container/heap的簡單封裝,大堆中某個節點的值總是不大於其父節點的值;堆總是一棵完全二叉樹。,時間複雜度如下:

功能時間複雜度

新增o(logn)

查詢o(n)

刪除o(logn)

堆是對golang本身container/heap的簡單封裝,小堆中某個節點的值總是不小於其父節點的值;堆總是一棵完全二叉樹。,時間複雜度如下:

功能時間複雜度

新增o(logn)

查詢o(n)

刪除o(logn)

golang裡channel的實現原理

channel是訊息傳遞的機制,用於多執行緒環境下lock free synchronization.它同時具備2個特性 1.訊息傳遞 2.同步 golang裡的channel的效能,可以參考前一篇 此外,自帶的runtime package裡已經提供了benchmark 可以執行下面的命令檢視其效...

熔斷原理與實現Golang版

熔斷 熔斷機制其實是參考了我們日常生活中的保險絲的保護機制,當電路超負荷執行時,保險絲會自動的斷開,從而保證電路中的電器不受損害。而服務治理中的熔斷機制,指的是在發起服務呼叫的時候,如果被呼叫方返回的錯誤率超過一定的閾值,那麼後續的請求將不會真正發起請求,而是在呼叫方直接返回錯誤 在這種模式下,服務...

golang的select實現原理剖析

select為golang提供了多路io復用機制,和其他io復用一樣,用於檢測是否有讀寫事件是否ready。本文將介紹一下golang的select的用法和實現原理。golang實現select的時候,實際上為每乙個case語句定義了乙個資料結構,select語句塊執行的時候,實際上可以模擬成對乙個...