2013-08-16 69 views
0

我有很多排序整數的列表,每個列表都不到3600個條目。我想盡可能地將它們保存在內存中,所以我正在尋找一種節省空間的數據結構。用於維護一個<5k的整數列表的最高內存有效的數據結構是什麼?

最常見的操作是插入,成員資格測試和範圍查詢。

整數將大部分在1到100億範圍內,儘管理論上可能存在一些整數將會低得多的角落情況。

我一直在尋找跳躍列表,這是相當不錯的,但我覺得那裏可能會有更高效的結構。

+0

數組如何? – 2013-08-16 12:07:58

+0

數組在插入時不讓我保持排序,對吧? – gumuz

+0

那麼......你可以在一個已經排序好的數組中插入一個元素,以便它在正確的位置。 – 2013-08-16 12:09:56

回答

2

這實際上取決於訪問模式和相對於修改的查找比例。當查找比修改更常見(在你的情況下,顯然插入),這是很常見的,你實際上可以逃避排序的數組,這將給你最佳的內存效率。

如果插入實際上更常見,排序後的數組可能不會這樣做,您將不得不求助於更復雜的數據結構。 B樹聽起來像是一個可能的候選者,因爲它們將許多節點放在一起,因此不會像AVL,跳過列表或紅黑樹那樣受到連接開銷的影響。

我認爲調查基數樹會特別有趣,特別是如果在列表中碰巧有很多連續的整數,因爲這樣的範圍會被基數樹「壓縮」。

值得注意的是,布隆過濾器可以幫助進一步優化您的會員查詢。從某種意義上說,它們是用於成員查詢的空間效率最高的數據結構,但是它只是概率性的,您只能將它們與其他確定性數據結構結合使用,除非您被允許返回不正確答案:-)。

+1

非常感謝,基數特里是我還沒有考慮過,似乎有趣! – gumuz

+0

我不認爲布隆過濾器在與確定性二級數據結構一起使用時會產生空間效率。你會不會使用比二級數據結構更多的空間,因此使用這種結構會更節省空間?範圍查詢不起作用。 – Dukeling

+0

那麼這就是我說的 - 他們可以「幫助進一步優化您的會員查詢」。接下來我要說的僅僅是指出它們可以被看作是用於會員查詢的最節省空間的數據結構。我從來沒有說過,將bloom過濾器與確定性數據結構結合使用會更節省空間,但這顯然不可能是真的,除非您認爲可能存在負面內存使用情況的數據結構? ;-) –

相關問題