红黑树

红黑树c实现

折月煮酒 提交于 2020-01-08 07:20:37
参考算法导论 #include<stdio.h> #include<time.h> #include<stdlib.h> typedef int KEY; enum NodeColor { BLACK=0, RED=1 }; /*定义节点*/ typedef struct node { int data; struct node* parent; struct node* left; struct node* right; enum NodeColor color; }RBTree,*PRBTree; /*标志位节点 NIL[T]*/ PRBTree NIL_FLAG=NULL; /*在红黑树上的操作*/ static void rb_insert(PRBTree*,int); static PRBTree rb_insert_fixup(PRBTree*,PRBTree); static void rb_delete(PRBTree*,PRBTree); static void rb_delete_fixup(PRBTree*,PRBTree); static void left_rotate(PRBTree *T,PRBTree x); static void right_rotate(PRBTree *T,PRBTree x); void inorder(PRBTree);

Nginx之红黑树

北战南征 提交于 2020-01-08 05:03:10
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGX_RBTREE_H_INCLUDED_ #define _NGX_RBTREE_H_INCLUDED_ #include <ngx_config.h> #include <ngx_core.h> typedef ngx_uint_t ngx_rbtree_key_t; typedef ngx_int_t ngx_rbtree_key_int_t; typedef struct ngx_rbtree_node_s ngx_rbtree_node_t; // 红黑树 struct ngx_rbtree_node_s { // 无符号整形的keyword ngx_rbtree_key_t key; // 左子节点 ngx_rbtree_node_t *left; // 右子节点 ngx_rbtree_node_t *right; // 父节点 ngx_rbtree_node_t *parent; // 节点的颜色,0表示黑色。1表示红色 u_char color; // 仅1个字节的节点数据。 因为表示的空间太小,所以一般非常少使用。 u_char data; }; typedef struct ngx_rbtree_s ngx_rbtree

Java容器的常见问题

为君一笑 提交于 2020-01-07 09:24:06
记录Java容器中的常见概念和原理 参考: https://github.com/wangzhiwubigdata/God-Of-BigData#%E4%B8%89Java%E5%B9%B6%E5%8F%91%E5%AE%B9%E5%99%A8 https://blog.csdn.net/justloveyou_/article/details/78653929 基础容器 ArrayList(动态数组)、LinkedList(带头结点的双向链表) ArrayList public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 默认初始容量为 10; 扩容机制:添加元素前,先检查是否需要扩容,一般扩为源数组的 1.5 倍 + 1; 边界检查(即检查 ArrayList 的 Size):涉及到 index 的操作; 调整数组容量(减少容量):将底层数组的容量调整为当前列表保存的实际元素的大小; 在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理; LinkedList LinkedList 不但实现了List接口,还实现了Dequeue接口。因此

Java系列之HashMap篇

廉价感情. 提交于 2020-01-04 09:45:24
1 概述 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只适用于单线程环境,多线程环境可以采用并发包下的concurrentHashMap HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. Java8中又对此类底层实现进行了优化,比如引入了红黑树的结构以解决哈希碰撞 2 HashMap的数据结构 在Java中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造,HashMap也不例外. HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体. HashMap的主结构类似于一个数组,添加值时通过key确定储存位置. 每个位置是一个Entry的数据结构,该结构可组成链表. 当发生冲突时,相同hash值的键值对会组成链表. 这种数组+链表的组合形式大部分情况下都能有不错的性能效果,Java6、7就是这样设计的. 然而,在极端情况下,一组(比如经过精心设计的

Red Black Tree 红黑树 AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees Balanced search tree 平衡搜索树

点点圈 提交于 2020-01-04 03:02:56
小结: 1、红黑树:典型的用途是实现 关联数组 2、旋转 当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质。 为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树中某些结点的颜色及指针结构,以达到对红黑树进行插入、删除结点等操作时,红黑树依然能保持它特有的性质(五点性质)。 https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-2005/video-lectures/lecture-10-red-black-trees-rotations-insertions-deletions/lec10.pdf Balanced search trees Balanced search tree: A search-tree data structure for which a height of O(lg n) is guaranteed when implementing a dynamic set of n items. AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees 【1】 Example of a

0043数据结构之红黑树

狂风中的少年 提交于 2020-01-01 17:56:23
----------------------红黑树----------------------------- 红黑树仍然是一颗二分搜索树,和AVL一样,都是在二分搜索树的基础上加了一些限制条件:具体的5个限制条件如下: 1) 每个节点或者是红色的,或者是黑色的 2) 根节点是黑色的 3) 每一个叶子节点(最后的空节点叫叶子节点)是黑色的 4) 如果有一个节点是红色的,那么它的两个孩子节点都是黑色的 5) 从任意一个节点到叶子节点,经过的黑色节点是一样的 2-3树是一颗绝对平衡的树:从根节点到任意一个叶子节点经过的节点数是相同的,是通过融合(新加的节点一定是先和父亲节点融合,红黑树也是这个原理,所以红黑树新加的节点一定是红色的,即构造方法默认红色)-拆分-融合的形式来保证绝对平衡的。 红色的节点:代表他和它的父亲是融合在一起的 ,代表2-3树中的3节点 红黑树是“黑平衡”的二叉树:即红黑树限制条件的第5条,任意节点到叶子节点经过的黑色节点是相同的。 严格意思上来讲,不是平衡儿二叉树,即左右子树的高度差是有可能大于1的。红黑树最大高度2logn,所以时间复杂度是O(logn)的 红黑树与AVL树相比: 查找:红黑树略慢于AVL树 新增和删除:红黑树快于AVL树 所以如果存储的数据经常发生新增和删除:选择红黑树 如果存储的数据基本不发生变化,只是用于查询:选择AVL树

深入理解HashMap

淺唱寂寞╮ 提交于 2019-12-30 12:11:10
1、为什么用HashMap? HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射 HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改 HashMap是非synchronized,所以HashMap很快 HashMap可以接受null键和值,而Hashtable则不能(原因就是equlas()方法需要对象,因为HashMap是后出的API经过处理才可以) 2、HashMap的工作原理是什么? HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来储存Node 对象。这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Node 。   以下是HashMap初始化 ,简单模拟数据结构 Node[] table=new Node[16] 散列桶初始化,table class Node { hash;//hash值 key;//键  value;//值  node next;//用于指向链表的下一层(产生冲突,用拉链法) }

树(二叉树、红黑树及左旋右旋等调整操作)

三世轮回 提交于 2019-12-30 09:03:08
在分析Java集合类源码的时候涉及到了树的知识,发现树结构要比数组和链表等要复杂的多,所以巩固和补充一下自己这块的知识。 树 (Tree)可以有几种定义。其中一种方式是递归方式。 树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件: 有且仅有一个特定的称为根(Root)的结点; 其余的结点可分为m(m≥0)个互不相交的子集Tl,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树(SubTree)。 从定义中可以看出一棵树是N个节点和N-1条边的结合,其中一个节点叫做根。存在N-1条边是这样得出的:每条边都将某个节点连接到它的父亲,而除去根节点外,每个节点都有一个父亲。 一些树相关的基础定义: 没有子节点的节点称为 树叶 ,或 叶子节点 。 有相同父亲的节点称为 兄弟节点 。 对任意节点的 深度 是从根到该节点的唯一路径的长度。 树的 高 指的是从根节点到所有节点的路径中最常的一个。 二叉树 二叉树是一棵树,其中每个节点都不能有多余两个儿子。 树节点可以像如下实现: 1 class Node{ 2 Object element;// 存储数据 3 Node left;// 左孩子 4 Node right;// 右孩子 5 } 二叉查找树 二叉树的一个重要应用是在查找中的使用。使二叉树称为二叉查找树的性质是,对于树中的每个节点X

博客作业05--查找

帅比萌擦擦* 提交于 2019-12-30 00:53:20
1.学习总结 1.1查找的思维导图 1.2 查找学习体会 查找的内容比较多,类型也比较多,一个题的解法就很多,如果学会一些能直接调用的函数(如map)的用法,解题效率会大大提高,思路也更广。 2.PTA实验作业 2.1 题目1:是否二叉搜索树 2.2 设计思路(伪代码或流程图) 中序遍历树,并保存前驱节点至prev中 根据中序遍历是递增的有序列做 如果当前结点小于前驱结点则不是二叉搜索树 返回false 否则是二叉搜索树 返回true 2.3 代码截图 2.4 PTA提交列表说明。 2.1 题目2:二叉搜索树中的最近公共祖先 2.2 设计思路(伪代码或流程图) 判断u,v是否在树内 不在返回error 否则继续操作 若u,v有一个在根上 则返回当前根结点 若u,v不在同一边树上,则返回当前根结点 若u,v都在同一边树上,递归调用LCA,直到找到共同祖先 2.3 代码截图 2.4 PTA提交列表说明。 2.1 题目3:航空公司VIP客户查询 2.2 设计思路(伪代码或流程图) 定义map<string,int>P 输入n和k while(n--) 用name来存身份证号码 len存飞行里程 输入 身份证号码和飞行里程 存入P[name]中 输入身份证查找乘客 存在输出飞行里程 否则输出NO info 2.3 代码截图 2.4 PTA提交列表说明。 3.截图本周题目集的PTA最后排名

3分钟搞掂Set集合

醉酒当歌 提交于 2019-12-29 20:32:01
前言 声明,本文用的是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表、红黑树介绍 HashMap就是这么简单【源码剖析】 LinkedHashMap就这么简单【源码剖析】 TreeMap就这么简单【源码剖析】 ConcurrentHashMap基于JDK1.8源码剖析 现在这篇主要讲Set集合的三个子类: HashSet集合 A:底层数据结构是哈希表(是一个元素为链表的数组) + 红黑树 TreeSet集合 A:底层数据结构是红黑树(是一个自平衡的二叉树) B:保证元素的排序方式 LinkedHashSet集合 A::底层数据结构由哈希表(是一个元素为链表的数组)和双向链表组成。 这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个~ 强调: 在学习本文之前,最好是看过Map系列的文章 看这篇文章之前最好是有点数据结构的基础: Java实现单向链表 栈和队列就是这么简单 二叉树就这么简单 当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、HashSet剖析 首先,我们来看一下HashSet的继承结构图: 按照惯例,我们来看看HashSet顶部注释: 从顶部注释来看,我们就可以归纳HashSet的要点了: 实现Set接口 不保证迭代顺序 允许元素为null