Java Treeset排序算法

时间:2013-07-16 18:01:28

标签: java collections tree set

出于好奇,我想知道TreeSet如何保持秩序。当然,通过元素对象的比较器或任何自定义比较器比较要添加到先前元素的新元素。但可能有比比较所有方法更好的方法。让我们看一些代码:

    TreeSet<String> tset= new TreeSet<>(new comparator<String>());
    tset.add("america");
    tset.add("britain");
    tset.add("india");

    tset.add("checksolvakia");
    tset.add("china");
    tset.add("sri_lanka");
    tset.add("zimbabwe");

    for(String str:tset){
        System.out.println(str);
    }

在上面的代码中,new comparator<String>()只是一个自定义比较器,可以进行正常的字符串比较。

The output drom above code is:
 i have been called times:1
values America America
 i have been called times:2
values Britain America
 i have been called times:3
values india America
 i have been called times:4
values india Britain
 i have been called times:5
values checksolvakia Britain
 i have been called times:6
values checksolvakia india
 i have been called times:7
values china Britain
 i have been called times:8
values china india
 i have been called times:9
values china checksolvakia
 i have been called times:10
values sri_lanka Britain
 i have been called times:11
values sri_lanka china
 i have been called times:12
values sri_lanka india
 i have been called times:13
values zimbabwe Britain
 i have been called times:14
values zimbabwe china
 i have been called times:15
values zimbabwe india
 i have been called times:16
values zimbabwe sri_lanka
america
britain
checksolvakia
china
india
sri_lanka
zimbabwe

现在问题:
为什么美国与美国相比? 2.为什么其他人都没有与美国比较?是否设置为Root ??
即使将其设置为root也为什么不与root进行比较。 3.可以较少比较说zimbabwe可以与不Britain的东西进行比较(即不是从一开始就是这样)。

1 个答案:

答案 0 :(得分:3)

这篇文章可能会使用很多。对您的问题的一般答案是排序树的二元性质。假设平衡树,我们希望最多只能将值与树中的Log(N)条目进行比较,以找到其正确的位置。除了第一个问题之外,这个事实本身就能回答你的所有问不应将值与自身进行比较,插入树中的第一个值应设置为root,但在平衡树中,需要注意的是,这并不意味着它将永远是根节点。根节点是“中间”值。为什么将美国与自身进行比较可能是比较器的边缘情况,以及空树的行为,我喜欢路易斯对此问题的评论。

enter image description here

如果您想插入12个必须进行多少次比较?它们会有什么比较?如果树是平衡的,这将如何改变?当你可以回答这些问题时,你会回答你自己的问题,直到那时语言描述可能没有用。

以下是每次插入后树的内容。

America

America
    Britain

    Brit
Amer    Indi

    Brit
Amer        Indi
        Chec    

            Brit
Amer                Chin
              Chec          India
                                SriLanka        

            Brit
Amer                Chin
              Chec          SriLanka
                        India       Zimbabwe

请注意,我们正在尽力保持平衡,使用所谓的“旋转”。这意味着我们永远不会完全“重新平衡”树(一个非常昂贵的操作),但是当我们通过在插入点移动节点来避免创建一个长“分支”时,我们就这样做了。因此,我们在那里独自拥有美国,一旦它在树的左侧独自存在,就永远不会与任何东西相比。从本质上讲,一旦一个物体有两个孩子,它就是一成不变的,永远不会被移动。所以我们所拥有的是“平均”Log(N)比较,但我们仍然可以得到温和的不平衡树,并最终出现在我们遇到更糟糕的N / 2比较的情况下。数据集越大,创建的场景越难,但创建不平衡的小分支相当容易,例如在这种情况下,如果美国是“最低”值,它将永远不会被移动。但树的其余部分可以完美平衡。