![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 68
sahahsha
情深不寿,慧极必伤
展开
-
ConcurrentHashMap 1.7和1.8的区别
ConcurrentHashMap 1.7和1.8的区别1、整体结构1.7:Segment + HashEntry + Unsafe1.8: 移除Segment,使锁的粒度更小,Synchronized + CAS + Node + Unsafe2、put()1.7:先定位Segment,再定位桶,put全程加锁,没有获取锁的线程提前找桶的位置,并最多自旋64次获取锁,超过则挂起。1.8:由于移除了Segment,类似HashMap,可以直接定位到桶,拿到first节点后进行判断,1转载 2021-01-26 16:28:53 · 1187 阅读 · 0 评论 -
MySQL索引底层实现
索引的本质MySQL官方对于索引的定义为:索引是帮助MySQL高效获取数据的数据结构。即可以理解为:索引是数据结构。 我们知道,数据库查询是数据库最主要的功能之一,我们都希望查询数据的速度尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找,当然这种时间复杂度为O(n)的算法在数据量很大时显然是糟糕的,于是有了二分查找、二叉树查找等。转载 2017-08-27 10:41:47 · 219 阅读 · 0 评论 -
B-Tree、B+Tree、红黑树、B*Tree数据结构
B树(B-Tree,并不是B“减”树,横杠为连接符,容易被误导) 是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2.根结点的儿子数为[2, M]; 3.除根结点以外的非叶子结点的儿子数为[M/2, M]; 4.每个结点存放至少M/2-1(取上整)和至多M-1转载 2017-08-27 10:45:02 · 228 阅读 · 0 评论 -
hashmap,hashTable concurrentHashMap 是否线程安全,及实现
线程安全类在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。 下面是这些线程安全的同步的类:vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。statck:堆栈类,先进后出原创 2017-08-28 14:14:03 · 855 阅读 · 0 评论 -
数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
BST树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: BST树的搜索,从根结点开始,如果查询的关键字与转载 2017-09-15 12:19:25 · 219 阅读 · 0 评论 -
ArrayList和LinkedList在性能上优缺点
我们都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinedList比较占优势,因为A原创 2017-09-09 09:33:14 · 3170 阅读 · 1 评论 -
stack,deque,queue对比
1.stack堆栈,没有迭代器,支持push()方法。后进先出,top()返回最顶端的元素,pop()剔除最顶元素,后进先出(LIFO);2.deque双端队列,支持迭代器,有push_back()方法,跟vector差不多,比vector多了个pop_front,push_front方法;3.queue队列,先进先出,不支持迭代器。队列通常(但并非一定)以转载 2017-09-09 10:02:52 · 522 阅读 · 0 评论 -
为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?
B树:B+树1) B+-tree的磁盘读写代价更低B+-tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就转载 2017-08-31 16:09:02 · 452 阅读 · 0 评论 -
hashMap为啥初始化容量为2的次幂
hashMap源码获取元素的位置:static int indexFor(int h, int length) { // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2"; return h & (length-1);}解释:h:为插入元素的hashco转载 2017-10-07 11:35:10 · 331 阅读 · 0 评论 -
B树、B+树、B*树
动态查找树主要有二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree), 红黑树 (Red-Black Tree ),都是典型的二叉查找树结构,查找的时间复杂度 O(log2-N) 与树的深度相关,降低树的深度会提高查找效率,于是有了多路的B-tree/B+-tree/ B*-tree (B~Tree)。关于这B转载 2017-08-27 10:21:57 · 186 阅读 · 0 评论 -
深入分析ConcurrentHashMap
聊聊并发(四)深入分析ConcurrentHashMap本文是作者原创,发表于InfoQ:http://www.infoq.com/cn/articles/ConcurrentHashMap术语定义术语英文解释哈希算法hash algorithm是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值转载 2017-08-23 11:09:41 · 156 阅读 · 0 评论 -
造成HashMap非线程安全的原因
在前面我的一篇总结线程范围内共享数据文章中提到,为了数据能在线程范围内使用,我用了HashMap来存储不同线程中的数据,key为当前线程,value为当前线程中的数据。我取的时候根据当前线程名从HashMap中取即可。 因为当初学习HashMap和HashTable源码的时候,知道HashTable是线程安全的,因为里面的方法使用了synchronized进行同步,但是HashMap没有,转载 2017-08-25 22:49:32 · 295 阅读 · 0 评论 -
逻辑结构和存储结构
什么是逻辑结构? 简单说,逻辑结构就是数据之间的关系。而按数据之间的关系来说,逻辑结构大概可以分为两种:线性结构和非线性结构(集合、树、网)。线性结构:有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继。例如:线性表,典型的线性表有:顺序表、链表、栈(顺序栈、链栈)和队列(顺序队列、链队列)。它们共同的特点就是数据之间的线性关系,除了头结点和尾结点之外转载 2017-08-16 17:41:25 · 7854 阅读 · 0 评论 -
常见哈希冲突解决办法:
常见哈希冲突解决办法:1.开放地址法 2.线性探测法 3.链地址法(拉链法) 4.二次探测法5.伪随机探测法 6.再散列(双重散列,多重散列) 7.建立一个公共溢出区单旋转法是建立散列函数的一种方法, ,将最后一位数,旋转放置到第一位常见的散列函数有,直接定址法,数字分析法,平法取中法,取余法,折叠法,随机法原创 2017-08-19 22:09:25 · 622 阅读 · 0 评论 -
二叉树中序线索
我先说一说 每个 节点 那 五个格 的数据 的含义中间哪一个 是 存储数据从左向右 ,第一个 和 第五个 是指针,具体指向什么 取决于第二个 和 第四个的值第二个 如果是零,实线表示,则 第一个指向的是 左孩子 第二个 如果是1,虚线表示,则 第一个 指向的是 在中序遍历次序下 ,该节点的前驱(即前一个),,如果 该节点 自己就是第一个,没有前驱,,则为空指针 ,,图中最左边 的的C就是这样 (中原创 2017-08-20 15:34:58 · 510 阅读 · 0 评论 -
HashMap实现原理分析(详解)
1. HashMap的数据结构http://blog.csdn.net/gaopu12345/article/details/50831631 ??看一下 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入转载 2017-08-20 17:30:05 · 5884 阅读 · 0 评论 -
为什么红黑树的效率比较高
红黑树属于平衡二叉树。它不严格是因为它不是严格控制左、右子树高度或节点数之差小于等于1,但红黑树高度依然是平均log(n),且最坏情况高度不会超过2log(n)。红黑树(red-black tree) 是一棵满足下述性质的二叉查找树:1. 每一个结点要么是红色,要么是黑色。2. 根结点是黑色的。3. 所有叶子结点都是黑色的(实际上都是Null指针,下图用NIL表示)转载 2017-08-20 21:57:53 · 6479 阅读 · 0 评论 -
红黑树上
本文以Java TreeMap为例,从源代码层面,结合详细的图解,剥茧抽丝地讲解红黑树(Red-Black tree)的插入,删除以及由此产生的调整过程。总体介绍Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(转载 2017-08-20 22:19:20 · 182 阅读 · 0 评论 -
红黑树下
本文github地址上一篇文章史上最清晰的红黑树讲解(上)对Java TreeMap的插入以及插入之后的调整过程给出了详述。本文接着以Java TreeMap为例,从源码层面讲解红黑树的删除,以及删除之后的调整过程。如果还没有看过上一篇文章,请在阅读本文之前大致浏览一下前文,以方便理解。寻找节点后继对于一棵二叉查找树,给定节点t,其后继(树种比大于t的最小的那个元素)可以通过如下方转载 2017-08-20 22:20:44 · 170 阅读 · 0 评论 -
最优二叉树概念 (哈夫曼树)
最优二叉树概念 1.树的路径长度 树的路径长度是从树根到树中每一结点的路径长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。2.树的带权路径长度(Weighted Path Length of Tree,简记为WPL) 结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。转载 2017-08-21 15:26:57 · 1981 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度-总结
算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的转载 2017-08-24 19:53:45 · 195 阅读 · 0 评论 -
ConcurrentHashMap原理分析
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获益非浅转载 2017-08-25 11:30:50 · 145 阅读 · 0 评论 -
Hash算法冲突解决方法分析
看了ConcurrentHashMap的实现, 使用的是拉链法.虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的。当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时。冲突就难免会发 生。另外,当关键字的实际取值大于哈希表的长度时,而且表中已装满了记录,如果插入一个新记录,不仅发生冲突,而且还会发生溢出。因此,处理冲突和溢出是 哈希技术中的两个重要问题。1、转载 2017-07-17 15:30:23 · 439 阅读 · 0 评论