我想製作「壓縮數組」/「壓縮矢量」類(下面詳細介紹),它允許隨機訪問數據或多或少保持恆定時間。 「大致恆定的時間」意味着雖然元素訪問時間不是恆定的,但當我接近數組的某個點時,它不應該繼續增加。即容器不應該做更多的計算(比如「再次解壓縮所有內容以獲取最後一個元素」,以及「幾乎沒有任何內容獲取第一個元素」)來獲取一個元素。可能可以通過將數組分割成壓縮數據塊來實現。即訪問一個元素應該採取「平均時間」+ - 一些偏差。我可以說,我希望最佳訪問時間和最差訪問時間相對接近平均訪問時間。隨機數據訪問的壓縮矢量/數組類
我的選擇是什麼(合適的算法/已有的容器 - 如果有的話)?
集裝箱細節:
- 容器充當相同的元件(比如std ::矢量)
- 一旦容器被初始化的線性陣列,數據是恆定的並且不會改變。容器需要提供只讀訪問權限。
- 容器應該像array/std :: vector - 即通過運算符[]訪問的值,存在.size()等。
- 如果我可以將它作爲模板類,那就太好了。
- 訪問數據應該或多或少是恆定時間的。我不需要爲每個元素使用相同的訪問時間,但我不應該解壓縮所有內容以獲取最後一個元素。
使用示例:
二進制數據搜索。
數據詳細信息:
1.數據結構主要由浮點數和一些整數組成。有更多的浮點數比整數。沒有字符串。
2.數組中不可能存在許多相同的元素,因此僅索引數據是不可能的。
3.一個元素的大小小於100字節。
4.每個容器的總數據大小在幾千字節和幾兆字節之間。
5.數據不稀疏 - 它是連續的元素塊,它們全部被分配,沒有「空白槽」。
壓縮的目標是減少塊與非壓縮表示形式數組相比的ram數量,同時保持一定的合理讀取訪問性能,並允許隨機訪問元素作爲數組。即數據應該以壓縮形式存儲在內部,我應該能夠像訪問std :: vector或類似容器一樣訪問它(只讀)。
想法/意見?
什麼是「或多或少」的恆定時間?要麼它是不變的,要麼不是。否則有趣的問題。你確定你不能用許多現有的容器類來做你想要的嗎? – ereOn 2010-08-06 13:21:45
「壓縮」部分在哪裏進入?你永遠不會解釋那部分。你可以使用指向gzipped blob的指針向量,或者類似的東西嗎?還是你的意思是壓縮,因爲你有一個稀疏的數據集,所以一個天真的向量會有很多空插槽? – jalf 2010-08-06 13:28:41
另外你說元素只是浮動和整數,而且一個元素永遠不會超過100個字節。除非你在800位體系結構上工作,否則幾乎可以忽略最後一項要求。 – ereOn 2010-08-06 13:34:28