红黑树

List、Set、数据结构、Collections

浪子不回头ぞ 提交于 2020-02-12 19:38:34
List、Set、数据结构、Collections 数据结构 常见的数据结构 数据存储的常用结构有: 栈、队列、数组、链表和红黑树 栈 栈 : stack ,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。 简单的说:采用该结构的集合,对元素的存取有如下的特点 先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。 栈的入口、出口的都是栈的顶端位置。 需要注意两个名词: 压栈 :就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。 弹栈 :就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。 队列 队列 : queue ,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。 简单的说,采用该结构的集合,对元素的存取有如下的特点: 先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如,小火车过山洞,车头先进去,车尾后进去;车头先出来,车尾后出来。 队列的入口、出口各占一侧。例如,下图中的左侧为入口,右侧为出口。 数组 数组 :

HashMap中的红黑树实现原理

爱⌒轻易说出口 提交于 2020-02-12 14:32:09
1.为什么要引入红黑树? 在jdk1.8 引入了红黑树的设计,当冲突的链表长度超过 8 个时,链表结构就会转为红黑树结构,这样做的好处是避免在极端条件的情况下冲突链表过长而导致查询效率非常慢。 红黑树查询 :其访问性能近似于折半查找,时间复杂度O(logn); 链表查询 :这种情况下,需要遍历全部元素才行,时间复杂度O(n); 2.红黑树的简单概念 红黑树是一种近似平衡的二叉查找树,其主要的优点就是 平衡 ,即左右子树高度几乎一致,以此来防止树退化为链表,通过这种方式来保障查找的时间复杂度为log(n); 红黑树的基本特性 1.每个节点要么是黑色,要么是红色,但根节点必须是黑色的; 2.每个红色节点的两个子节点必须是黑色的; 3.红色节点不能连续(即红色节点的孩子和父亲都不能是红色的); 4.从任意节点到其子树中每个叶子结点的路径都包含相同数量的黑色节点; 5.所有的叶子节点都是黑色的。 6.新加入到红黑树的节点为红色节点。 在树的结构发生改变时,往往会破坏条件3,4,需要通过调整使得查找树重新满足红黑树的条件。 3.红黑树的调整方式 调整可以分为两类: 一类是颜色调整,即改变某个节点的颜色,这种比较简单,直接将节点颜色进行转换即可;另一类是结构调整,改变检索树的结构关系。结构调整主要包含两个基本操作:左旋(Rotate Left),右旋(Rotate Right)。 1. 左旋

mysql索引原理

时光怂恿深爱的人放手 提交于 2020-02-12 04:40:05
为什么要使用索引?使用索引有什么优点和缺点? 使用索引是为了使我们查询变得更快。使用索引如果我们对数据进行修改或者删除那么他的索引也要随之改变,所以使用索引就会降低我们修改删除的效率。 mysql有几种索引类型? 普通索引:这一类索引可以创建在任何数据类型中,没有限制。 唯一索引:创建该类索引时,需要保证创建索引的那一列值是唯一的。 全文索引:全文索引只能创建在CHAR,VARCHAR,TEXT类型的字段上,主要是为了提高查询较大字符串的查询速度,只有MyISAM存储引擎支持 单列索引:在表中给单个列创建索引,单列索引可以是普通索引,唯一索引,全文索引 多列索引:在同一张表的多个列上创建索引 索引为什么会使查询效率大大提高? mysql默认使用的是B+树的数据结构。 索引:排好序的数据结构,类似于书的目录,我们可以通过一本书的目录,快速查找到我们需要的内容,而不需要一页一页的去查看。 mysql索引数据结构为什么要默认使用B+树,而不使用其他的数据结构? 据我了解的数据结构有,二叉树,红黑树,B树,B+树 (他们都有一个共同的特点,就是右边的数据一定都比左边的小) 二叉树: 以上两组数据虽然数字是一样的但是他们的顺序不一样,所以构建出来的二叉树不一样,通过上面这张图可以看出来,如果如果数据是从大到小或者是从小到大的顺序插入,这样会导致二叉树变为链表数据结构,链表查询效率比较慢

Java集合常见面试题

江枫思渺然 提交于 2020-02-12 02:36:28
适可而止,见好就收 来源主要是 牛客 的Java实习面经。下面的回答直接背就可以,需要一定的Java基础,适合春招实习的同学,但是我会在每个问题下把有助于理解的博客贴出来。如果发现有问题欢迎私聊我或留言我会在下面更新 Map 1. Map的底层结构 腾讯19年秋招 这个题乍一看没有什么思路(因为Map是个集合,当然也有可能是我记错了),所以我们可以先介绍一下Map然后转到HashMap中 Map是一种使用键值对存储的集合。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。 在整个Map系列中,AbstractMap抽象类实现了Map,SortedMap接口继承了Map。而我们常用的HashMap,HashTable,TreeMap和ConcurrentHashMap有继承了AbstractMap类。 其中,HashTable和ConcurrentHashMap是线程安全的。前者是通过synchronized实现的,后者是通过AQS实现的。其中要注意HashTable不能存空值,HashMap是线程不安全的,key可以为空。TreeMap通过二叉树算法实现有序集合,它实现了SortedMap接口 2. HashMap的原理 阿里17年实习,小米19年秋招本科,滴滴19年秋招本科,网易19年秋招本科

Java8新特性之引导篇----为什么速度更快

我与影子孤独终老i 提交于 2020-02-10 17:33:26
为什么要学习java8新特性? 简单而言就是使一个程序员的代码更加简洁高效,这也是语言发展的必然性,当然我这样说太笼统了,所以我特意去网上找了一张图,相信这张图就很能说明问题了。 何来速度更快? 为什么说java8速度更快呢?因为它对底层的数据结构做了改动,对垃圾回收机制(内存结构)做了改变,对并行做了一个扩展和支持,当然还有一些小的改动就不一一例举了。 数据结构的改变 最典型的就是HashMap,说到它就不得不说一下哈希表了,相信作为程序员大部分应该都知道,HashMap底层其实就是一个链表,说白了就是类似于一个数组+链表的结构(当然它还多了其它东西,嘿嘿,想知道你就得去看看HashMap详解了),然后根据索引来放你想存放的东西,而这个索引是怎么产生的呢,就是通过哈希算法产生的,所以说这一下就提高了多少的运算效率呢,如果没有它,你要放一个新元素去这个数组中,它就需要和数组中已经存在的每一个元素进行一次比较,但有了哈希表后,你每次放一个新元素,只需要计算这个新元素的哈希值,然后通过哈希值找到这个数组的索引,然后往这索引的位置插入就可以了,这样是不是就只需要比较一次了呢。 当然废了这么多话,还没说到HashMap在java7和java8中的区别(坐下,放下你手中的40米大刀),那么,你想下,每次计算到相同的hash值,新的值会代替老的值,那么它是怎么插入的呢(懂得已经懂了,嘿嘿)

数组

ⅰ亾dé卋堺 提交于 2020-02-10 04:27:23
1.List接口 ArrayList(查询快,增删慢,查询快)    内部通过数组实现,当数组大小不满足时需要增加存储能力,将已有的数组的数据复制到新的存储空间,当插入或者删除元素时候,需要对数组进行复制移动,代价高,   默认容量时10,扩容1.5倍 Vector(数组实现,线程同步)   支持线程同步,即某一时刻只有一个线程能够写vector,因为访问比ArrayList慢 LinkList(双链表结构,增删慢,查询快)    不支持高效的随机元素访问,LinkedList 是一个实现了 List 接口和 Deque 接口的双端链表。使得 LinkedList 类也具有队列的特性; LinkedList 不是线程安全的,如果想使   LinkedList 变 成 线 程 安 全 的 , 可 以 调 用 静 态 类 Collections 类 中 的 synchronizedList 方 法 : List list=Collections.synchronizedList(new LinkedList(...)); 2.Set接口     hashCode存储,如果想让两个不同的对象相等,必须覆盖object的hashCode方法和equals方法 HashSet(无序,哈希表)    按照哈希值存取数据,通过hashcode方法来获取,HashSet首先判断两个元素的哈希值

Java集合之Map

廉价感情. 提交于 2020-02-09 19:41:32
原本我是打算继续将Collection下的Set集合的,结果看了源码发现:Set集合实际上就是HashMap来构建的! 所以,就先介绍Map集合、散列表和红黑树吧! 看这篇文章之前最好是有点数据结构的基础: Java实现单向链表 栈和队列 二叉树 当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、Map介绍 1.1为什么需要Map Collection叫做集合,它可以快速查找现有的元素。 而Map在《Core Java》中称之为–>映射… 映射的模型图是这样的: 那为什么我们需要这种数据存储结构呢???举个例子 作为学生来说,我们是根据学号来区分不同的学生。只要我们知道学号,就可以获取对应的学生信息。这就是Map映射的作用! 生活中还有很多这样的例子:只要你掏出身份证(key),那就可以证明是你自己(value) 1.2Map与Collection的区别 1.3Map的功能 下面我们来看看Map的源码: 简单常用的Map功能有这么一些: 下面用红色框框圈住的就是Map值得关注的子类: 二、散列表介绍 无论是Set还是Map,我们会发现都会有对应的–>HashSet,HashMap 首先我们也先得回顾一下数据和链表: 链表和数组都可以按照人们的意愿来排列元素的次序,他们可以说是有序的(存储的顺序和取出的顺序是一致的) 但同时,这会带来缺点:想要获取某个元素

Mysql索引那些事情

冷暖自知 提交于 2020-02-09 03:22:20
什么是索引? 索引在搜索引擎优化简单解释 指已经被收录且参与关键词排名的页面。 索引的通俗解释 索引就像是图书的目录,根据目录中的页码快速找到所需内容。 索引在百度百科中的解释 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 MySQL官方对索引的定义为: 索引(Index)是帮助MySQL高效获取数据的数据结构。我们可以简单理解为:**快速查找排好序的一种数据结构。**Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引) 有哪些索引算法 hash算法 什么是hash 如果有编程经验的小伙伴都知道不管是哪种语言都是有hash实现,简单来说就是一个 key 通过一个 hash(key) 算法后得到一个固定长度值,可以通过这个计算后的值与存放数据容器长度取模后的值做索引,快速定位元素( 可以看作类似数组索引 ),查询时间复杂度为O(1),在java里面一个对象可以重写hashCode()方法。 hash数据结构 存在问题 只支持等值索引定位 hash算法虽然能快速定位元素位置,时间复杂度O(1)查询速度是相当可观的, but 这个作为 mysql

JDK1.8新特性

痴心易碎 提交于 2020-02-08 18:11:20
概述 速度更快 – 红黑树 代码更少 – Lambda 强大的Stream API – Stream 便于并行 – Parallel 最大化减少空指针异常 – Optional 1:HashMap 有人会在问你HashMap的时候会问你JDK1.7和1.8有什么变化; 主要还是HashMap中链长度大于8时采取红黑树的结构存储。(1.7的时候是链表结构) 红黑树,除了添加,效率高于链表结构。 2:ConcurrentHashMap Jdk1.7时隔壁级别CocnurrentLevel(锁分段机制)默认为16。 JDK1.8采取了CAS算法 CAS原理主要涉及的有:锁机制、CAS 操作;具体可以参考CAS原理分析 3:Jdk1.8没有永久区,取而代之的是MetaSpace元空间,用的是物理内存。 3、Lambda表达式 1、Lambda表达式的基础语法:Java8引入了一个新的操作符“->”,该操作符成为箭头操作符或者Lambda操作符,箭头操作符将Lambda表达式拆分成两部分 左侧:Lambda表达式的参数列表 右侧:Lambda表达式中所需执行的功能,即Lambda体。 4、并行流 Fork/Join框架: 在必要的情况下,将一个大任务进行必要的拆分Fork成若干个小任务,再将小任务的运算结果进行Join汇总。 Fork/Join框架和传统线程池的区别: 采用“工作窃取”模式

红黑树理解

梦想的初衷 提交于 2020-02-08 12:31:58
红黑树的核心原理: 1.没有两个相邻的红节点 2.从根节点到所有叶子节点的黑节点数目一样 抓住这2个核心就抓住红黑树的本质.之后去理解红黑树的特性. 红黑树的特性 1.查询效率log(n),这个和二叉搜索树一样,但不会退化成链表 为什么不会退化成链表:从上面2条,设最短路径为n,则最长路径为2n,所以是大体平衡 2.没有AVL树那么要求平衡,所以插入,删除时旋转次数少,效率高 红黑树插入规则 1.每次插入红节点 2.如果是根,变成黑 3.如果父节点是黑,完成 证明:如果父节点是黑,插入一个红节点,则不影响这条路径上黑节点的数目,所以符合原理得1和2 4.如果父节点是红,叔父是红 证明:现在原理2符合,但原理1不符合,所以将父和叔父涂黑,符合原理1,但祖父这一支,现在多了一个黑节点,所以将祖父涂红,然后把祖父当作插入节点继续处理 5.如果父是红,叔父是黑 如果自己和父节点不是一侧,先把自己和父节点转到一侧,以父节点为中心,转,把祖父变成父的儿子,转完之后父节点涂黑,父节点的2个儿子都为红 证明,这么做的目的是为了从祖父节点开始的这一支,每条路经上没有增加黑节点,为了满足原理1,2 来源: CSDN 作者: idealemail 链接: https://blog.csdn.net/idealemail/article/details/104219011