Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 拥有一个庞大的数字列表和一个具有唯一订单号的订单,如何使这两个O(1)都可以访问?_Java_Data Structures - Fatal编程技术网

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

Java 拥有一个庞大的数字列表和一个具有唯一订单号的订单,如何使这两个O(1)都可以访问?,java,data-structures,Java,Data Structures,想象一下,我有一个巨大的价值清单 123 567 2355 479977 .... 这些都是按升序排列的 所以 我希望有一个单个对象,该对象允许我访问值的订单号(1或2或3…),以及订单号的实际值(123或567或…)。这样的结构存在吗 编辑:应该可以进行插入和删除。 如果我有两个HashMap,我需要两倍的内存,并且必须执行两次操作。如果我理解正确,您正在寻找类似于HashMap的东西。您可以在Oracle的网站上了解这些问题:静态数据解答: O(1)不可能为订购值。(hashmap没有真正

想象一下,我有一个巨大的价值清单

123
567
2355
479977
....
这些都是按升序排列的

所以

我希望有一个单个对象,该对象允许我访问值的订单号(1或2或3…),以及订单号的实际值(123或567或…)。这样的结构存在吗

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

如果我理解正确,您正在寻找类似于
HashMap的东西。您可以在Oracle的网站上了解这些问题:

静态数据解答:

O(1)不可能为订购值。(hashmap没有真正的O(1)compexity)
但是O(1)很容易被排序得到

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

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

关于订单价值:

只需将递增的值存储在数组(或ArrayList)a[]中;[orderNr]给出了该值



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

使用排序树,您可以获得这两个方向的日志(n)时间。理解O(log(n))不是O(1),它肯定是在。例如,如果你有40亿个元素,它将是1(理论上,虽然并不总是)对32


如果两者都需要为O(1),则应创建一个排序的int/longs/bigInteger数组或以某种方式查找所需的任何数组,然后创建一个int/longs/bigInteger到其位置索引的哈希映射。如果可以有多个数据结构,我建议使用两个映射:

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

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



然后,两种情况下都有O(1)个查找时间。

您的序列是否需要支持插入和删除,或者是预先确定的?序列中有多少个数字?序列永远是数字,还是可以是任何东西?为什么你关心它是一个单一的对象,而不是每个方向上的一个映射?如果允许使用第三方库,我想您可以使用番石榴
BiMap
,但是单独使用
List
Map
可能更容易。对于静态列表:数组是您要查找的,尽管在这种情况下,您只有O(log(n))用于查找顺序。巨大的意思是:脱机算法?你必须将其存储在文件或其他存储器中吗?AlexWien,你错了:维护一个列表和hashmap会给你O(1)我不知道为什么
hashmap
在这里会有用。你能详细说明一下吗?@templatetypedef我从这个问题中得到的信息是,他在寻求一种方法,将数字与其在列表中的位置关联起来。HashMap可以做到这一点。将一个值指定为键(列表中的位置),将数字指定为值。拥有该值时,如何获取索引(订单号)?它们相互链接。索引(将是hashmap中的键),它将与值(数字)配对。如果两者都适合内存,我认为这是最快的解决方案。hashmap不是O(1)。它具有特定的概率O(1)。但并非总是如此。虽然数组访问(您的第一部分)是O(1),但大O表示法估计的是复杂性,而不是速度。我不是在比较数组中二进制搜索的速度,而是在大量随机整数上,它肯定比O(log(n))更具扩展性。根据定义,我说hashmapo的竞争性不是O(1),我从来没有提到过速度!。它是具有特定概率的O(1),其id依赖于要插入的datta和使用的哈希函数。研究hashmaps。这里有一个详细的讨论,我说hashmap的竞争性不是O(1),我从来没有提到过速度!。它是具有特定概率的O(1),这取决于要插入的数据和使用的哈希函数。研究hashmaps。这里有一个详细的讨论,所以。我没有投反对票,但我不明白你在这里描述什么。你能详细说明二进制搜索是什么吗?二进制Salh给出了要搜索的元素的数组索引,其中B等于这个顺序。如果只插入比之前插入的元素更大的元素,这就是方法。是的,你是正确的。但这不是问题所在。没有要求它具有插入复杂性。仅用于搜索。因此,理想的结构必须考虑数据的大小和插入、删除和搜索的数量。这在问题中是未知的。@AlexWien感谢您指出,我假设数据存储在一个映射中。鉴于问题的更新说明序列应该支持插入和删除,我认为这不符合时间限制。@te
123 - 1
567 - 2
2355 - 3
479977 - 4
...