sparse_hash_map、dense_hash_map和sparsetable的實現細節


sparse_hash_map、dense_hash_map和sparsetable的實現細節

翻譯自sparsehash文檔

sparsetable

sparsetable 是random access container,占用內存極少的數組(沒有賦值的元素平均占用1~2 bits)。例如創建了長度是5的數組並且賦值a[2] = [big struct],那么a[2]會占用很大內存,但是a[0], a[1], a[3], a[4]不會。

sparsetable 可以看作是一組groups,每個group負責M個。第一個group負責t[0]..t[M-1],第二個負責t[M]..t[2M-1],依此類推(M默認是48)。sparsetable初始化時候創建了 (99/M +1)個group,之后元素的增刪查改都在對應的group上操作,t[i]實際上對應(t.group[i/M])[i%M]。

每個分桶有一個保存值的vector,和大小為M的bitmap,每一位標識對應的元素是否賦值了。查找元素按這個步驟,尋找下標i的元素(i<M),如果bitmap[i]是0那么下標i沒有被賦值,如果是1,那么取vector找到對應的值。

operate cost description
find O(M) 如果bitmap[i]=0,從vector里找元素是最耗時的,依然是常量時間
insert O(M) 如果bitmap[i]=1,相當於find后做一次賦值;如果bitmap[i]=0,需要在vector中插入元素,再將bitmap[i]置1
delete O(M) null

sparse_hash_set

sparse_hash_map


免責聲明!

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



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