`
zwhc
  • 浏览: 264683 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

红黑树、TreeSet 和 TreeMap

阅读更多
先看看这篇文章,了解一下红黑树。
http://zh.wikipedia.org/wiki/%E7%BA%A2%E9%BB%91%E6%A0%91

特别注意这一段:

因为每一个红黑树也是一个特化的二叉查找树,因此红黑树上的只读操作与普通二叉查找树上的只读操作相同。然而,在红黑树上进行插入操作和删除操作会导致不再符合红黑树的性质。恢复红黑树的属性需要少量(O(log n))的颜色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次)。虽然插入和删除很复杂,但操作时间仍可以保持为 O(log n) 次。

==================================

看一下帮助文件:

java_zh/java/util/TreeSet.html

public class TreeSet<E>
extends AbstractSet<E>
implements SortedSet<E>, Cloneable, Serializable

此类实现 Set 接口,该接口由 TreeMap 实例支持。此类保证排序后的 set 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序 进行排序(参见 Comparable),或按照在创建 set 时所提供的比较器进行排序。

此实现为基本操作(add、remove 和 contains)提供了可保证的 log(n) 时间开销。

==================================
java_zh/java/util/TreeMap.html

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements SortedMap<K,V>, Cloneable, Serializable

SortedMap 接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字,根据使用的构造方法不同,可能会按照键的类的自然顺序 进行排序(参见 Comparable),或者按照创建时所提供的比较器进行排序。

此实现为 containsKey、get、put 和 remove 操作提供了保证的 log(n) 时间开销。这些算法是 Cormen、Leiserson 和 Rivest 的《Introduction to Algorithms》中的算法的改编。


==================================

嗯,然后看一段 TreeMap 的源程序。


    /** From CLR **/
    private void fixAfterInsertion(Entry<K,V> x) {
        x.color = RED;

        while (x != null && x != root && x.parent.color == RED) {
            if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
                Entry<K,V> y = rightOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    if (x == rightOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateLeft(x);
                    }
                    setColor(parentOf(x), BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    if (parentOf(parentOf(x)) != null)
                        rotateRight(parentOf(parentOf(x)));
                }
            } else {
                Entry<K,V> y = leftOf(parentOf(parentOf(x)));
                if (colorOf(y) == RED) {
                    setColor(parentOf(x), BLACK);
                    setColor(y, BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    x = parentOf(parentOf(x));
                } else {
                    if (x == leftOf(parentOf(x))) {
                        x = parentOf(x);
                        rotateRight(x);
                    }
                    setColor(parentOf(x),  BLACK);
                    setColor(parentOf(parentOf(x)), RED);
                    if (parentOf(parentOf(x)) != null)
                        rotateLeft(parentOf(parentOf(x)));
                }
            }
        }
        root.color = BLACK;
    }



可以看到,在进行红黑属性恢复。

还有其它的一些函数也涉及到红黑属性恢复,可以自行查看。


1
0
分享到:
评论
3 楼 zwhc 2010-11-19  
maomaolingyu 写道
想问下lz,红黑树在插入和删除之后就不符合红黑树了,那红黑树的实现 TreeMap 在插入和删除做了修复 保证还是红黑树了吗。还没看源码。。tks


你看我的原文:

>>可以看到,在进行红黑属性恢复。

>>还有其它的一些函数也涉及到红黑属性恢复,可以自行查看。
2 楼 maomaolingyu 2010-11-05  
想问下lz,红黑树在插入和删除之后就不符合红黑树了,那红黑树的实现 TreeMap 在插入和删除做了修复 保证还是红黑树了吗。还没看源码。。tks
1 楼 zwhc 2010-04-01  
堆排序与直接选择排序的区别

  直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在 R[2..n]中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。
  堆排序可通过树形结构保存部分比较结果,可减少比较次数。

http://baike.baidu.com/view/157305.htm

相关推荐

    Veal98#cs-wiki#00.TreeSet 和 TreeMap 理论基础1

    title: TreeSet 和 TreeMap 理论基础Java 根据红黑树这种平衡的二叉搜索树实现了 TreeSet 和 TreeMap 两种数据结构,如果

    TreeSet 红黑树结构算法

    TreeSet 红黑树结构算法是一种高效的数据结构,它可以快速检索指定节点和自动排序。然而,在使用 TreeSet 时需要注意其缺点,并合理地使用它来提高效率。 知识点总结: * TreeSet 是基于红黑树数据结构的实现 * ...

    java中treemap和treeset实现红黑树

    Java 中 TreeMap 和 TreeSet 实现红黑树 Java 中的 TreeMap 和 TreeSet 都是基于红黑树的数据结构实现的。红黑树是一种自平衡的排序二叉树,它可以保证在插入、删除和搜索操作时都能维持平衡,从而确保搜索、插入...

    treemap treeset hashset hashmap 简要介绍

    由于`TreeMap`内部维护了一个红黑树,因此它的键值对是按照键的自然顺序或自定义排序顺序排列的,这使得`TreeMap`非常适合需要保持键有序的场景。 ### TreeSet `TreeSet`是基于`TreeMap`实现的一个Set(集合)实现...

    红黑树算法实现

    这种特性使得红黑树在大数据量的场景下,如Java集合框架中的TreeMap和TreeSet,具有高效的性能。 红黑树的特性: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶子节点(NIL或空节点)都是黑色...

    红黑树Java实现

    - Java集合框架:`TreeMap`和`TreeSet`是基于红黑树实现的,提供有序的元素存储和高效的查找、插入和删除操作。 - 数据库索引:数据库系统如MySQL的InnoDB存储引擎使用红黑树作为索引结构。 - C++标准模板库(STL)...

    红黑树的java实现 (二叉树也有)

    在Java中,虽然没有直接提供红黑树的类,但`java.util.TreeMap`和`java.util.TreeSet`底层就是通过红黑树实现的。它们提供了高效的键值对存储和集合管理,支持有序操作,如按自然顺序或自定义比较器进行排序。 当...

    红黑树实现源码

    红黑树因其高效性能在许多实际应用中得到采用,如C++标准模板库(STL)中的set和map容器,以及Java的TreeMap和TreeSet类。它们使用红黑树作为底层数据结构,提供快速的查找、插入和删除操作。 5. 红黑树的优势: - ...

    从2-3树理解红黑树

    在实际应用中,红黑树被广泛应用于各种数据结构,如C++标准模板库(STL)中的map和set,以及Java中的TreeMap和 TreeSet。这些数据结构的底层实现都依赖于红黑树的高效性能。 总结来说,2-3树和红黑树是数据结构中的...

    HashMap源码实现红黑树添加元素和删除元素

    红黑树的应用非常广泛,例如 Epoll 实现、Java 集合中的 TreeSet 和 TreeMap、C++ STL 中的 set、map,以及 Linux 虚拟内存的管理,都是通过红黑树去实现的。 红黑树在 HashMap 中的应用可以提高查找、插入和删除...

    java实现的红黑树

    - 在Java中,`java.util.TreeMap`和`java.util.TreeSet`的底层数据结构就是红黑树。它们提供了高效的插入、删除和查找操作,时间复杂度为O(log n)。 - `java.util.HashMap`在容量超过默认负载因子(0.75)时,会将...

    Java实现的红黑树

    在Java中,红黑树被广泛应用于集合框架中的`java.util.TreeMap`和`java.util.TreeSet`。 1. **基本概念** - **颜色属性**:每个节点都有红色或黑色两种颜色。 - **性质**:红黑树必须满足以下5个性质: - 节点是...

    红黑树的Java实现参考源码

    在Java中,红黑树主要体现在`java.util.TreeMap`和`java.util.TreeSet`这两个类中,它们的底层数据结构就是红黑树。 红黑树有以下特性: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶子节点...

    通过分析_JDK_源代码研究_TreeMap_红黑树算法实现.docx

    TreeMap 和 TreeSet 是 Java 集合框架中的重要成员,它们提供了基于红黑树的数据结构实现。从给定部分源代码可以看到,TreeSet 的构造器实际上依赖于 TreeMap 的实例化。具体来说: 1. **构造器分析**: - TreeSet...

    红黑树原理详解

    - Java集合框架中的`TreeMap`和`TreeSet`类使用红黑树作为底层数据结构,提供有序的键值存储和快速查找。 - C++标准模板库(STL)中的`std::map`和`std::set`也使用红黑树实现。 - 数据库系统,如MySQL的InnoDB存储...

    数据结构-史上最强图解红黑树

    红黑树是一种自平衡二叉搜索树,在实际应用中,它广泛用于Linux内核、Java的TreeMap和TreeSet数据结构以及C++的STL中。红黑树的设计旨在保持树的平衡,但是与AVL树不同,它追求的不是绝对的平衡,而是通过放弃一定的...

    JAVA实现的红黑树

    在Java中,红黑树被广泛应用于集合框架中的`java.util.TreeMap`和`java.util.TreeSet`等类。 1. **红黑树的性质** - 每个节点要么是红色要么是黑色。 - 根节点是黑色。 - 所有叶子节点(NIL或空节点)都是黑色。...

    关于红黑树的一点心得

    在实际的应用中,红黑树被广泛应用于诸如Java的TreeMap和TreeSet,以及C++ STL中的map、multimap、multiset等数据结构的底层实现。了解红黑树的工作原理对于开发人员而言是十分重要的,它不仅能帮助理解这些数据结构...

    structure 跳表 vs 红黑树.zip

    structure 跳表 vs 红黑树,对比了两种数据结构的优劣 跳表(Skip List)是一种基于并行...这使得红黑树成为一种广泛应用于高性能数据结构的选择,比如在标准库中的集合类实现中,如 Java 中的 TreeSet 和 TreeMap。

    复习红黑树(二)--红黑树的删除

    在Java标准库中,`java.util.TreeMap`和`java.util.TreeSet`就是基于红黑树实现的。 红黑树的主要特性是: 1. 每个节点都带有颜色属性,可以是红色或黑色。 2. 根节点是黑色。 3. 所有叶节点(NIL或空节点)都是...

Global site tag (gtag.js) - Google Analytics