从有序列表中的树构造

时间:2009-02-23 03:57:12

标签: java performance tree

在java中,我从列表中创建一个SortedSet,它总是会被排序(但只是ArrayList类型)。我想逐个添加它们将会有相当差的性能(在例如AVL树的情况下),因为它将不得不重新排序树。

我的问题是,应该如何创建这个集合?以一种尽可能快的方式建立一个平衡的树?

我计划使用的具体实现是来自http://fastutil.dsi.unimi.it/docs/it/unimi/dsi/fastutil/ints/IntSortedSet.html的IntRBTreeSet或IntAVLTreeSet

写完这篇文章之后,我认为糟糕的表现不会影响我太多(数据量太少),但我仍然对如何在一般情况下完成它感兴趣。

5 个答案:

答案 0 :(得分:3)

具有树实现的集合将使列表中的中间元素位于顶部。所以算法如下:

  1. 找到List的中间元素
  2. 将其插入集合
  3. 重复中间元素左侧和右侧的两个子列表

答案 1 :(得分:2)

对于一般情况,红黑树是一个不错的选择,并且它们具有非常快的插入。请参阅Chris Okasaki's paper以获得优雅且快速的实施。 Functional Java库有一个通用的Set类,由根据本文实现的红黑树支持。

答案 2 :(得分:1)

关于使用Set的所有讨论,我发现可能可以重新说明问题。为什么要使用Set?如果你只想检查成员身份,并对你的源列表进行排序,那么对该对象进行二进制搜索 - 这将比你想象的任何n树一样快(并且可能更快),并且它并不难代码。

因此,设想一个只包装底层List对象的OrderedListSet接口。只要用于命令列表的比较器也用于二进制搜索,这应该是非常简单的。

所有Set操作都将以getIndex(Object ob)调用开始,然后在List上执行相应的操作。

答案 3 :(得分:0)

您是否只是在插入元素时采用简单方法存在性能问题?

如果没有,请不要优化。

答案 4 :(得分:0)

内置的TreeSet(http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeSet.html)类使用红黑树作为后备树(并且已经注意到,红黑树的插入速度非常快)。这里是红黑树上的good info(当插入大部分已经订购的数据时,它们没有典型二叉树实现的问题。)

如果您正在处理大量数据集(大到足以要求基于磁盘的备份或重要的页面文件交换),那么B + Tree是一个非常好的选择(请参阅JDBM以获取基于Java的版本自平衡B +树 - 它不实现Set,但如果需要可以这样使用。)

根据您的应用实际使用此数据的方式,您可能需要考虑GlazedLists库并使您的列表“实时”。如果您所做的只是静态分析,那么这可能是过度的,但这是处理基于列表的数据的绝佳方式。绝对值得一读。