簡短的回答
哈希表可能是最好的爲你的情況。
速度
哈希表(std::unordered_map
)將ø(1)如果散列是恆定的。在你的情況下,O(1)成立,因爲你甚至不需要散列—只使用隨機UUID的低32位應該足夠好。查找的成本與一個或兩個指針間接相似。
二叉樹(std::map
)將Ø(日誌 ñ),所以10萬個項目,你將有24間的比較和24個電位高速緩存未命中。即使對於n = 4,000它將使用12個比較,所以它很快變得比散列表差得多。
基數樹將Ø(ķ),那麼你將有一個最大的ķ比較和ķ潛在的高速緩存未命中。在極不可能的情況下,基數樹將像散列表一樣快。更糟糕的是(假設k =一個合理的16,對於一個256樹的樹),它的性能會比二叉樹好,但比散列表差得多。
所以如果速度是最重要的,使用哈希表。
架空
如果滿一個典型的哈希表將每個項目約1 – 3個指針開銷。如果沒有滿,你可能會浪費每個空插槽1個空間指針。你應該能夠保持它接近完整,同時仍然比二叉樹快,因爲你有一個非常隨機的密鑰,但爲了獲得最大的速度,你當然想要給它足夠的空間。對於32位機器上的1000萬個項目,預計整個表的開銷爲114MiB。對於半滿桌,預計爲153MiB。
紅黑樹,最常見的std::map
實現,將有3個指針+ 1布爾每個項目。一些實現利用指針對齊來將bool與其中一個指針合併。根據實現以及散列表的完整程度,紅黑樹可能會略微降低開銷。預計114 – 153MiB。
一個基數樹將有每個項目1個指針和每個空白插槽1個指針。不幸的是,我認爲這樣大的隨機密鑰會導致你在樹的邊緣有很多空槽,所以它可能使用比上述任何一個更多的內存。減少k可以降低此開銷,但同樣會降低性能。
如果最小開銷很重要,請使用散列表或二叉樹。如果它是優先級,請使用完整的哈希表。
請注意,std::unordered_map
不允許您控制何時調整大小,因此獲得滿滿將會很困難。 Boost Intrusive有一個非常不錯的unordered_map
實現,可以讓你直接控制這個和其他許多事情。
UUID是普通UUID還是自定義算法?特別是,他們是否遵循基於前綴的模式,或者它們基本上是隨機的?這將決定基樹是否是一個好選擇。 –
他們是版本4 uuid的。除了幾位以外完全是隨機的。 – Matt