【问题标题】:Java data structure for an arbitrary large number of elements and larger than Integer.MAX_VALUE任意大量元素且大于 Integer.MAX_VALUE 的 Java 数据结构
【发布时间】: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


【解决方案1】:

这个问题背后的动机是找出一个简单的解决方案,而不依赖于内存数据库。例如,当 64 位数组是一个很好的解决方案时。 内存数据库提供了更多可能不需要甚至可以避免的功能。

没有任何答案,也没有找到易于实施和高效的解决方案,我会说使用内存数据库是最简单的方法。 可以在 Wikipedia 中找到 in memory databases 的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多