【发布时间】:2020-04-04 12:30:09
【问题描述】:
是否有可以存储任意大量元素的 java 数据结构? 为简单起见,我们假设元素也是 BigInteger。
理论上使用带有 BigInteger 索引的数组是可以的,因为设置和获取值将是唯一需要的操作。 但是数组不能包含超过 Integer.MAX_VALUE。(或者甚至更少,具体取决于 VM 相关,请参阅this question)。
要实现这样的数据结构,一个简单(天真的)解决方案是从 LinkedList 创建一个并拥有一个外部 BigInteger 计数器。
类似的东西:
class MyArray{
private final BigInteger size;
private final LinkedList<BigInteger> list;
MyArray(BigInteger size){
//ommited for simplicity
}
public BigInteger get(BigInteger index){
//ommited for simplicity
//traverse the LinkedList using a BigInteger counter and get the element
}
public void set(BigInteger index,BigInteger element){
//ommited for simplicity.
//traverse the LinkedList using a BigInteger counter and set the element
}
public BigInteger getSize(){
return size;
}
}
但是应该可以进行一些优化。 例如,不初始化尚未设置或获取的元素,或缓存频繁请求的元素。从这个意义上说, Map 实现也可能是一个很好的实现。但是地图返回一个 int 大小,我找不到关于地图是否可以处理超过 Integer.MAX_VALUE 的参考。我搜索了 TreeMap 和 HashMap。 有这样任意大小的数据结构吗?
其他一些限制。 1 - 内存大小不被视为限制,但节省内存将是一个加号。 2 - 数据结构最好存储在内存中,因此不考虑数据库支持的解决方案。例如,上述方法也可以通过将值保存在数据库中来实现,并将元素的索引转换为字符串并用作字符串键。
【问题讨论】:
-
您是否真的遇到过需要在内存中保存超过 20 亿个项目的情况,或者这是一个理论上的问题?
-
其实两者都有。它基于一个真实的情况,但是内存是不够的。但是看看有没有类似的东西很有趣。
标签: java arrays data-structures collections arbitrary-precision