您何时知道何时使用TreeSet或LinkedList?

时间:2010-09-23 00:09:56

标签: java linked-list treeset

每种结构有哪些优势?

在我的程序中,我将执行这些步骤,我想知道我应该使用哪种数据结构:

  1. 接收未排序的数组和 将它们添加到已排序的结构中。
  2. 遍历已排序的数据并删除正确的数据
  3. 添加数据(从不删除)并将该结构作为数组返回

5 个答案:

答案 0 :(得分:10)

  

您何时知道何时使用TreeSet或LinkedList?每种结构有哪些优点?

通常,您根据所需的结构和性能属性决定集合类型。例如,TreeSet是一个Set,因此不允许重复,也不保留元素的插入顺序。相比之下,LinkedList是一个List,因此允许重复并保留插入顺序。在性能方面,TreeSet为您提供O(logN)插入和删除,而LinkedList在开头或结尾处插入O(1),并在选定位置或删除时插入O(N)

详细信息在各自的类和接口javadocs中都有详细说明,但可以在Java Collections Cheatsheet中找到有用的摘要。

在实践中,集合类型的选择与算法设计密切相关。这两者需要并行完成。 (判断您的算法需要具有属性X,Y和Z的集合,然后发现不存在这样的集合类型是不合适的。)

在您的用例中,看起来TreeSet会更合适。没有有效的方法(即优于O(N^2))来排序大型LinkedList,而不涉及将其转换为某些其他数据结构来进行排序。没有有效的方法(即优于O(N))将元素插入先前排序的LinkedList中的正确位置。第三部分(复制到数组)与LinkedList或TreeSet同样适用;在这两种情况下都是O(N)操作。

[我假设这些集合足够大,以至于大O复杂度可以准确地预测实际表现......]

答案 1 :(得分:1)

TreeSet 的真正威力和优势在于它实现的界面 - NavigableSet

为什么它如此强大,在哪种情况下?

Navigable Set界面添加了例如这3个不错的方法:

    headSet(E toElement, boolean inclusive) 
    tailSet(E fromElement, boolean inclusive)
    subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)  

这些方法可以组织有效的搜索算法(非常快)。

示例:我们需要找到所有以Milla开头并以Wladimir结尾的名称:

    TreeSet<String> authors = new TreeSet<String>();
    authors.add("Andreas Gryphius");
    authors.add("Fjodor Michailowitsch Dostojewski");
    authors.add("Alexander Puschkin");
    authors.add("Ruslana Lyzhichko");
    authors.add("Wladimir Klitschko");
    authors.add("Andrij Schewtschenko");
    authors.add("Wayne Gretzky");
    authors.add("Johann Jakob Christoffel");
    authors.add("Milla Jovovich");
    authors.add("Taras Schewtschenko");
    System.out.println(authors.subSet("Milla", "Wladimir"));

输出:

    [Milla Jovovich, Ruslana Lyzhichko, Taras Schewtschenko, Wayne Gretzky] 

TreeSet不会覆盖所有元素,它会找到第一个和最后一个元素,并返回一个包含该范围内所有元素的新Collection。

答案 2 :(得分:0)

如果你想保持它的排序并且它是附加的 - 大多数情况下,带有比较器的TreeSet是你最好的选择。 JVM必须从头开始遍历LinkedList以决定放置项目的位置。 LinkedList = O(n)用于任何操作,TreeSet = O(log(n))用于基本内容。

答案 3 :(得分:0)

TreeSet中:

TreeSet使用红黑树。因此该集合可以被认为是dynamic search tree。当你需要一个经常读/写操作并且应该保持顺序的结构时,TreeSet是一个不错的选择。

答案 4 :(得分:0)

选择数据结构时最重要的一点是其固有的局限性。例如,如果您使用TreeSet来存储对象,并且在运行时算法更改了这些对象的属性(当该对象是集合中的一个元素时,它们会影响相等比较),请准备好一些奇怪的错误。

用于设置的Java Doc接口状态如下:

  

注意:如果将可变对象用作集合元素,则必须格外小心。如果对象的值更改为影响相等比较的方式,而该对象是集合中的元素,则不指定集合的​​行为。此禁止的一种特殊情况是,不允许集合将自身包含为元素。

Interface Set Java Doc