数据结构
文章平均质量分 87
这个作者很懒~~
灰灰快醒醒
一枚大三字节跳动测试开发实习生。。
展开
-
Map源码解析
其实HashMap底层是个什么东西我们之前也讲过, 就是一个哈希桶(差不多可以看成一个数组), 然后每一个节点又连接着链表/红黑树之类的, 下面让我们看一看具体在源码上是怎样实现的:原创 2024-04-05 23:09:52 · 1082 阅读 · 9 评论 -
手撕快速排序
所以我们在写递归框架时可以想想二叉树的前序遍历规则即可快速写出来,后序只需要分析如何按照基准值来对区间中数据进行划分的方式即可.右指针先向左移动,找到一个比基准值小的元素. 然后左指针向右移动,找到一个比基准值大的元素,等到两个都找到后,彼此交换.左子序列中所有元素均小于基准值,右子序列均大于基准值。当左指针和右指针相遇时,交换相遇点与基准元素., 来看一下快速排序最核心的部分(递归)->选取最左边的元素作为基准元素.顾名思义:就是挖坑.这样就分成了两部分.原创 2024-03-14 09:47:53 · 696 阅读 · 9 评论 -
归并排序与自然归并排序
1.归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题2.时间复杂度:O(N * logN)3.空间复杂度:O(N)4.稳定度:稳定.1.这玩意的思路相比于其它排序其实特别恶心,在生产环境中非常不建议使用,你的项目组成员可能会骂街(除非是这种情况:就比如你的数据结构老师心血来潮让你讲这个,那你也没办法...)2.时间复杂度:遍历了一次:O(n)3.空间复杂度:O(n)原创 2023-12-11 09:51:33 · 898 阅读 · 24 评论 -
数组的进阶
上一篇博客相信已经带领各位对数组及其有关数据结构有了初步了解,于是,在此,我将数组有关知识进行升级,接下来你们将会看到多维数组以及数组排序的有关知识。一天,刘某和袁某来剧院看青海摇,望着剧院的一大片座位,袁某不知道坐哪,而刘某把票拿了出来,上面显示三行七列,于是他很容易地找到了座位,那么显然,座位的分布是二维的,要通过行和列我们才能知道具体位置,二维数组也是如此,我们仍可以用行和列来表示相同类型变量的有序集合。二维数组存储形式如下(int[3][4] arr:3为行,4为列)原创 2023-04-23 20:49:30 · 324 阅读 · 15 评论 -
数组的初识
根据上次我们学习的时间复杂度和空间复杂度的有关知识,我们可以得知读取元素和更新元素的时间复杂度为O(1),空间复杂度为O(n)。比如现在有一个数组长度为6的数组,已经装满了元素,还想要添加一个新元素,这就涉及了数组的。由上,数组中的每一个元素都拥有自己的下标,只不过这个下标从0开始,一直到数组大小-1.假设有一个名字叫arr的数组,若要获取到下标为一的元素,就写作arr[1]。数组中的每一个元素,都存储在小小的内存单元中,并且元素之间紧密排列,数组的删除操作和插入操作相反,如果删除的元素在中间,其。原创 2023-04-18 15:40:14 · 407 阅读 · 20 评论 -
时间复杂度和空间复杂度
在运行一段程序时,我们不仅要执行各种运算指令,同时也会根据需要,存储一些中间数据,以便后续指令可以更方便地继续执行。但是,内存的空间有限,在时间复杂度相同的情况下,程序占用的空间自然是越小越好。如何描述占用空间的大小呢,这便用到了空间复杂度。和时间复杂度类似,空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,同样使用了大O表示法。记作S(n)=O(f(n)),其中n为问题的规模,f(n)为算法所占存储空间的函数。空间复杂度的计算和时间复杂度类似,空间复杂度也有几种不同的增长趋势如:1.原创 2023-04-09 15:39:45 · 432 阅读 · 23 评论 -
链表的认识
前面我们已经讲了重要的一种数据结构——数组,如果说数组是,那么今天所学习的链表便是的数据结构,为什么这么说呢?让我们走进今天的链表学习。首先让我们来看一个最基础的单向链表:由图可见,链表和数组数据结构最主要的区别是链表是单线联络的,就像是工厂的产品,一般都是生产之后,然后交给超市等批发商,最后才能到达消费者的手中,产品的运输,就像是链表。链表(linked list)是一种在物理中非连续 ,非顺序的数据结构,由若干节点(node)所组成。由上图可知,单向链表又包含了两个部分,一是。原创 2023-04-26 00:11:38 · 474 阅读 · 28 评论 -
哈希表超详解
对于开放定址法,荷载因子是特别重要的因素,应该严格限制在0.7-0.8以下,超过0.8,查表时CPU缓存不命中按照指数直线上升。因此,一些采用开放定址法的hash库,如Java系统库限制了荷载因子为0.75,如果超过荷载因子的话将对散列表进行扩容。原创 2023-10-21 14:23:29 · 908 阅读 · 15 评论 -
Map和Set
实际上用的是红黑树,而红黑树是一棵近似平衡的二叉搜索树,即在二叉搜索树的基础之上+颜色以及红黑树性质验证。可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的Map和Set是一种适合动态查找的集合容器。但对于同一个关键码的集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树: 比如一个单支搜索树就是比较特殊的情况。6.Map中的键值对的key不能修改,value可以修改,如果要修改key,只能先将key删除掉,再重新插入新的key。value可以为空。原创 2023-10-17 17:09:01 · 367 阅读 · 7 评论 -
Java LinkedList类详解
LinkList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将结点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。在集合框架中,LinkedList也实现了List接口。说明:1.LinkedList实现了List接口2.LinkedList的底层实现了双向链表3.LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问。原创 2023-09-22 16:19:20 · 521 阅读 · 13 评论 -
包装类&简单认识泛型
一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写出可以应用于多种类型的代码,这种刻板的的限制对代码的约束就很大。就是适用于多种类型。从代码上讲,就是对类型实现了参数化。原创 2023-09-12 17:45:18 · 505 阅读 · 9 评论 -
Java二叉树超详解(常用方法介绍)(2)
所以我们就浮现出了这样的思路,即还是利用队列来遍历树每次,都将左右儿子放入队列(不论是不是空),当遇到了第一个为空的元素后,立刻停止放入,检查队列中剩余的元素是否有非空的,如果全是null,则是完全二叉树,如果有一个不是,就不是完全二叉树,画图如下:原创 2023-10-11 21:34:36 · 439 阅读 · 33 评论 -
JAVA 二叉树超详解(1)
除了先序遍历,中序遍历,后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在的层数为1,层序遍历就是从所在的二叉树的根节点出发,进行从上到下,从左到右的遍历。原创 2023-09-25 10:46:51 · 465 阅读 · 12 评论 -
Java ArrayList类详解
java.util简而言之:它是Java函数库中数百个类中的一个,可以将它直接当作自己的类使用ArrayList类的基础(部分)方法add(Object elem):向list中加入对象参数,remove(int index):移除对应索引的对象contains(Object elem):检查是否包含该对象:有的话返回"true",否则返回"false"isEmpty():如果list中没有元素则返回"true"原创 2023-09-05 15:39:51 · 2276 阅读 · 36 评论 -
Java对象的比较
目录PriorityQueue中插入对象元素的比较基本类型的比较对象比较问题 对象的比较覆写基类的equals基于Comparble接口类的比较基于比较器的比较三种方式的对比集合框架中PriorityQueue的比较方式来看下面这个例子:你会发现这样的运行结果:在Java中,基本类型的对象可以直接比较大小。对象比较问题 对象的比较覆写基类的equals代码如下:基于Comparble接口类的比较Comparble是JDK提供的泛型比较接口类,源码实现原创 2023-10-14 20:53:57 · 536 阅读 · 8 评论 -
优先级队列(堆)
Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本文主要介绍PriorityQueue.关于PriorityQueue的使用要注意:1.使用时必须导入PriorityQueue所在的包,即:2.PriorityQueue中放置的元素必须能够比较大小,不能插入无法比较大小的对象,否则会抛出异常3.原创 2023-10-14 10:38:23 · 390 阅读 · 33 评论