【发布时间】:2013-06-21 16:00:28
【问题描述】:
我有一个大的 2D 网格,x-by-y。应用程序的用户将添加有关此网格上特定点的数据。不幸的是,网格太大而无法实现为大型 x×y 数组,因为运行它的系统没有足够的内存。
什么是实现这一点的好方法,以便只有添加了数据的点才存储在内存中?
我的第一个想法是创建数据点的 BST。诸如“(long)x
然后我得出结论,如果不平衡,这可能会降低效率,因此我想出了一个由可比较的 BST 点组成的 BST 的想法。外部 BST 将根据 x 值比较内部 BST。内部 BST 将通过它们的 y 值来比较这些点(并且它们都将具有相同的 x)。因此,当程序员想要查看 (5,6) 处是否有一个点时,他们会在外部 BST 中查询 5。如果在该点存在内部 BST,那么程序员将在内部 BST 中查询 6。结果将被退回。
你能想出更好的实现方式吗?
编辑:关于 HashMaps:大多数 HashMaps 需要有一个用于查找的数组。有人会说“data[hash(Point)] = Point();”设置一个点,然后通过散列找到该点以找到索引。然而,问题是数组必须是散列函数范围的大小。如果此范围小于添加的数据点总数,则它们将没有空间或必须添加到溢出中。因为我不知道要添加的点数,所以我必须假设这个数字会小于某个数量,然后将数组设置为该大小。同样,这会实例化一个非常大的数组(尽管如果假设数据点比 x*y 少,则比最初的要小)。我希望结构随着数据量线性扩展,并且在为空时不会占用大量数据。
正如一些人所提到的,我想要的是一个 SparseArray。它们的实现方式是否类似于在 BST 中包含 BST?
Edit2: Map 是一个接口。如果我要使用地图,那么看起来 TreeMap 将是最好的选择。所以我最终会得到 TreeMap>,类似于人们提出的 Map > 建议,这基本上是 BST 中的 BST。不过,感谢您提供的信息,因为我不知道 TreeMap 基本上是 BST 的 Java SDK。
Edit3:对于那些可能关心的人来说,选择的答案是最好的方法。首先,必须创建一个包含 (x,y) 并实现可比较的 Point 类。该点可能会通过类似 (((long)x)
总之,这允许稀疏数组的空间效率和搜索效率的实现,或者在我的例子中,二维数组也可以有效地迭代。
【问题讨论】:
-
不要重新发明轮子,看看空间数据结构
-
您似乎对数据结构的底层实现更感兴趣,而不是您将如何使用它。如果您需要一些空间查询(x 在 10 到 40 之间的点)或最近邻查询,您可以使用 AlexWien 提到的一些结构,或一些可导航的地图。如果您只需要查找某个特定点,那么普通的旧 HashMap 会做得很好 - docs.oracle.com/javase/6/docs/api/java/util/HashMap.html
-
@Kiril Raychev:添加点后,我计划使用结构中的所有数据进行计算,但不需要范围查询。
-
好的,看来地图最适合您的使用。但是当你开始考虑空间问题时,可以考虑使用不基于对象的 HashMap,这样可以节省 60% 的内存空间。 (点对象与原始类型)
标签: java data-structures