想象一下,我有一个巨大的值列表
123
567
2355
479977
....
这些是按升序排序
所以
123 - 1
567 - 2
2355 - 3
479977 - 4
...
我希望有一个单个对象,可以使用订单号(1或2或3 ...)访问该值,以及实际值(123或567)或者......)订单号。这样的结构是否存在?
编辑:应该可以进行插入和删除。 如果我有2个Hashmaps,我需要两倍的内存并且必须执行两次操作。
答案 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>