整點B樹的(或任何存在的小的變化的)是存儲在磁盤上的數據,使得它可以與少量的磁盤訪問被讀取。如果你想把所有內容都保存在內存中,你應該使用一個平衡的二叉搜索樹(也許是一棵紅黑樹或splay樹),或者甚至是一個香草BST,但是你的問題似乎都沒有考慮到這個事實。
- 什麼是用來表示樹的最佳數據結構?我在想TreeMap。
TreeMap
是在內存中的數據結構,因此目前還不清楚這將如何幫助表示磁盤上的樹。此外,這爲您實現了一個二叉搜索樹,所以如果您使用TreeMap
,那麼您自己並沒有真正實現B樹。
- 在B +樹的數據被存儲olny在葉節點(K,V),並在內部節點,而不是在每一個記錄數據有一個指針指向一個子節點(K,P)。我想建議如何指向其他節點,因爲我不能在java中使用指針。
您不需要實際的指針來表示B樹,只是文件偏移量。您需要定義一種表示這些偏移量的方法(根據文件開頭的字節或塊的數量,具體取決於實現的其他部分的結構),並根據文件偏移量訪問所有內容。實際上,您應該使用標準的C風格指針來指向B +樹中的節點,而不是而不是。如果你這樣做了,下一次程序啓動時這些指針就沒有意義了,所以你將失去磁盤數據結構的持久性優勢。
要乾淨地訪問文件內容,我推薦memory mapping。在Java中創建內存映射文件對象的一種有用方法是FileChannel.map。該方法返回一個MappedByteBuffer,您可以使用它來讀取特定文件偏移量處的一大塊字節。
首先感謝您的回答!關於樹的存儲我想使用Serializable。另外關於數據結構,因爲TreeMap不是我想要的,你有任何數據結構來建議,或者你認爲如果我創建自己的Node類會更好? –
@sijoune你對性能有多關心?如果你關心,你可能不應該使用'Serializable'或創建一個你自己的Node類。您應該將每個塊視爲一個N字節項目(您定義N)的數組,並直接操作每個項目。如果序列化一個Java對象,很多額外的信息會與對象數據一起保存,而且您不確定每個對象在磁盤上的大小。如果你甚至不知道每個對象的大小,你不知道可以容納多少頁面,並且性能會下降。 –