簡體   English   中英

存儲2D數據的數據結構的想法?

[英]Idea for a data structure to store 2D data?

我有一個大的2D網格,x-by-y。 應用程序的用戶將添加有關此網格上特定點的數據。 遺憾的是,網格太大而無法實現為大型x-by-y陣列,因為運行它的系統沒有足夠的內存。

實現這一點的好方法是什么,只有添加了數據的點存儲在內存中?

我的第一個想法是創建數據點的BST。 諸如“(long)x << 32 + y”的散列函數將用於比較節點。

然后我得出結論,如果沒有很好的平衡,這可能會失去效率,所以我想出了一個具有可比BST點數的BST的想法。 外部BST將根據它們的x值比較內部BST。 內部BST將比較點的y值(並且它們都具有相同的x)。 因此,當程序員想要查看(5,6)處是否存在點時,他們會查詢外部BST為5.如果在該點存在內部BST,則程序員將查詢內部BST為6.結果將被退回

你能想到更好的實現方法嗎?

編輯:關於HashMaps:大多數HashMaps都需要有一個數組用於查找。 有人會說“data [hash(Point)] = Point();” 設置一個點然后通過散列找到Point來查找索引。 然而,問題是數組必須是散列函數范圍的大小。 如果此范圍小於添加的數據點總數,則它們將沒有空間或必須添加到溢出。 因為我不知道將要添加的點數,所以我必須假設這個數字小於一定數量,然后將數組設置為該大小。 同樣,這實例化了一個非常大的數組(盡管假設數據點的數量比x * y少,但比原來要小)。 我希望結構能夠與數據量成線性比例,並且在空的時候不占用大量數據。

看起來我想要的是SparseArray,正如一些人所提到的那樣。 它們的實施方式類似於在BST內部使用BST嗎?

Edit2:Map <>是一個界面。 如果我使用Map,那么看起來TreeMap <>將是最好的選擇。 所以我最終會得到TreeMap <TreeMap <Point >>,類似於人們所做的Map <Map <Point >>>建議,這基本上是BST內部的BST。 感謝您的信息,因為我不知道TreeMap <>基本上是BST的Java SDK。

編輯3:對於那些可能關心的人,選擇的答案是最好的方法。 首先,必須創建一個包含(x,y)並實現可比較的Point類。 Point可以通過類似(((long)x)<< 32)+ y)的方式進行比較。 然后,TreeMap會指向數據。 搜索這個是有效的,因為它在一個平衡的樹中,因此log(n)成本。 用戶還可以使用TreeMap.entrySet()函數查詢所有這些數據,或者遍歷它,該函數返回一組Points以及數據。

總之,這允許稀疏陣列的空間效率和搜索效率的實現,或者在我的情況下,2D陣列,其也可以有效地迭代。

Quadtreek -d-treeR-tree

將大點陣列的索引存儲到其中一個空間結構中。 如果數據不是均勻分布的,則這種空間結構是有利的,例如集中在城市中的地理數據,並且在海中沒有任何意義。

想想你是否可以忘記常規網格,並使用四叉樹。
(想想,為什么你需要一個規則的網格?常規網格通常只是一個簡化)

在任何情況下都不要使用Objects來存儲Point。 這樣的Object只需要20個字節,因為它是一個對象! 對於龐大的數據集來說,這是個壞主意。

int x[]int[] yint[]xy數組與內存使用情況相關。

考慮閱讀

Hanan Samet“多維數據結構的基礎”

(至少是介紹)。

您可以使用Map<Pair, Whatever>來存儲數據(您必須編寫Pair類)。 如果需要以某種特定順序迭代數據,請使Pair Comparable ,並使用NavigableMap

一種方法可以是Map<Integer, Map<Integer, Data>> 外部映射上的鍵是行值,內部映射中的鍵是列值。 與該內部映射關聯的值(在本例中為Data類型)對應於(row, column)處的數據。 當然,如果您正在嘗試進行矩陣運算等,這將無濟於事。 為此你需要稀疏矩陣。

另一種方法是將行和列表示為Coordinate類或Point類。 您將需要實現equalshashCode (應該非常簡單)。 然后,您可以將數據表示為Map<Point, Data>Map<Coordinate, Data>

您可以擁有一個對象列表的列表,該對象可以編碼它的水平和垂直位置。

class MyClass
{
    int x;
    int y;
    ...
}

也許我在這里過於簡單,但我認為你可以使用常規的HashMap 它將包含自定義Point對象作為鍵:

class Point {
    int x;
    int y;
}

然后重寫equals方法(以及hashCode方法)以基於xy 這樣您只能存儲包含某些數據的點。

我認為你是以正確的方式以高效的方式執行此操作 - 它可以通過使用地圖映射相當容易地實現,包含在類中以提供用於查找的干凈界面。

另一種(更有效的內存)方法是使用單個映射,其中鍵是元組(x,y)。 但是,如果您需要進行諸如“給我所有值x == some value ”的查詢,這將不太方便。

您可能希望查看Matrix工具包項目中的FlexCompColMatrix,CompColMatrix和其他稀疏矩陣實現。

性能將取決於寫/讀比率和矩陣的密度,但如果您使用矩陣包,通過切換實現將更容易實驗

我給你的建議是使用Commons Math:Apache Commons數學庫 因為它可以通過利用您的應用程序所需的數學力量來節省您的一天。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM