golang 實現 key有序map

2021-09-13 18:30:45 字數 2362 閱讀 2973

摘要: golang map實現原理是hash

map(核心元素是桶,key通過雜湊演算法被歸入不同的bucket中),key是無序的,很多應用場景可能需要map

key有序(例如交易所訂單撮合),c++ 的stl map

實現了key有序,實際上是treemap是基於樹(紅黑樹)的實現方式,即新增到乙個有序列表,在o(log

n)的複雜度內通過key值找到value,優點是空間要求低,但在時間上不如hashmap。

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子集(例如頭部熱點),這樣可能很多增改刪操作在第一時間就解決了,整體效能會有很大提公升, 最好根據應用場景來具體分析解決。下面給出**。

package order_map

func findindexbybinarysearch(s int, k int) (int, bool)

res := false

for lo <= hi

if m == max-1 && s[max-1] < k

if s[m] < k && s[m+1] > k

if s[m] > k && s[m-1] < k

if s[m] < k else if s[m] > k else

}return -1, false

}type int_map struct

keyarray int

}func newintmap(cap int) *int_map ),

keyarray: make(int, 0, cap),

}}func (m *int_map) exists(key int) bool

func (m *int_map) insert(key int, data inte***ce{}) bool

if res == true

if len(m.keyarray) == 0

//追加末尾

if index >= len(m.keyarray) else if index == 0 else

return true

}func (m *int_map) erase(key int)

index, res := findindexbybinarysearch(m.keyarray, key)

if res == false

delete(m.datamap, key)

if index == 0 else if index == len(m.keyarray) else

}func (m *int_map) size() int

func (m *int_map) getbyorderindex(index int) (int, inte***ce{}, bool)

key := m.keyarray[index]

return key, m.datamap[key], true

}

package main

import (

"order_map"

"fmt"

"math/rand"

"reflect"

"time"

)func main()

t = time.now()

t2 := t.second()

fmt.println("insert time span", t2-t1)

testmap.erase(88)

for i := 0; i < testmap.size(); i++

t = time.now()

t3 := t.second()

fmt.println("range time span:", t3-t2)

}

Golang遍歷map的同時併發修改map的值

通過複製map解決問題 後記如題,有個邏輯設計,在遍歷map的同時需要併發的修改map的值 先說下解決,那就是把map重新複製乙份,不是同乙個map自然也就不存在併發安全和死鎖的問題了,但是因為不是同乙個map了,自然是需要注意資料還是否有效的問題了。這個可以通過加鎖之後的再次判斷來解決。併發的讀寫...

map根據key刪除 GO語言入門 17 Map

map 是一種無序的鍵值對的集合。map 最重要的一點是通過 key 來快速檢索資料,key 類似於索引,指向資料的值。map 是一種集合,所以我們可以像迭代陣列和切片那樣迭代它。map 是無序的,我們無法決定它的返回順序,這是因為 map 是使用 hash 表來實現的。可以使用內建函式 make ...

合併兩個有序鍊錶的golang實現

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 注意 如果有一條鏈是nil,直接返回另外一條鏈 if l1 nil if l2 nil 然後我們就要比較兩個鍊錶的節點的順序了 先來看一張圖 核心 ...