红黑树

红黑树的插入、创建和删除

穿精又带淫゛_ 提交于 2019-11-27 07:21:39
文章目录 1.红黑树介绍 2.红黑树的旋转 3.红黑树的插入和创建 4.红黑树的删除 5.参考 1.红黑树介绍    二叉搜索树在最好情况下的时间复杂度是 O ( l o g n ) O(log n) O ( l o g n ) ,但是当插入元素是有序的时候,二叉搜索树就变成了一个链表,在这种情况下,时间复杂度为 O ( n ) O(n) O ( n ) 。    红黑树就是针对这一情形进行改进。红黑树本质上是一种二叉搜索树,但它在二叉搜索树的基础上额外添加了一个标记(颜色),同时具有一定的规则,这些规则使得红黑树保证一种平衡,插入、删除、查找的最坏时间复杂度都为 O ( l o g n ) O(logn) O ( l o g n ) 。红黑树的统计性能要好于平衡二叉树。 红黑树的在原有的二叉搜索树上增加了如下几个要求: 1)每个结点要么是红色,要么是黑色 2)根节点永远是黑色的 3)所有叶子结点都是黑色的(红黑树中的叶子结点都是空结点(NIL)。) 4)每个红色结点的两个子结点一定都是黑色的(说明从根到结点的路径上不会有两个连续的红色结点,但黑色结点可以是连续的) 5)从任一结点到其子树中每个叶子结点的路径都包含相同数量的黑色结点。(是成为红黑树最主要的条件,后序的插入、删除操作都是为了遵守这个规定) 红黑树并不是标准的平衡二叉树,它是以上述要求作为一种平衡方法

红黑树的插入与删除源码

一曲冷凌霜 提交于 2019-11-27 04:21:25
""".h头文件代码基本依据<<算法导论>>的伪代码编写. 代码在mac环境下使用gcc编译器运行良好""" 1 #ifndef RB_TREE_H__ 2 #define RB_TREE_H__ 3 4 #define NAGETIVE_INFINITY -100000000 5 #define INFINITY 100000000 6 7 typedef enum {RED, BLACK} colorType; 8 9 typedef struct redBlackNode * redBlackTree; 10 typedef struct redBlackNode * position; 11 12 struct redBlackNode 13 { 14 int val; 15 redBlackTree left; 16 redBlackTree right; 17 redBlackTree parent; 18 colorType color; 19 }; 20 21 // init nullNode and return a sign node 22 redBlackTree init(void); 23 // free memory 24 void disposeTree(redBlackTree t); 25 // in-order traversal and

ConcurrentHashMap

会有一股神秘感。 提交于 2019-11-27 03:18:49
jdk1.7以前与jdk1.8 @since 1.5 jdk1.7以前的ConcurrentHashMap使用的是分段锁实现的并发 jdk1.8之后的版本使用的数组+链表+红黑树数据结构再加上CAS原子操作实现的 jdk1.7以前的实现 Hashtable因为在put等操作的时候使用的synchronized加锁的方式来实现并发安全,但是这样访问map就效率太过于低下了,所以就有了分段锁的方式。大概的意思就是,在开始访问Hashtable的时候因为加了锁的原因,每次只有一个线程可以对map进行修改,但是map太常用且违背map设计的初衷,所以Hashtable就渐渐的被遗弃了。 1.7以前的ConcurrentHashMap使用分段锁解决了这个并发效率低下的问题。分段锁意思大概就是对map的bucket采用分段的方式分成一个个段,再对每个段分别加锁,这样,在有线程访问某一段的时候就要获取某一段的锁,但是其他的段因为是使用的不同的锁,从而其他段是可以被其他线程访问的,这样就大大解决了map并发访问的问题。需要注意的是,ConcurrentHashMap既不允许key不为null,值也不允许为null; ConcurrentHashMap是由Segment[] 与HashEntry[] 构成的,大概就是一个CurrentHashMap由多个segment构成

HashMap源码分析

吃可爱长大的小学妹 提交于 2019-11-27 02:36:50
HashMap概述(非线程安全) HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 线程安全的HashMap: 方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的。 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现。 方法二:重新改写了HashMap,具体的可以查看java.util.concurrent.ConcurrentHashMap. 这个方法比方法一有了很大的改进。 JDK1.8中HashMap的数据结构 在 Java 编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的 数据结构 都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结构,但是在jdk1.8里 加入了红黑树的实现,当链表的长度大于8时,转换为红黑树的结构(之前是由负载因子实现存储的,通过红黑树结构存储这点性能是非常好的)。 JDK1.8中HashMap采用了链地址法,链地址法,就是数组加链表的结合。在数组元素上都有一个链表结构,当数据被Hash后,得到准确的数组下标

【转】理解红黑树

喜夏-厌秋 提交于 2019-11-27 01:25:06
树型结构一直是一种很重要的数据结构, 我们知道二叉查找树BST提供了一种快速查找, 插入的数据结构. 相比散列表来说BST占用空间更小,对于数据量较大和空间要求较高的场合, BST就显得大有用处了.BST的大部分操作平均运行时间为O(logN), 但是如果树是含N个结点的线性链,则最坏情况运行时间会变为O(N). 为了避免出现最坏情况我们给它增加一些平衡条件, 使它的高度最多为2log(N+1), 最坏情况下运行是间花费也接近O(logN), 这就是我下面要讨论的红黑树.由于红黑树的插入和删除是相对复杂的操作,所以这里我将重点讨论这两种操作. AVL树 在理解红黑树之前最好先来看看AVL树, 相比红黑树AVL树在插入操作时需要更多的调整次数, 但更容易理解. 所谓AVL树就是每个节点的左子树和右子树的高度最多差1的二叉查找树.为什么是差1而不是具有相同高度?因为如果要求左右子树高度相同, 那么就只有具有2 k -1个节点的树才满足条件, 这样的条件我们没法做到. 于是需要放宽条件, 允许左右子树高度差1. 下图显示一棵AVL树: AVL树, 结点两边为子树的高度 下面以AVL树的插入操作为例说明AVL树是如何自动平衡的, 这将有助于我们后面理解红黑树的插入. 考虑当我们向AVL树中插入一新节点后可能破坏AVL树的特性, 即某结点的左右子树高差大于1. 如果发生这种情况

Java并发指南13:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

余生颓废 提交于 2019-11-26 23:35:20
Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 转自https://www.javadoop.com/post/hashmap#toc7 部分内容转自 http://www.jasongj.com/java/concurrenthashmap 今天发一篇"水文",可能很多读者都会表示不理解,不过我想把它作为并发序列文章中不可缺少的一块来介绍。本来以为花不了多少时间的,不过最终还是投入了挺多时间来完成这篇文章的。 网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少,不过缺斤少两的文章比较多,所以才想自己也写一篇,把细节说清楚说透,尤其像 Java8 中的 ConcurrentHashMap,大部分文章都说不清楚。终归是希望能降低大家学习的成本,不希望大家到处找各种不是很靠谱的文章,看完一篇又一篇,可是还是模模糊糊。 阅读建议:四节基本上可以进行独立阅读,建议初学者可按照 Java7 HashMap -> Java7 ConcurrentHashMap -> Java8 HashMap -> Java8 ConcurrentHashMap 顺序进行阅读,可适当降低阅读门槛。 阅读前提:本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS、ReentrantLock、UNSAFE

ConcurrentHashMap底层实现原理(JDK1.8)源码分析

孤街醉人 提交于 2019-11-26 18:36:07
ConcurrentHashMap数据结构   ConcurrentHashMap相比HashMap而言,是多线程安全的,其底层数据与HashMap的数据结构相同,数据结构如下:      说明:ConcurrentHashMap的数据结构(数组+链表+红黑树),桶中的结构可能是链表,也可能是红黑树,红黑树是为了提高查找效率。 ConcurrentHashMap源码分析   1、类的继承关系  public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable {}   说明:ConcurrentHashMap继承了AbstractMap抽象类,该抽象类定义了一些基本操作,同时,也实现了ConcurrentMap接口,ConcurrentMap接口也定义了一系列操作,实现了Serializable接口表示ConcurrentHashMap可以被序列化。   2、类的内部类   ConcurrentHashMap包含了很多内部类,其中主要的内部类框架图如下图所示:         说明:可以看到,ConcurrentHashMap的内部类非常的庞大,第二个图是在JDK1.8下增加的类,下面对其中主要的内部类进行分析和讲解。   1. Node类

移植linux红黑树

萝らか妹 提交于 2019-11-26 17:00:59
头文件及定义 typedef struct _RB_NODE { unsigned long m_Color; struct _RB_NODE *pRight; struct _RB_NODE *pLeft; }RB_NODE,*PRB_NODE; typedef struct _RB_ROOT { struct _RB_NODE *pRootNode; }RB_ROOT,*PRB_ROOT; typedef struct _SYMBOL { RB_NODE rb_node; int start; int end; int namelen; int binding; char name[0]; }SYMBOL,*PSYMBOL; typedef struct _DSO { LIST_HEAD node; RB_ROOT symbols; char loaded; char build_id[32]; const char *short_name; char *long_name; int long_name_len; int short_name_len; char name[0]; }DSO,*PDSO; 实现 /* **********************************************************************************

红黑树接口定义

吃可爱长大的小学妹 提交于 2019-11-26 16:55:06
1 github地址 https://github.com/daily11/shujujiegou 2 接口定义 package com.swust.红黑树; import java.util.ArrayList; /** * 红黑树:是二分搜索树的一种,具有以下特质: * (1)每个节点或者是红色的,或者是黑色的 * (2)根节点是黑色的 * (3)每一个叶子节点(最后的空节点)是黑色的 * (4)如果一个节点是红色的,那么他的孩子节点都是黑色的 * (5)从任意一个节点到叶子节点,经过的黑色节点是一样的 * * 旋转操作: * * 黑 红 (左旋转) 黑 (右旋转) 黑 (颜色旋转) 红 * 红 --->红 ---> 红 ---> 红 红 ---> 黑 黑 * 黑 红 */ public interface RBTreeInterface<K extends Comparable<K>, V> { // private class Node{ // public K key; // public V value; // public Node left, right; // public boolean color; // // public Node(K key, V value){ // this.key = key; // this.value = value; //

linux内核-红黑树

别来无恙 提交于 2019-11-26 14:57:51
//rbtree.h /* Red Black Trees (C) 1999 Andrea Arcangeli <andrea@suse.de> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General