红黑树

Redis 面试题汇总

本小妞迷上赌 提交于 2020-02-07 15:18:32
Redis 面试题汇总 1.Redis 使用场景有哪些? 答:Redis 使用场景如下: 记录帖子点赞数、点击数、评论数 缓存近期热帖 缓存文章详情信息 记录用户会话信息 2.Redis 有哪些功能? 答:Redis 功能如下: 数据缓存功能 分布式锁的功能 支持数据持久化 支持事务 支持消息队列 3.Redis 支持哪些数据类型? 答:Redis 支持的数据类型如下: String 字符串 List 列表 Set 无序集合 ZSet 有序集合 Hash 哈希类型 4.Redis 相比 Memcached 有哪些优势? 答:Redis 相比 Memcached 优势如下: Memcached 所有的值均是简单的字符串,Redis 支持更为丰富的数据类型 Redis 的速度比 Memcached 要快 Redis 可以持久化 Redis 可以设置过期时间 Redis 支持主从同步 5.Redis 支持哪些淘汰策略? 答:Redis 淘汰策略如下: noeviction:禁止淘汰数据; allkeys-lru:尝试回收最少使用的键,使得新添加的数据有空间存放; volatile-lru:尝试回收最少使用的键,但仅限于在过期集合的键,使得新添加的数据有空间存放; allkeys-random:回收随机的键使得新添加的数据有空间存放; volatile-random

树的概念

﹥>﹥吖頭↗ 提交于 2020-02-07 12:05:07
一、二叉树 1. 定义 二叉树的每个节点最多只有两棵子树,且子树有左右之分,次序不能颠倒。 2. 几种特殊的二叉树 (1)满二叉树(完美二叉树):所有非叶子节点均有两个子节点,所有叶子节点必须在同一层上。节点数达到最大值。 (2)完全二叉树:若设二叉树的深度为h,除第h层外,其它各层的节点数都达到最大值,第h层所有的节点都连续集中在最左边。 (3)完满二叉树:所有非叶子节点的度都是2。 二、二叉排序树 1. 定义 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值; (2)若有子树不空,则有子树上所有节点的值均大于或等于它的根节点的值; (3)左、右子树也分别为二叉排序树; (4)没有键值相等的节点。 2. 特性 对二叉排序树进行中序遍历,即可得到有序的数列。 3. 应用 可用于数据查找,其时间复杂度与二分查找一样。 二叉排序树的高度决定了二叉排序树的查找效率。 三、平衡二叉树 1. 为什么需要平衡二叉树 在某些极端情况下,二叉排序树将退化成近似链或链,其操作的时间复杂度将退化成线性的,为了防止这种情况的出现,需要使用某种算法来维持二叉排序树的平衡性,于是便有了平衡二叉树。 2. 定义 平衡二叉树又被称为AVL树,且有以下性质:它是一棵空树或它的左右两棵子树的高度差的绝对值不超过1

数据结构——红黑树

别来无恙 提交于 2020-02-06 18:37:38
文章目录 1 引言 2 定义 定义节点名称: 3 性质 4 2-3-4树和红黑树的等价关系 5 查找 6 插入 6.1(情景3) 插入节点的父节点为黑色 6.2(情景4) 插入节点的父节点为红色,叔叔节点为黑色 6.2.1(情景4.2.1) 父节点P为G左孩子,插入位置为左孩子 6.2.2(情景4.2.2) 父节点P为G左孩子,插入位置为右孩子 6.2.3(情景4.3.1) 父节点P为G右孩子,插入位置为右孩子 6.2.4(情景4.3.2) 父节点P为G右孩子,插入位置为左孩子 6.3(情景4.1) 插入节点的父节点为红色,叔叔节点为红色 6.3.1(情景4.1) 插入位置为左子树 6.3.2(情景4.1) 插入位置为右子树 7 删除 删除情景1:替换结点是红色结点 7.1 删除红色叶子节点 7.2 删除红色节点,只有左子树或只有右子树 7.3 删除红色节点,既有左子树又有右子树 7.4 删除的黑色节点仅有左子树或者仅有右子树 7.5 删除黑色的叶子节点 8 总结 9 思考题和习题答案 思考题1:黑结点可以同时包含一个红子结点和一个黑子结点吗? 习题1:请画出图15的插入自平衡处理过程。 习题2:请画出图29的删除自平衡处理过程。 推荐阅读 1 引言 红黑树 是 树 的 数据结构 中最为重要的一种。 Java 的容器 TreeSet 、 TreeMap 均使用 红黑树 实现。

红黑树插入删除算法思想

萝らか妹 提交于 2020-02-06 06:06:55
一、红黑树介绍 红黑树是特殊的二叉查找树,具有以下五个特点: (1) 节点为黑色或红色 (2)根节点为黑色 (3) 红色节点不能连续 (4)根节点到NIL节点的各个路径上黑色节点数量相同 (5)NIL节点为黑色,NIL节点为叶节点的空的孩子 根据性质(4)可知,红色节点具有0或2个孩子。 二、左旋和右旋 在红黑树删除和插入之后,为了保持红黑树的状态,可能需要用到左旋和右旋两种操作,左旋和右旋操作不改变红黑树是二叉查找树的特点。 (1)左旋 (2)右旋 三、插入算法思想 红黑树在插入新节点时可能会改变红黑树的性质,在新节点插入时,需要根据以下几种情况做相应的操作,新节点插入默认为红色(对红黑树平衡影响最小),插入的节点都会成为叶节点。假设插入节点(当前节点)为Q,父节点为P,叔父节点为B,祖父节点为G,插入新节点时会遇到一下几种情况,可根据不同的情况做不同的操作。 P B G (1) 黑 红/黑 黑/红 (2) 红 红 黑 (3) 红 黑 黑 (1)直接插入新节点 (2)插入Q后,将P和B变成黑色,G变为红色,再将G视为Q,进行下一轮的判断,进入平衡调节阶段。 (3)a、若Q为P的左子,P为G的左子,则调换P和G 的颜色,并对P进行右旋,完成调节 b、若Q为P的右子,P为G的左子,先对P进行左旋,转化为情况a。 c、若Q为P的右子,P为G的右子,则调换P和G的颜色,并对P进行左旋

浅谈红黑树

会有一股神秘感。 提交于 2020-02-06 01:15:06
红黑树是什么? 其实也是平衡二叉树,只是给每个节点标了红黑颜色 为什么需要红黑树? 红黑树其实基础还是二叉查找树,只是因为二叉查找树很容易出现不平衡的情况,最坏情况相当于O(n),红黑树和AVL树应运而生,AVL树的话,因为平衡度要求是[-1,1]太严格,所以插入和删除的时候的效率并不是很高,比不上红黑树,但是因为平衡度是[-1,1],所以查找速度比红黑树快,AVL适用于频繁查找,红黑树适用于频繁插入和删除 红黑树五大特性 1,每个节点不是黑色就是红色 2,根节点肯定是黑色 3,叶子节点肯定是黑色 4,红色节点的叶子节点肯定是黑色(也就是没有两个红色节点连续) 5,从树的任意一个节点出发往叶子走的所有路径,经过的黑色节点数肯定相同 基于这些特性形成了红黑树的平衡,(任意一个节点出发到叶子节点的最长路径肯定不超过最短路径的一倍),因为最短的肯定是全黑,最长肯定是红黑交叉 查找,插入,删除大部分操作和二叉查找树相同,只是多了要修改平衡的地方,下面特别说一下插入和删除 红黑树有三大操作,基于这些操作才完成的平衡 1,换色 把红色改成黑的,黑的改成红的 2,左旋 和二叉查找一样,不做赘述 3,右旋 和二叉查找一样,不做赘述 插入三大步骤 1,像二叉查找树一样找到插入位置插入节点 2,把插入的节点标记成红色(因为插入红色才不会影响第五条特性) 3,如果破坏平衡,进行修复 插入节点的几种情况

map映照容器

爷,独闯天下 提交于 2020-02-03 13:41:04
set和map都是泛型库对二叉树的一个泛化。 一、map的相关原理 map映照容器所处理的元素数据,与数据库中的具有键值的记录非常相似,由一个键值和其它若干个数据(映照数据组成),键值和映照数据之间,可建立一个数学上的映照关系。容器的数据结构是采用红黑树进行管理,元素值不允许重复,所使用的节点元素的比较函数,只对元素的键值进行比较,元素的各个数据项可通过键值检索。 数据构成如图所示: (一个pair对象) 如图所示为map容器的一个元素的数据组成,可通过pair封装成一个结构对象。map容器所要做的,就是将这个pair对象插入到红黑树中,完成一个元素的添加,同时,也要提供一个仅使用键值进行比较的函数对象,将它传递给红黑树。由此,就可以利用红黑树的操作,map元素数据插入到二叉树的正确位置,也可以根据键值进行元素的删除和检索。 map通过内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在std map内部所有的数据都是有序的。 二、map的应用 1、创建 (2)map() 利用默认的less<T>函数对象和内存分配器,创建一个没有任何元素的map对象。 map<char,int,greater<char> >m; //创建空map对象,元素的键值类型为char,元素的映照数据类型为int,键值的比较函数对象为greater<char>. (2

数据结构之HashMap详解(一)

醉酒当歌 提交于 2020-02-03 07:30:03
在之前有一篇博客介绍了HashMap, 数据结构之Hash表(哈希表) 现在对之前的内容做一个补充。 说HashMap之前,看下数组: 数组的优点在于查找速度快,每个区域都是紧挨着的,并且有下标,可以根据下标快速找到要查找的元素。 缺点:增删麻烦,如果在第二个元素后面再添加个元素的话,那么就需要重新建一个数组,填入对应的信息。 链表:每个内存除了存放自身的元素外,还保留下个内存区域的地址, 优点:插入新元素方便,只需要将指针指向新元素,新元素指向原来的下一个指针即可。 缺点:查找速度慢。链表不像数组那样有下标,链表查找元素只能从head结点开始,一个一个向下找。 而散列表则是综合了两者优点于一身的结构: 上面是数组,数组每个区域内是链表。 说到散列表,就应当说哈希,没有哈希,散列表就无法寻址找数据, 哈希 哈希:Hash也称散列、哈希,对应的英文都是Hash,基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出,这个映射的规则就是对应的Hash算法,而原始数据映射后的二进制串就是哈希值。 Hash特点: 1、hash值不可以反向推导出原始的数据 2、输入的数据的微小变化会得到完全不同的hash值,相同的数据可以得到相同的值。 3、哈希算法的执行效率要高效 4、hash算法的冲突概率要小 hash原理是将输入空间的值映射成hash空间内

红黑树解决了什么问题

时光毁灭记忆、已成空白 提交于 2020-02-02 10:53:12
/** * 平衡二叉树:就是为了防止二叉搜索树变为线性数据结构,而出现的数据结构 * 而AVL树-绝对平衡树.左右子树的高度差不能超过1 * 红黑树:特性: * 1.每个结点不是红色就是黑色 * 2.根节点:一定是黑色的 * 3.不可能有两个红色的节点连在一起,每个叶子节点都是黑色的空节点(NIl),并且不存储数据 * 4.每个节点,从该结点到达其可到达的叶子节点的所有路径,都包含相同树目的黑色节点 * 为什么要用红黑树, * 三个操作: * 1.变色: * 2.左旋: 指针的变化 * 3.右旋:指针的变化 * 什么时候左旋?什么时候右旋呢? * 所有新加的点一定是红色 * 红黑树建立的基础就是在二叉查找树的基础之上的.解决了二叉查找树的线性问题;进行平衡性; */ 来源: CSDN 作者: 航海到IT的转变,梦想一直在路上 链接: https://blog.csdn.net/wb_zjp283121/article/details/104139579

剑指Offer(类库)——HashMap、HashTable、ConcurrentHashMap(上)

℡╲_俬逩灬. 提交于 2020-02-02 03:02:50
Map是由一对对的key-value组成的,key要求是唯一的,value不要求。 通过看源码可以得出:key自带去重功能是Set类型的,value是Collection接口可存放任意集合。 来看一下Map的实现类: HashMap、HashTable、ConcurrentHashMap之间的区别? HashMap JDK8之前HashMap是由数组+链表组成的,数组查找快增删慢,链表增删快查找慢,HashMap结合了两者的优势,HashMap不是线程安全的效率很高,组织键位如图: 没有给HashMap初始长度的时候 HashMap默认初始长度是16 ,初始长度16的数组中每个数组的位置存放的是 链表的头结点 ,可以通过模运算得到头结点的存放位置:hash(key.hashCode())%len,hashCode的运算本身是通过位运算得到的。 但是存在一种特殊情况,通过模运算得到的位置每次都是同一个这样的话就不断在一条链表中去插入, 最坏的情况是时间复杂度从O(1)变成O(n)。 JDK8之后对HashMap进行了优化,将原先的HashMap由 数组+链表 组成的道理变成了 数组+链表+红黑树 。 添加红黑树之后再次遇到特殊的情况时就可以使用 TREEIFY_THRESHOLD 去判断是否将链表转换成一颗红黑树,这种情况下 最坏的时间复杂度从O(n)变成O(nlogn)。

红黑树算法原理

拜拜、爱过 提交于 2020-02-01 15:58:53
原文: 红黑树深入剖析及Java实现 ,本文修改了原文的一些小错误,如果想看红黑树的Java实现可以到原文去看。 红黑树是平衡二叉查找树的一种 。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小,右节点的值要比父节点的值大。 它的高度决定了它的查找效率。 在理想的情况下,二叉查找树增删查改的时间复杂度为O(logN)(其中N为节点数),最坏的情况下为O(N)。当它的高度为logN+1时,我们就说二叉查找树是平衡的。 BST的查找操作 T key = a search key Node root = point to the root of a BST while ( true ){ if (root== null ){ break ; } if (root.value.equals(key)){ return root; } else if (key.compareTo(root.value)< 0 ){ root = root.left; } else { root = root.right; } } return null ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 从程序中可以看出,当BST查找的时候