我正在尋找輸入的關聯數據結構,可能會利用我的用例的具體標準。有效的數據結構來映射整數到整數與查找和插入,沒有分配和固定上限
目前,我正在使用紅色/黑色樹來實現將鍵映射到值的字典(在我的情況下整數地址)。
在我的使用案例中,元素的最大數量在前面已知(1024),而且我將只能插入和搜索。搜索比插入多出20倍。在過程結束時,我清除結構並再次重複。在使用過程中不能有分配 - 只有最初的預先分配。不幸的是,STL和最新版本的C++不可用。
任何見解?
我正在尋找輸入的關聯數據結構,可能會利用我的用例的具體標準。有效的數據結構來映射整數到整數與查找和插入,沒有分配和固定上限
目前,我正在使用紅色/黑色樹來實現將鍵映射到值的字典(在我的情況下整數地址)。
在我的使用案例中,元素的最大數量在前面已知(1024),而且我將只能插入和搜索。搜索比插入多出20倍。在過程結束時,我清除結構並再次重複。在使用過程中不能有分配 - 只有最初的預先分配。不幸的是,STL和最新版本的C++不可用。
任何見解?
我最終通過一個例子here實現了一個簡單的線性探測HashTable。我使用了MurmurHash3哈希函數,因爲我的數據是隨機的。
我修改了哈希表在以下幾個方面:
它比我以前的紅/黑樹實現更快。我可能做的唯一改變是重新審視散列方案,以查看源鍵中是否有某些東西可以幫助製作更便宜的散列。
Billy ONeal建議,考慮到少數元素(1024),固定陣列中的簡單線性搜索會更快。我遵循他的建議並實施了一個並排比較。在我的目標硬件(大概是第一代iPhone)上,哈希表的性能比線性搜索高出2:1。在較小的尺寸(256個元素)下,哈希表仍然優越。當然這些值是依賴於硬件的。緩存行大小和內存訪問速度在我的環境中非常糟糕。然而,其他尋求解決這個問題的人會聰明地遵循他的建議並嘗試並首先對其進行描述。
將桌子大小加倍可能是一種悲觀。你有沒有測量? – 2014-11-22 00:43:10
@ Billy ONeal不,我沒有衡量它 - 我觀察到大多數擴展散列表的規模在60-80%職業中是雙倍的。有了完美的哈希,我不需要任何東西,但這不是這種情況。我看到一些碰撞。你是對的,我需要對它進行剖析,看看1024個元素對高度填充的哈希表有多大的影響。 – Steven 2014-11-22 00:49:25
改爲實施散列表。既然你知道最多的元素,這是順利的航行(即你不需要一個複雜的散列函數)。 – 101010 2014-11-21 21:33:11
@ 40two鑑於密鑰是隨機分佈的,你可以推薦一個高效的散列函數?什麼樣的散列表 - 線性探測,桶? – Steven 2014-11-21 21:55:39
使用1024大小的緩衝區。鍵將用於索引緩衝區。 – 101010 2014-11-21 21:58:27