拥有庞大的数字列表和具有唯一订单号的订单,如何使O(1)都可访问?

时间:2015-01-09 19:29:47

标签: java data-structures

想象一下,我有一个巨大的值列表

123
567
2355
479977
....

这些是按升序排序

所以

123 - 1
567 - 2
2355 - 3
479977 - 4
...

我希望有一个单个对象,可以使用订单号(1或2或3 ...)访问该值,以及实际值(123或567)或者......)订单号。这样的结构是否存在?

编辑:应该可以进行插入和删除。 如果我有2个Hashmaps,我需要两倍的内存并且必须执行两次操作。

5 个答案:

答案 0 :(得分:1)

你可以维护一个ArrayList<Integer>,它有O(1)索引查找来存储你的所有整数和(index - &gt; int)关系和一个HashMap<Integer, Integer>也有O(1)查找存储(int - &gt; index)关系。

这样做,每个查找方向都有O(1)。

答案 1 :(得分:1)

如果您可以拥有多个数据结构,我建议您使用2个地图:

1)由于数据在数组中,您可以直接访问给定顺序(位置)中存在的值。考虑到需要支持插入和删除的问题中的更新,可以通过使用HashMap来实现,其中key = order,value = value at the order

2)另一个反向HashMap,其中key = value,value = order

然后,您可以为这两种情况设置O(1)查找时间。

答案 2 :(得分:0)

如果我理解正确,您正在寻找类似HashMap的内容。您可以在Oracle的网站上阅读它们:JavaDocs

答案 3 :(得分:0)

回答静态数据:

O(1)不能用于订购价值。 (散列映射没有真正的O(1)compexity)
但O(1)很容易有价值。

关于订购价值: 订单将约为log2(N)。您需要二进制搜索(log2(n))或类似工作的hashmap。我希望在使用标准的HashMap实现时,binSearch是最快的(更少的对象开销),您可以使用它的顺序值来映射数字。 更新:为什么二进制搜索:
使用二进制搜索,您可以找到元素的数组位置,该位置等于顺序。这不需要任何额外的内存,并且需要的内存远远少于std hashMap实现。

对于动态数据,它取决于插入频率和搜索频率。 对于大量的搜索和少量插入,我将使用Array(List)。

关于订单价值:

简单地存储数组中的值(或ArrayList)a []; a [orderNr]给出值。

答案 4 :(得分:0)

使用已排序的树,您可以获得两者的log(n)时间。理解O(log(n))不是O(1),它肯定是大约的。例如,如果你有40亿个元素,它将是1(理论上,但并不总是)与32。

如果你需要两者都是O(1),你应该创建一个排序的int / longs / BigIntegers数组或者单向查找所需的任何数组,然后是ints / longs / BigIntegers的HashMap到它的位置索引< / p>