有什么好的方法可以实现这一点,以便只有添加了数据的点才存储在内存中?
我的第一个想法是创建数据点的二叉搜索树(BST)。比较节点将使用哈希函数"(long)x<<32 + y"。
然后我得出结论,如果不平衡,这可能会失去效率,因此我想到了一个类似于BST的可比较BST的想法来存储点。外部BST将根据其x值比较内部BST。内部BST将根据其y值(它们都具有相同的x)比较点。因此,当程序员想查看是否存在(5,6)点时,他们会查询外部BST以获取5。如果存在一个内部BST则程序员会为6查询内部BST。结果将被返回。
你能想到更好的实现方式吗?
编辑:关于HashMaps:大多数HashMaps需要具有用于查找的数组。例如"data[hash(Point)] = Point();"将设置一个点,然后通过对其进行哈希来查找Point以找到索引。问题在于,数组必须是哈希函数范围的大小。如果此范围小于添加的总数据点数,则它们将没有空间或必须添加到溢出中。因为我不知道将添加的点数,所以我必须假设这个数字将小于某个数量,然后将数组设置为该大小。再一次,这会实例化一个非常大的数组(虽然比最初的如果假设有更少的数据点,则规模更小)。我希望该结构能够随着数据量的增加而线性扩展,并且在为空时不占用大量内存。
看起来我想要的是一个稀疏数组,就像一些人已经提到的那样。它们是否类似于BST中的BST?
编辑2:Map<>是一个接口。如果我要使用Map,那么TreeMap<>似乎是最佳选择。因此,我将得到TreeMap>,类似于人们提出的Map>建议,即基本上是BST中的BST。感谢信息,因为我不知道TreeMap<>基本上是BST的Java SDK。
编辑3:对于那些关心的人,被选中的答案是最佳方法。首先,必须创建一个包含(x,y)并实现可比性的Point类。该点可能会被比较为像(((长)x)<<32)+ y)。然后,每个点都将TreeMap到数据中。由于这是在平衡树中,所以搜索是有效的,成本为log(n)。用户还可以通过使用TreeMap.entrySet()函数查询所有这些数据或迭代它,该函数返回一组带有数据的点。
总之,这使得稀疏数组(在我的情况下为二维数组)的占用空间高效且搜索高效,同时也能够高效地进行迭代。