golang 實現 key有序map
阿新 • • 發佈:2018-12-14
Golang map實現原理是hash map(核心元素是桶,key通過雜湊演算法被歸入不同的bucket中),key是無序的,很多應用場景可能需要map key有序(例如交易所訂單撮合),C++ 的stl map 實現了key有序,實際上是TreeMap是基於樹(紅黑樹)的實現方式,即新增到一個有序列表,在O(log n)的複雜度內通過key值找到value,優點是空間要求低,但在時間上不如HashMap。
閒來用go map + slice切片,實現了一套key有序map資料結構,就是空間換時間的玩法, 實質是map 負責存k v, slice負責維護k的有序索引位置(查詢key採用的是2分法),實現後贈改刪時間負責度是 O(log2n), 。
優化的一點思考:實際上主要就是在slice上維護k位置時的增改刪費操作,這時候我們可根據具體應用在2分查詢上下點文章。 例如可能所存的資料結構頻繁操作的節點只有前面一部分,這時候我們可以加個邏輯,操作時slice時先2查詢 slice子集(例如頭部熱點),這樣可能很多增改刪操作在第一時間就解決了,整體效能會有很大提升, 最好根據應用場景來具體分析解決。下面給出程式碼。