Java 从有序列表构造树

Java 从有序列表构造树,java,performance,tree,Java,Performance,Tree,在java中,我从一个列表创建一个SortedSet,该列表总是要排序的(但只属于ArrayList类型)。我认为一个接一个地添加它们会有相当糟糕的性能(例如,在AVL树的情况下),因为它将不得不对树进行大量的重新排序 我的问题是,我应该如何创建这个集合?在某种程度上,它是尽可能快地建立一个平衡的树 我计划使用的具体实现是来自 在写了这篇文章之后,我认为糟糕的性能不会对我产生太大的影响(数据量太少),但我仍然对在一般情况下如何做到这一点感兴趣 对于一般情况,红黑树是一个很好的选择,它们的插入速度

在java中,我从一个列表创建一个SortedSet,该列表总是要排序的(但只属于ArrayList类型)。我认为一个接一个地添加它们会有相当糟糕的性能(例如,在AVL树的情况下),因为它将不得不对树进行大量的重新排序

我的问题是,我应该如何创建这个集合?在某种程度上,它是尽可能快地建立一个平衡的树

我计划使用的具体实现是来自


在写了这篇文章之后,我认为糟糕的性能不会对我产生太大的影响(数据量太少),但我仍然对在一般情况下如何做到这一点感兴趣

对于一般情况,红黑树是一个很好的选择,它们的插入速度非常快。有关优雅而快速的实现,请参阅。该库有一个泛型类,它由一个根据本文实现的红黑树支持。

红黑树对于一般情况是一个很好的选择,并且它们具有非常快速的插入。有关优雅而快速的实现,请参阅。库中有一个泛型类,该类由一个根据本文实现的红黑树支持。

一个具有树实现的集合的顶部将包含列表中的中间元素。因此,算法如下所示:

  • 找到列表的中间元素
  • 将它插入到集合中
  • 对中间元素左侧和右侧的两个子列表重复此操作

  • 具有树实现的集合的顶部将包含列表中的中间元素。因此,算法如下所示:

  • 找到列表的中间元素
  • 将它插入到集合中
  • 对中间元素左侧和右侧的两个子列表重复此操作

  • 使用简单的方法,即在元素出现时插入元素,您是否会遇到性能问题


    如果没有,就不要进行优化。

    简单的插入元素的方法是否存在性能问题

    如果没有,就不要进行优化。

    内置的TreeSet()类使用红黑树作为它的支持树(已经注意到,红黑树对于插入非常快)。这是关于红黑树的(当插入大部分已经排序的数据时,它们没有典型的二叉树实现的问题)

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

    取决于应用程序实际如何使用这些数据,您可能需要考虑库并使列表“Live”。如果您所做的只是静态分析,那么这可能有点过头了,但这是处理基于列表的数据的一种绝对奇妙的方式。绝对值得一读。

    内置的TreeSet()类使用红黑树作为其支持树(并且,已经注意到,红黑树对于插入非常快)。这是关于红黑树的(当插入大部分已经排序的数据时,它们没有典型的二叉树实现的问题)

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


    取决于应用程序实际如何使用这些数据,您可能需要考虑库并使列表“Live”。如果您所做的只是静态分析,那么这可能有点过头了,但这是处理基于列表的数据的一种绝对奇妙的方式。绝对值得一读。

    关于使用集合的所有讨论,我突然想到,也许可以重新说明这个问题。为什么要用电视机呢?如果您只想检查成员资格,并且对源代码列表进行了排序,那么对对象进行二元搜索-这将比您想象的任何n-树都快(可能更快),而且编写代码也不是那么困难

    因此,设想一个OrderedListSet接口,它只包装下划线列表对象。只要用于排序列表的比较器也用于二进制搜索,这应该是非常直接的


    所有集合操作都将从一个getIndex(Object ob)调用开始,然后在列表上采取适当的操作。

    在讨论了如何使用集合之后,我突然想到,也许可以重新说明这个问题。为什么要用电视机呢?如果您只想检查成员资格,并且对源代码列表进行了排序,那么对对象进行二元搜索-这将比您想象的任何n-树都快(可能更快),而且编写代码也不是那么困难

    因此,设想一个OrderedListSet接口,它只包装下划线列表对象。只要用于排序列表的比较器也用于二进制搜索,这应该是非常直接的


    所有设置操作都将从一个getIndex(Object ob)调用开始,然后对列表采取适当的操作。

    有效点。但是为了便于讨论,让我们假设他确实存在性能问题。但是为了便于讨论,让我们假设他确实存在性能问题。我认为这是一个不错的选择。仍然可以快速访问(数组)列表以插入它们,并且列表元素以这种方式排序的可能性有多大(不是很高)。我认为这是一个不错的选择。仍然可以快速访问(数组)列表以插入它们,列表元素以这种方式排序的可能性有多大(不是很高)。问题是列表已排序,但其数据结构不能保证顺序。所以我可以假设它是有序的,但不能绝对肯定我的代码对m有意义