使用高效的add和indexed get方法对java数据结构进行排序

时间:2012-08-01 16:14:27

标签: java data-structures

是否在java中实现了提供以下保护措施的数据结构:

  • 元素始终排序
  • 添加元素至少执行O(lg n)
  • 获取特定索引处的元素至少执行O(lg n)

基本上我希望能够做到以下几点:

SomeDataStructure elements = new SomeDataStructure();
elements.add(5);
elements.add(1);
elements.add(10);
assertEquals(1, elements.get(0));
assertEquals(5, elements.get(1));
assertEquals(10, elements.get(2));

其中addget方法都至少在O(lg n)执行。

这似乎应该可以使用树结构完成,但我找不到任何提供索引get方法的实现。我也研究了使用/扩展java.util.TreeMap,但是所有的旋转逻辑都是私有的,因此我无法跟踪树的更改方式。

3 个答案:

答案 0 :(得分:0)

看起来您可以使用TreeMap,然后添加遍历树的get方法来获取该索引?

您可以使用keySet迭代器按顺序遍历它们,但是没有关于其性能的文档。

答案 1 :(得分:0)

如果你不需要交错读写 - 也就是说,你想要一次性构建你的数据结构然后在其中查找,而不必在它构建之后修改它 - 那么我会只需构建一个列表,对其进行排序,然后在列表中使用索引。在这种情况下,树太过分了,因为在构建时不需要对结构进行排序。

List<Integer> elements = new ArrayList<Integer>(3);
elements.add(5);
elements.add(1);
elements.add(10);

Collections.sort(elements);

assertEquals(1, elements.get(0));
assertEquals(5, elements.get(1));
assertEquals(10, elements.get(2));

添加发生在每个O(1)时间(所以O(n)用于添加n项)并且排序发生在O(n * log(n))时间,给出总体复杂度O(n + n * log(n))= O(n * log(n))用于构建结构。这与在O(log(n))时间中添加n个元素相同。但是,查找将在恒定(O(1))时间内发生,从而提供比基于树的解决方案更高的效率。

如果您想保证结构永远不会被修改(即永远不会丢失它的排序),您可以用上面的第5行替换:

elements = Collections.unmodifiableList(Collections.sort(elements));

如果有人试图修改列表,这将抛出一个异常,这将是你发现错误的线索。

答案 2 :(得分:-1)

来自TreeMap的JavaSE documentation

  

此实现提供了保证的log(n)时间成本   containsKey,get,put和remove操作。

您可以通过查找有关您正在使用的任何实现的信息来找到相同内容。