
数据结构
一只小小狗
大家好我是练习时长2年半的程序员
展开
-
Mysql中锁的类型有哪些?
粒度大、加锁简单、容易冲突粒度小,加锁比表锁困难,不易冲突,支持更高的并发粒度更小,加锁更困难,不易冲突,支持更高的并发。当加了这样一个状态,就相当于,告诉其他事务,我已经对整个表进行了共享锁会这我排他锁。避免了对整个索引的每个节点扫描是否加锁,而这个状态就是意向锁。如有错误欢迎指正...原创 2022-06-12 19:01:03 · 3897 阅读 · 3 评论 -
B树和B+树的区别,为什么Mysql使用B+树?
因为索引是用来加快查询的,而B+树通过对数据进行排序可以提高查询速度,B+tree通过一个节点可以存储跟多的元素,使得B+树更加矮胖,所需要的IO更少,并且一页只有16KB,一般情况下任务深度为3的B+tree可以存2000万行数据。利用B+树中的叶子节点有序链表可以很好地支持范围查找和全表扫描。如有错误欢迎指正...原创 2022-06-12 17:29:27 · 482 阅读 · 0 评论 -
为什么联合索引是最左匹配原则?(最左前缀原则)
我们工作中业务更多使用的是一个联合索引。联合索引的最左匹配原则是受到,联合索引的结构影响,比如一个B+tree的联合索引他结构大致为这样这里联合索引中第一个索引字段为name,age,…在存储联合索引的时候也是首先将name作为一个排序条件,然后再age作为排序条件,依次排序。当想使用联合索引的时候,最左端的字段不存在,叶子节点就无法进行第一步索引定位,索引自然直失效了。如有错误欢迎指正......原创 2022-06-11 20:09:53 · 1587 阅读 · 0 评论 -
innoDB为什么必须要有主键,为什么推荐使用自增整型的主键?
如果主键为 UUID整型容易比较大小进行排序,B+tree中的叶子节点和非叶子节点同层中都是从左到右有序递增的。mysql为了维护索引的有序性,使得新增的主键会在B+tree叶子节点中最后末尾添加,使得树分叉概率变小。如有错误欢迎指正...原创 2022-06-11 18:57:24 · 629 阅读 · 0 评论 -
数据库为什么不使用hash表?
mysql使用的是 B+tree,其优点就在 1.范围查找 2.更少的io代表更多的查找效率:如有错误欢迎指正原创 2022-06-11 18:23:10 · 480 阅读 · 0 评论 -
为什么数据库不使用二叉树、红黑树、B树、Hash表? 而是使用了B+树
如果使用二叉树,在最坏的情况下会退化为链表形态,变成了顺序查找,遍历整个链。当数据量大的情况下,层数会不受控的增多,导致效率低下。红黑树但是一种特殊的平衡二叉树,他不会出现二叉树中的最坏情节,他会进行平衡。但是也有一个问题,就是由于他还是属于二叉树,一个父节点只能跟着2个子节点。如果存在几千万数据,那么红黑树会非常的深同样需要大量io操作,这样一句无法快速的查找到我们想要的数据了。为了解决树的层数过深导致查询效率低下,每个节点空间过小,所以增大节点空间,将每个叶子节点都存放多个索引元素和对应的多个d原创 2022-06-11 18:14:11 · 674 阅读 · 0 评论 -
顺序队列和链式队列 和 环的实现
顺序队列和链式队列 和 环的实现顺序队列循环队列Java中用数组实现的就叫顺序队列,用链表实现的就叫链式队列。顺序队列public class ArrayQueue { // 数组:items,数组大小:n private String[] items; private int n = 0; // head 表示队头下标,tail 表示队尾下标 private int head = 0; private int tail = 0; //原创 2022-05-05 17:47:06 · 722 阅读 · 0 评论 -
什么是LRU缓存淘汰算法?JAVA在链表中使用指针简单实现
什么是LRU缓存淘汰算法?JAVA在链表中使用指针简单实现什么是LRU缓存淘汰算法?简单的一个实现总结什么是LRU缓存淘汰算法?链表的三种策略先进先出策略 FIFO(First In,FirstOut)最少使用策略 LFU(Least Frequently Used)最近最少使用策略 LRU(LeastRecently Used)也就是将最近最少使用的数据进行淘汰删除。我们维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表原创 2022-04-29 16:45:50 · 1115 阅读 · 2 评论 -
亿计数据唯一性多字段去重(Java具体操作)
亿计数据库唯一性多字段去重1.针对问题2.达到效果3.解决方案1.针对问题针对以下四个问题进行处理海量数据单独表多唯一性字段重复数据和垃圾数据多2.达到效果高效准确无线程安全问题3.解决方案如有错误欢迎指正...原创 2022-04-21 16:12:14 · 1547 阅读 · 0 评论 -
为什么不使用LinkedList (java)
教科书上的内容对于数组,随机元素访问的时间复杂度是 O(1),元素插入操作是 O(n);对于链表,随机元素访问的时间复杂度是 O(n),元素插入操作是 O(1)。由此可见在随机插入中应该会使用LinkedList ,但在实际中并不是这样。在大多数场景中ArrayList 在各种性能下都远胜LinkedList ,可以自行测试。这里只说明为什么不用。不能只考虑算法在LinkedList 中,在实现的时候,我们需要先通过循环获取到那个节点的 Node,然后再执行插入操作。前者也是有开销的,不可能只原创 2022-03-05 20:36:17 · 1037 阅读 · 0 评论 -
ArrayList和hashMap和HashSet之间的选择
1.时间消耗在查找搜索的功能中ArrayList的时间复杂度是O(n),而HashMap的时间复杂度是O(1)。如果需要较高的速度下,更多想选择HashMap2.空间消耗一个存储相同时间的HashMap和ArrayList对内存的消耗比是不一样的,ArrayList的内存含金量有70%而HashMap只有百分之20%如果在内存受限的情况下更多选择ArrayList3.去重效果在去重中ArrayList会使用 contains方法但是 contains个方法也是通过查找来进行的如同下列代原创 2022-03-05 20:24:55 · 529 阅读 · 0 评论 -
List.subList 进行切片操作导致 OOM
当使用List中的切片操作时,导致内存溢出错误。定义一个名为 data 的静态 List 来存放 Integer 的 List,也就是说 data 的成员本身是包含了多个数字的 List。循环 1000 次,每次都从一个具有 10 万个 Integer 的List 中,使用 subList 方法获得一个只包含一个数字的子 List,并把这个子 List 加入 data变量: private static List<List<Integer>> data = new A原创 2022-03-05 20:13:36 · 991 阅读 · 0 评论 -
java时间复杂度的理解
package LeetCode;/** * 时间复杂度 */public class TimeOO { public static void main(String[] args) { oN2(5); } /** * O(1) 1次 */ public static void o1() { System.out.println("执行1次"); } /** * O(n) 3n+1 */ public static void oN(int n) {原创 2020-12-03 20:40:37 · 349 阅读 · 0 评论 -
java手撕HashMap
java 1.8以后手撕HashMap入门hashMap1.数组的优势/劣势2.链表的优势/劣势3.有没有一种方式整合两种数据结构的优势?散列表HashMap原理讲解1.HashMap的继承体系是什么样的?2.Node数据结构介绍?3.底层存储结构介绍?4.put数据原理分析?5.什么是Hash碰撞?6.什么是链化?7.jdk8为什么引入红黑树?8.HashMap扩容原理?入门hashMap1.数组的优势/劣势优势 1.查询快,通过下标劣势 1.数组不能扩容,如果创建在放入,浪费性能2.链表原创 2020-11-27 12:28:31 · 333 阅读 · 0 评论 -
栈和队列的区别
栈和队列的区别1.规则不同队列:先进先出栈:先进后出2.对插入和删除的限定不同队列:只能在表的一段进行插入,并在另一端进行删除栈:只能在表的一端插入和删除3.遍历数据速度不同队列:基于地址指针进行遍历,可以从头或者尾部进行遍历,不能同时遍历,无需开辟新空间,在遍历过程中不影响数据结构,所以遍历速度快。栈:只能从栈顶取数据,如果要取出栈底的数据,需要遍历整个栈,并且需要遍历的同时开辟空间,保持遍历前的一致性。...原创 2020-11-19 19:41:03 · 3894 阅读 · 0 评论 -
如何写一个Stack?
如何开发一个自己的栈1.栈是数组2.先进后出3.出栈4.入栈/** * 手写一个双向链表 栈*/public class StackPopAndPush { //1.明确:用数组来实现 private Object[] stack; //元素个数 private int size; //默认长度为15个元素 public StackPopAndPush() { this(15); } public StackPopAndPush(int lens) {原创 2020-11-05 19:43:30 · 203 阅读 · 0 评论 -
对HashSet存储原理的理解
HashSet原理hashSet的底层是直接调用hashMap来实现存储,其值作为hashMap的值。为什么要采用hash算法?解决的是唯一性存储数据,底层采用数组采用数组怎么判断唯一性?数组可以遍历,但是效率低下所以,使用hash算法,对存储对象使用hashcode,然后跟数组长度-1做位运算,得到存储下标,没有其他元素,直接存储,不用比较。随着元素不断增加,会出现“哈希冲突”,hash值是相同的,这个时候需要比较,使用equals方法比较。equals相等不插入,不相等则形成列原创 2020-11-04 20:29:37 · 392 阅读 · 0 评论 -
双向链表在两个数据之间如何插入第三个数据
双向链表在两个数据之间如何插入第三个数据首先 C.pre = A然后 C.next = A.nextA.next.pre = CA.next = C原创 2020-11-01 17:30:27 · 215 阅读 · 0 评论 -
ArrayList和LinkedList深层区别,以及占用空间的深层比较
ArrayList和LinkedList区别文章目录ArrayList和LinkedList区别1.数据结构的差异2.浅层来看的区别结论3.从深层的区别结论查找第二个元素ArrayList >LinkedList查找元素值为6的元素ArrayList 和LinkedList 差不多增删中间或者开头的元素 LinkedList >ArrayList增删最后一个元素LinkedList 和ArrayList 没什么区别4. ArrayList和LinkedList谁更占空间?LindedList:原创 2020-11-01 17:02:30 · 536 阅读 · 0 评论