红黑树

2019求职记录——支付宝(Java面经)3轮技术面+1轮HR面

主宰稳场 提交于 2019-11-28 18:44:36
现如今跳槽已经成为程序员的一个重要话题。很少有程序员能在公司呆10年以上。对于许多程序员来说,像阿里腾讯这样的大公司也是程序员职业生涯追求的目标。 另外,大家要明确的很重要的几点是: 1. 写在简历上的东西一定要慎重,这可能是面试官大量提问的地方; 2. 大部分应届生找工作的硬伤是没有工作经验或实习经历; 3. 将自己的项目经历完美的展示出来非常重要。 笔主能力有限,如果有不对的地方或者和你想法不同的地方,敬请雅正、不舍赐教。 一面 介绍项目 JVM中的老年代在什么情况下会触发GC? CMS的垃圾回收步骤,G1和CMS的区别? CMS哪个阶段是并发的,哪个阶段是串行的? 谈谈Java线程池,线程池中几个参数含义 谈谈你了解的J.U.C包的JDK源码(CAS、AQS、ConcurrentHashMap、ThreadLocal、CyclicBarrier、CountDownLatch、Atom、阻塞队列等等) JVM性能调优的方法和步骤,JVM的关键性核心参数配置 Java线程锁有哪些,优劣势 HashMap的实现原理,JDK1.8做了哪些修改? 画一个完整的多线程状态图 都知道什么排序,希尔排序,归并排序,快排都如何实现,还有复杂度问题 讲一讲红黑树,以及红黑树插入一个结点的时间复杂度 mysql如何在RR隔离级别下避免幻读问题 mysql范式和反范式的区别以及彼此的优缺点 ava

HashMap源码分析

会有一股神秘感。 提交于 2019-11-28 18:34:20
概述 源码分析 继承结构 Cloneable:能够使用Clone()方法,在HashMap中,实现的是浅层次拷贝,即对拷贝对象的改变会影响被拷贝的对象。   Serializable:能够使之序列化,即可以将HashMap对象保存至本地,之后可以恢复状态。 类的属性 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { // 序列号 private static final long serialVersionUID = 362498820763181265L; // 默认的初始容量是16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 最大容量 static final int MAXIMUM_CAPACITY = 1 << 30; // 默认的填充因子 static final float DEFAULT_LOAD_FACTOR = 0.75f; // 当桶(bucket)上的结点数大于这个值时会转成红黑树 static final int TREEIFY_THRESHOLD = 8; // 当桶(bucket)上的结点数小于这个值时树转链表 static final int

红黑树的简易实现

拜拜、爱过 提交于 2019-11-28 16:28:29
肝了好几个小时的成品 大概通过了洛谷11/12个测试点(其中一个TLE,时限开的太紧了) 简易说明: 1.add的旋转分类参考自算法第4版实现 2.删除使用了LAZY标记,分类删除?不存在的 题面 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入xxx数 删除xxx数(若有多个相同的数,因只删除一个) 查询xxx数的排名(排名定义为比当前数小的数的个数+1+1+1。若有多个相同的数,因输出最小的排名) 查询排名为xxx的数 求xxx的前驱(前驱定义为小于xxx,且最大的数) 求xxx的后继(后继定义为大于xxx,且最小的数) 输入格式 第一行为nnn,表示操作的个数,下面nnn行每行有两个数optoptopt和xxx,optoptopt表示操作的序号( 1≤opt≤6 1 \leq opt \leq 6 1≤opt≤6 ) 输出格式 对于操作3,4,5,63,4,5,63,4,5,6每行输出一个数,表示对应答案 输入样例 10 1 106465 4 1 1 317721 1 460929 1 644985 1 84185 1 89851 6 81968 1 492737 5 493598 输出样例 106465 84185 492737 import java.io.*; import java.util.ArrayList; import

hashmap原理

一个人想着一个人 提交于 2019-11-28 16:27:25
百度首页 马明亮千里之外 java中HashMap原理?面试?你是谁,你在哪? 会java的鸭子 发布时间:18-11-3017:22 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] 散列桶初始化,tableclass Node {hash;//hash值

B树、B+树、红黑树

懵懂的女人 提交于 2019-11-28 16:13:51
https://blog.csdn.net/z_ryan/article/details/79685072 引言 我们都知道二叉查找树的查找的时间复杂度是O(log N),其查找效率已经足够高了,那为什么还有B树和B+树的出现呢?难道它两的时间复杂度比二叉查找树还小吗?   答案当然不是,B树和B+树的出现是因为另外一个问题,那就是磁盘IO;众所周知,IO操作的效率很低,那么,当在大量数据存储中,查询时我们不能一下子将所有数据加载到内存中,只能逐一加载磁盘页,每个磁盘页对应树的节点。造成大量磁盘IO操作(最坏情况下为树的高度)。平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。   所以,我们为了减少磁盘IO的次数,就你必须降低树的深度,将“瘦高”的树变得“矮胖”。一个基本的想法就是:   (1)、每个节点存储多个元素   (2)、摒弃二叉树结构,采用多叉树 这样就引出来了一个新的查找树结构 ——多路查找树。 根据AVL给我们的启发,一颗平衡多路查找树(B~树)自然可以使得数据的查找效率保证在O(logN)这样的对数级别上。 下面来具体介绍一下B树(Balance Tree), B树 一个m阶的B树具有如下几个特征:B树中所有结点的孩子结点最大值称为B树的阶,通常用m表示。一个结点有k个孩子时,必有k-1个关键字才能将子树中所有关键字划分为k个子集。 1

红黑树二叉查找树二叉排序树的理解

断了今生、忘了曾经 提交于 2019-11-28 13:53:51
https://blog.csdn.net/chudelong1/article/details/82698010 感谢,自己记个笔记 二叉查找树(BST)具备什么特性呢? 1.左结点小于或等于根结点的值。 2.右结点大于或等于根结点的值。 3.左、右子树也分别为二叉排序树。 查找 10 很方便查找,等同于二分法查找。 缺点: 如果依次插入如下五个节点:7,6,5,4,3。 虽然也是二叉排序树,这样性能就会很差了。 下面开始说 红黑树 1.节点是红色或黑色。 2.根节点是黑色。 3.每个叶子节点都是黑色的空节点(NIL节点)。 4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 下图中这棵树,就是一颗典型的红黑树: 至于怎么插入数据,一定注意 插入完数据之后要符合上面的所有规则。 如果不符合规则呢?那么要做的操作包括 变色(调整颜色)、旋转(左旋转、右旋转) 变色好理解,就是红的变黑的,黑的变红的。 旋转呢?这也是红黑树自平衡的一个重要操作。 左旋转: 逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为自己的左孩子。说起来很怪异,大家看下图: 图中,身为右孩子的Y取代了X的位置,而X变成了自己的左孩子。此为左旋转。 右旋转: 顺时针旋转红黑树的两个节点

mysql索引数据结构

非 Y 不嫁゛ 提交于 2019-11-28 11:30:31
什么是索引?索引就是排好序的数据结构,可以帮助我们快速的查找到数据 推荐一个网站,可以演示各种数据结构:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html --------------------------------------------------------------- 图解几种数据结构: 二叉树:如果数据是单边增长的情况 那么出现的就是和链表一样的数据结构了,树高度大 红黑树:在二叉树的基础上多了树平衡,也叫二叉平衡树,不像二叉树那样极端的情况会往一个方向发展。 同样我们查找6,在二叉树中我们需要经过6个节点才能找到(1-2-3-4-5-6),红黑树中我们只需要3个节点(2-4-6),但是mysql索引的数据结构并不是红黑树,因为如果数据量大了之后,树的高度就会很大。 B树:在红黑树的基础上,每个节点可以存放多个数据 这个时候我们查找6 只需要2个节点就可以了,而且树的高度也比红黑树矮。 B+树:B树的变种 你会发现非叶子节点是会重复的,就像上面4,在叶子节点上面也出现了4,这是为什么呢?因为它需要在叶子上面存放数据。那又是怎么存放数据的呢? --------------------------------------------------------------- mysql索引为什么用B

自平衡方式--旋转

耗尽温柔 提交于 2019-11-28 08:27:57
关键字:AVL、插入、删除 前言:  平衡二叉树和AVL树这两个概念的区分:平衡二叉树是对这样一种数据结构的定义,是一种描述;而AVL树则是对这样子一种数据结构的实现。同红黑树和B树等一样,都是对这样一种结构的实现,同时都是具有自平衡特性的。  AVL树是最早的被发明的自平衡二叉树 1、定义:   ①左子树和右子树都是AVL树   ②左子树和右子树的高度差不能超过1 2、性质:   ①一棵n个结点的AVL树的其高度保持在0(log2(n)),不会超过3/2log2(n+1)   ②一棵n个结点的AVL树的平均搜索长度保持在0(log2(n)).   ③一棵n个结点的AVL树删除一个结点做平衡化旋转所需要的时间为0(log2(n)). 3、AVL树添加新节点: (1)找到插入节点的位置,然后插入节点 (2)"插入修复": 首先确定不平衡起始点,然后按照自平衡的旋转策略(左旋、右旋)进行相应的操作(详见: 自平衡方式--旋转 ) 4、AVL树删除节点: (1)找到替换节点。   ①如果删除节点是叶子节点,那么替换节点就是NULL;   ②如果删除节点有一个子节点,那么替换节点就是其左子节点或者右子节点;(如果删除节点有一个子节点,那么这个子节点肯定是叶子节点,要满足AVL严格平衡的特性。)   ③如果删除节点有两个孩子,那么中序遍历的后继节点就作为替换节点 (2

HashMap三百问

喜你入骨 提交于 2019-11-28 06:13:37
文章目录: 一、JDK1.7之HashMap 二、JDK1.8之HashMap 三、Hashtable JDK1.7之HashMap 1. 定义 HashMap实现了Map接口,继承AbstractMap。其中Map接口定义了键映射到值的规则,源码如下: 1 public class HashMap<K,V> 2 extends AbstractMap<K,V> 3 implements Map<K,V>, Cloneable, Serializable HashMap是一种支持 快速存取 的数据结构。 2. 构造函数 HashMap提供了三个构造函数: HashMap():构造一个具有默认 初始容量 (16) 和 默认加载因子 (0.75) 的空 HashMap。 HashMap(int initialCapacity):构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。 HashMap(int initialCapacity, float loadFactor):构造一个带指定初始容量和加载因子的空 HashMap。 在这里提到了两个参数:初始容量,加载因子。这两个参数是影响HashMap性能的重要参数,其中容量表示哈希表中桶的数量,初始容量是创建哈希表时的容量,加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度

【数据结构】8.java源码关于HashMap

℡╲_俬逩灬. 提交于 2019-11-28 06:03:00
1.hashmap的底层数据结构 众所皆知map的底层结构是类似邻接表的结构,但是进入1.8之后,链表模式再一定情况下又会转换为红黑树 在JDK8中,当链表长度达到8,并且hash桶容量超过64(MIN_TREEIFY_CAPACITY),会转化成红黑树,以提升它的查询、插入效率底层哈希桶的数据结构是数组,所以也会涉及到扩容的问题。 当MyHashMap的容量达到threshold域值时,就会触发扩容。扩容前后,哈希桶的长度一定会是2的次方。 1.1 为什么用红黑树 那么为什么用红黑树呢?之前都是用的链表,之前的文章有提到链表的随机访问效率是很低的,因为需要从head一个个往后面找,那么时间复杂度就是O(n),但是如果是红黑树因为红黑树是平衡二叉树,说白了就是可以索引的,那么时间复杂度只有O(logn),这样效率就可以得到很大的提高 也许有人就想问了,那为什么还搞个链表啊,直接用红黑树不就完了: 1.链表比红黑树简单,构造一个红黑树要比构造链表复杂多了,所以在链表不多的情况下,整体性能上来看,当链表不长的时候红黑树的性能不一定有链表高 2.还有一个节点的添加和删除的时候,需要对红黑树进行旋转,着色等操作,这个就比链表的操作复杂多了 3.所以为链表设置一个阈值用来界定什么时候进行树化,什么时候维持链表,从中间取得一个均衡是很重要的 1.2 为什么阈值是64,链表长度到8