基本上我正在寻找java中最好的数据结构,我可以存储对并通过值检索前N个元素。我想在O(n)时间做到这一点,其中n是数据结构中的entires数。
示例输入将是,
<"john", 32>
<"dave", 3>
<"brian", 15>
<"jenna", 23>
<"rachael", 41>
如果N = 3,如果我想降序,我应该能够返回rachael,john,jenna。
如果我使用某种hashMap,插入速度很快,但按顺序检索它们会变得很昂贵。 如果我使用一些保持订单的数据结构,那么插入变得昂贵,而检索更便宜。我无法找到能够做得非常好而且速度非常快的最佳数据结构。
任何输入都表示赞赏。感谢。
[更新]
让我以其他方式提出这个问题,如果能让它更清楚的话。 我知道我可以在恒定时间O(1)插入hashMap。 现在,我怎样才能在O(n)时间内按值从排序顺序中检索元素,其中n =数据结构中的entires数量?希望它有意义。
答案 0 :(得分:5)
如果你想排序,你必须放弃不断的O(1)时间。
这是因为与插入未排序的键/值对不同,排序将最低限度地要求您将新条目与某些内容进行比较,并且赔率可能是多种情况。一旦你有一个算法需要更多的时间和更多的条目(由于更多的比较)你已经超过“恒定”时间。
如果你能做得更好,那么一定要做到这一点!有一个Dijkstra奖等待你,如果不是一个菲尔兹奖章启动。
不要绝望,你仍然可以将关键部分作为HashMap,并使用Tree实现的排序部分,它将为您提供O(log n)。 TreeMap可能就是你想要的。
---更新以匹配您的更新---
不,你不能在O(n)时间迭代一个hashmap。这样做会假设你有一个清单;但是,该列表必须已经排序。使用原始HashMap,您必须在整个地图中搜索下一个“较低”值。搜索地图的一部分是行不通的,因为您未检查的一个元素可能是正确的值。
现在,有一些数据结构可以进行大量的权衡,可能会让您更接近。如果你想自己动手,也许定制的Fibonacci堆可以给你一个接近你想要的摊销性能,但它不能保证最差的性能。在任何情况下,某些操作(如extract-min)仍然需要O(log n)性能。