treemap

通过2-3树理解红黑树

无人久伴 提交于 2020-05-02 09:06:48
一、简介   前面的文章我们循序渐进的讲解了 《二叉树》 《二分搜索树》 《AVL-平衡二叉树》 ,从左至右互为基础。尤其是二分搜索树给了我们如何将数据组织成为搜索树的思想,当然二分搜索树存在的天然问题--在极端情况下回退化为链表。所以引出了AVL-平衡二叉树,通过再平衡即LL,LR,RR,RL四个旋转操作维护了一棵平衡的二分搜索树。本章节我们继续梳理一个高阶的树结构即:红黑树。想必大家都知道,红黑树如何维持平衡,如何进行颜色反转让人很难理解,虽然很多博文很多书对红黑树都有讲解,但是想要掌握或者精通红黑树依然让大家望而生畏。本文,我们借鉴《算法-4》对红黑树的分析,从2-3树入手来理解红黑树。至于为什么从2-3树入手去理解红黑树是有原因的,就像达尔文的进化论,任何一个物种都不会是从石头中蹦出来的一样。数据结构的发展同样遵循着生物进化的理论。红黑树正是从2-3树进化来的一种树结构。   后面会持续更新数据结构相关的博文。   数据结构专栏: https://www.cnblogs.com/hello-shf/category/1519192.html   git传送门: https://github.com/hello-shf/data-structure.git 二、2-3树   2.1、2-3树的性质   2-3树类似于一棵完美二叉树(满二叉树),不过就是2

[Java核心技术]第九章-集合(映射-HashMap&TreeMap)

半腔热情 提交于 2020-05-01 04:29:07
###HashMap ####基本操作 HashMap<Integer,Integer> firstAccurMap=new HashMap<Integer,Integer>(); firstAccurMap.put(0, -1); firstAccurMap.containsKey(sum-k); int begPos=firstAccurMap.get(sum-k); ####HashMap底层实现 在JDK1.6,JDK1.7中,HashMap采用 位桶+链表 实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。 而JDK1.8中,HashMap采用 位桶+链表+红黑树 实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。 ####散列表 #####定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问>记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)

互联网 Java 工程师面试题(Java 面试题五)

旧巷老猫 提交于 2020-04-30 23:52:54
JVM 底层 与 GC(Garbage Collection) 的面试问题 31、64 位 JVM 中,int 的长度是多数? Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就 是说,在 32 位 和 64 位 的 Java 虚拟机中,int 类型的长度是相同的。 32、Serial 与 Parallel GC 之间的不同之处? Serial 与 Parallel 在 GC 执行的时候都会引起 stop-the-world。它们之间主要 不同 serial 收集器是默认的复制收集器,执行 GC 的时候只有一个线程,而 parallel 收集器使用多个 GC 线程来执行。 33、32 位和 64 位的 JVM,int 类型变量的长度是多数? 32 位和 64 位的 JVM 中,int 类型变量的长度是相同的,都是 32 位或者 4 个字节。 34、Java 中 WeakReference 与 SoftReference 的区别? 虽然 WeakReference 与 SoftReference 都有利于提高 GC 和 内存的效率, 但是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而软引用 虽然不能阻止被回收,但是可以延迟到 JVM 内存不足的时候。 35、WeakHashMap 是怎么工作的? WeakHashMap

Java集合/泛型面试题(含答案)

可紊 提交于 2020-04-30 14:57:00
1、ArrayList和linkedList的区别 Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。 Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据, (因为删除数据以后, 需要把后面所有的数据前移) 缺点: 数组初始化必须指定初始化的长度, 否则报错 例如: List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。 List有两个重要的实现类:ArrayList和LinkedList ArrayList: 可以看作是能够自动增长容量的数组 ArrayList的toArray方法返回一个数组 ArrayList的asList方法返回一个列表 ArrayList底层的实现是Array, 数组扩容实现 LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.当然,这些对比都是指数据量很大或者操作很频繁。 2、 HashMap和HashTable的区别 1、两者父类不同 HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化

Java集合/泛型面试题(含答案)

我的梦境 提交于 2020-04-30 14:42:04
1、ArrayList和linkedList的区别 Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。 Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据, (因为删除数据以后, 需要把后面所有的数据前移) 缺点: 数组初始化必须指定初始化的长度, 否则报错 例如: List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。 List有两个重要的实现类:ArrayList和LinkedList ArrayList: 可以看作是能够自动增长容量的数组 ArrayList的toArray方法返回一个数组 ArrayList的asList方法返回一个列表 ArrayList底层的实现是Array, 数组扩容实现 LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.当然,这些对比都是指数据量很大或者操作很频繁。 2、 HashMap和HashTable的区别 1、两者父类不同 HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化

StackOverflow 上面最流行的 7 个 Java 问题!

为君一笑 提交于 2020-04-29 13:10:20
StackOverflow发展到目前,已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西。 这篇文章是在我们审阅了StackOverflow上最流行的 Java 问题以及答案后从中挑出来的。即使你是一个有丰富经验的开发者,也能从中学到不少东西。 一、分支预测 问题链接: https://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array StackOverflow上最多投票的一个Java问题是: 为什么处理一个排序数组要比非排序数组快的多 。 为了回答这个问题,你需要使用分支预测(branch prediction)。分支预测是一种架构,旨在通过在真实的路径发生前猜测某一分支的下一步来提升处理过程。 分支在这里即一个if语句。这样的话,如果是一个排序数组,那么分支预测将会进行,否则不会进行。 StackOverflow上的一个回答者,链接: http://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array

20172303 2018-2019-1 《程序设计与数据结构》实验二报告

百般思念 提交于 2020-04-29 12:48:10
20172303 2018-2019-1 《程序设计与数据结构》实验二报告 课程:《程序设计与数据结构》 班级: 1723 姓名: 范雯琪 学号:20172303 实验教师:王志强 助教:张师瑜/张之睿 实验日期:2018年11月5日 必修/选修: 必修 实验内容 本次实验主要是关于树的应用, 涉及了二叉树、决策树、表达式树、二叉查找树、红黑树五种树的类型,是对最近学习内容第十章和第十一章的一个总结。 节点一 参考教材P212,完成链树LinkedBinaryTree的实现(getRight,contains,toString,preorder,postorder),用JUnit或自己编写驱动类对自己实现的LinkedBinaryTree进行测试。 节点二 基于LinkedBinaryTree,实现基于(中序,先序)序列构造唯一一棵二㕚树的功能,比如给出先序ABDHIEJMNCFGKL和中序HDIBEMJNAFCKGL,构造出附图中的树,用JUnit或自己编写驱动类对自己实现的功能进行测试。 节点三 自己设计并实现一颗决策树。 节点四 输入中缀表达式,使用树将中缀表达式转换为后缀表达式,并输出后缀表达式和计算结果(如果没有用树,则为0分)。 节点五 完成PP11.3。 节点六 参考 Java Collections API源码分析 对Java中的红黑树(TreeMap

StackOverflow 上面最流行的 7 个 Java 问题!

大兔子大兔子 提交于 2020-04-29 12:38:15
StackOverflow发展到目前,已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西。 这篇文章是在我们审阅了StackOverflow上最流行的 Java 问题以及答案后从中挑出来的。即使你是一个有丰富经验的开发者,也能从中学到不少东西。 一、分支预测 问题链接: https://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array StackOverflow上最多投票的一个Java问题是: 为什么处理一个排序数组要比非排序数组快的多 。 为了回答这个问题,你需要使用分支预测(branch prediction)。分支预测是一种架构,旨在通过在真实的路径发生前猜测某一分支的下一步来提升处理过程。 分支在这里即一个if语句。这样的话,如果是一个排序数组,那么分支预测将会进行,否则不会进行。 StackOverflow上的一个回答者,链接: http://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array

Java集合从菜鸟到大牛演变

半城伤御伤魂 提交于 2020-04-27 11:22:33
先来看一张集合概况图,这里从上到下列举了几个最经常用的集合 1、集合接口 java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。声明了适用于JAVA集合(只包括Set和List)的通用方法。Set 和List 都继承了Conllection,Map没有. 2、集合类型 JAVA集合主要分为三种类型: Set (集), List (列表), Map (映射) Set集合:集合元素是 不能重复 的,元素是 没有顺序 的,所以它不能基于位置访问元素。 List集合: 集合元素是 可以重复 的,元素是 有顺序 的,所以它可以基于位置访问元素。 Map:它包含键值对。Map的键是 不能重复 的,可以保证元素的插入顺序,也可以排序。 3、集合介绍 Set (集): HashSet HashSet是基于HashMap实现的,它不允许出现重复元素,不保证和政集合中元素的顺序,允许包含值为null的元素,但最多只能有一个null元素。 TreeSet TreeSet可以实现排序等功能的集合,它在讲对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素按照“升序”排列。

Java学习资源

浪子不回头ぞ 提交于 2020-04-27 05:28:03
java.lang包教程 Java集合类详解 Java回顾之集合 Java回顾之序列化 Java回顾之反射 深入理解Java:类加载机制及反射 Java 下高效的反射工具包 ReflectASM 使用例解 老大难的 Java ClassLoader,到了该彻底理解它的时候了 进程是操作系统进行资源分配的基本单位,而线程是操作系统进行CPU调度的基本单位。 Math.round(),Math.ceil(),Math.floor()的区别 java enum的用法详解 java try(){}catch(){}自动资源释放 Java迭代 : Iterator和Iterable接口 JAVA Comparator 接口排序用法 Java集合源码分析 java的LinkedList详解 Java HashSet和LinkedHashSet的用法 Java_LinkedHashSet工作原理 Hashmap实现原理 HashMap,LinkedHashMap,TreeMap的区别(转) TreeMap用法总结 Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例 java队列——queue详细分析 深入理解java线程池—ThreadPoolExecutor Java多线程-线程池ThreadPoolExecutor构造方法和规则