数据结构和算法
文章平均质量分 74
....
研发咨询顾问
专注全栈开发和项目管理,诚接商务\业务合作,及问题难点解答和远程协助! 可私信或留言给作者,消息会在6小时内回复哦 (每篇文章末尾有作者名片,可添加联系,秒通过)
展开
-
时间复杂度
1)在描述算法复杂度时,经常用到O(1), O(n), O(logn), O(nlogn)来表示对应复杂度程度, 不过目前大家默认也通过这几个方式表示空间复杂度 ,大O表示的是最坏情况下的时间复杂度。2)如果a^y=x(a>0,且a≠1),那么数y叫做以a为底x的对数,记作y=logax,读作以a为底N的对数,其中a叫做对数的底数,N叫做真数。那么,O(1), O(n), O(logn), O(nlogn)就可以看作既可表示算法复杂度,也可以表示空间复杂度。(5)平方级复杂度:O(N^2)原创 2023-04-28 21:16:54 · 52 阅读 · 0 评论 -
数据结构-LSM树
LSM Tree ,这个概念就是结构化合并树的意思,它的核心思路其实非常简单,就是假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在内存中,等到积累到足够多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾(因为所有待排序的树都是有序的,可以通过合并排序的方式快速合并到一起)。4)LSM树原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。原创 2023-04-28 21:16:16 · 1891 阅读 · 0 评论 -
二叉树遍历
def preForeach(op: T => Unit): Unit = { //op : T=>Unit 是一个匿名函数,op表示参数名(但也可以作为匿名函数的名字), T=>Unit 传入匿名参数类型T 和 返回匿名参数类型Unit。1)前言:理解这句话的时候 左子树,右子树都要看成是一个整体(或临时看出一个节点),反正树是一层嵌套一层,不过一定记住,从内层树逐一到外层的树来解决问题,有时候少了一个节点,看起来不完整可以补充一个虚拟的临时节点 赋值计算理解。原创 2023-04-28 21:14:51 · 48 阅读 · 0 评论 -
数据结构-B+树
而B+树除叶子节点,每个节点只有索引,只有叶子节点存放数据又有索引,而且每一个节点的关键字和指针的也是和B树一样,(n,P0,K1,P1,K2,P2,…所有的查询都要查找到叶子节点,查询性能是稳定的,而B树,每个节点都可以查找到数据,所以不稳定。2)查询方面:且B树只能从根节点开始,往下查询,而B+树可以从根节点开始,也可以从叶子节点开始的横向链条开始。1)结构方面:一样B树的节点结构 (n,P0,K1,P1,K2,P2,…3)数据存放在叶子节点(叶子节点有数据也有索引),其它的都是索引节点。原创 2023-04-28 21:12:40 · 51 阅读 · 0 评论 -
B树(B-树)
(4)删除后发现,当前叶子结点的记录的个数小于2,而它的兄弟结点中有3个记录(当前结点还有一个右兄弟,选择右兄弟就会出现合并结点的情况,不论选哪一个都行,只是最后B树的形态会不一样而已),我们可以从兄弟结点中借取一个key。所以父结点中的28下移,兄弟结点中的26上移,删除结束。以结点中间的key为中心分裂成左右两部分,然后将这个中间的key插入到父结点中,这个key的左子树指向分裂后的左半部分,这个key的右子支指向分裂后的右半部分,然后将当前结点指向父结点,继续进行第3步。floor函数(向下取整);原创 2023-04-27 14:04:15 · 301 阅读 · 0 评论 -
数据结构-红黑树
1)首先”平衡搜索树“ 这个要求实在是太严了,导致每次进行插入/删除节点的时候,几乎都会破坏平衡树的第二个规则,进而我们都需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。显然,如果在那种插入、删除很频繁的场景中,”平衡搜索树“ 需要频繁着进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是有了红黑树。它的每个节点是一个五元组:color(颜色),key(数据),left(左孩子),right(右孩子)和p(父节点)。(4)如果一个节点是红的,则它的两个儿子都是黑的。原创 2023-04-27 14:02:00 · 53 阅读 · 0 评论 -
数据结构-二叉树
(1)这种情况也是满足二叉查找树的条件,然而,此时的二叉查找树已经近似退化为一条“链表”,这样的二叉查找树的查找时间复杂度顿时变成的很大,类似遍历长链条一样,可想而知,我们必须不能让这种情况发生,为了解决这个问题,于是我们引申出了平衡二叉树。1)二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵子树互不相交的、分别称为根结点的左子树和右子树组成。(1)若 i=1,则该结点是二叉树的根,无双亲, 否则等式不成立,编号为 [i/2] 的结点为其双亲结点;原创 2023-04-27 14:01:10 · 72 阅读 · 0 评论 -
数据结构-树
树又有很多子集,比如:二叉树(二叉搜索树(又称二叉排序树或二叉查找树),满二叉树,完全二叉树 )、2-3树、红黑树,B树(B-树),B+树 等等。每个父结点拥有的子树数量称为该结点的度,简单的说某个结点的子节点个数就是它的度。度为0的结点成为叶节点,也就是没有子结点的结点`。从图可以看出 最后一层D,E都是兄弟节点(也是B的孩子节点),即它们的双亲节点都是B;自下而上从叶节点开始自底向上逐层累加的 ,一般高度的初始在为1(也碰见过有0的)(2)如上图的阶数为I节点的孩子节点最大可以是5,所以阶数为5。原创 2023-04-27 13:58:37 · 50 阅读 · 0 评论 -
数据结构-双向链表
/这里判断是否等于1 主要是 防止空指针异常 因为该节点 pre和next都是空的。//这里判断是否等于1 主要是 防止空指针异常 因为该节点 pre和next都是空的。System.out.println("链表的数据信息:");if(tempSize == 1){//当前链表只有一个节点。System.out.println("删除表头节点:");System.out.println("删除表尾节点:");//表示链表的节点个数。//获得链表的节点个数。//在链表头增加节点。//在链表尾增加节点。原创 2023-04-27 13:56:54 · 59 阅读 · 0 评论 -
数据结构-有序链表
有序链表优于有序数组的地方是插入的速度(因为元素不需要移动),另外链表可以扩展到全部有效的使用内存,而数组只能局限于一个固定的大小中。1)前面的链表实现插入数据都是无序的,在有些应用中需要链表中的数据有序,这称为有序链表。//插入节点,并按照从小打到的顺序排列,这里的话可以结合图片来开。if(node.equals(head)){//判断是否是头节点。System.out.println("删除链头后的数据:");if(tempSize == 1){//当前链表只有一个节点。原创 2023-04-27 13:55:57 · 941 阅读 · 0 评论 -
数据结构-双端链表
/此时改变后为:head-->tail(之前的尾节点失效)-->node(此时可以认为是尾节点)//node(此时可以认为是头)-->head(此时之前的节点头就失效了)-->tail。//此时改变后为:head-->tail(之前的尾节点失效)-->node(此时可以认为是尾节点)if(size == 0){//如果链表为空,那么头节点和尾节点都是该同一个新增节点。if(size == 0){//如果链表为空,那么头节点和尾节点都是该同一个新增节点。}else{//如果链表一个节点都没有,直接打印[]原创 2023-04-27 13:54:33 · 206 阅读 · 0 评论 -
数据结构-单向链表
一个单链表的节点(Node)分为两个部分,第一个部分(data)保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。4)链表的 Q节点有data和next两部分组成 ,data是节点的自身数据 而next是别的节点地址保存给Q里面,如果要删除Q节点就要把next该成自身地址,即自己指向自己。//判断节点内的数据是不是有包含删除的节点数据,以下进行定位删除节点,如果定位到有删除的节点就继续往下走,如果没有地位到停止程序执行。3)删除一个节点,我们将该节点的上一个节点的next指向该节点的下一个节点。原创 2023-04-27 13:53:21 · 311 阅读 · 0 评论 -
数据结构-有序数组和无序数组
(2)缺点:删除和插入慢,大小固定(缺点也显而易见,当插入一个元素时,首先要判断该元素应该插入的下标,然后对该下标之后的所有元素后移一位,才能进行插入,这无疑增加了很大的开销)//创建一个原始数组的第一个位置值为1,原始数组的最后一个位置值为500, 然后在这个数组的每一个元素追加 追加随机数1000范围内的整数。//创建一个原始数组的第一个位置值为1,原始数组的最后一个位置值为500, 然后在这个数组的每一个元素追加 追加随机数0范围内的整数。* 生成一个无序的数组或有序数组。原创 2023-04-27 13:51:40 · 681 阅读 · 0 评论 -
数据结构-数组概念介绍
且数组的地址是以第一个元素为地址的,每个元素都会有地址,地址是地址,索引是索引,它们是不一样的,输出某个元素的地址是以&ar[0]输出,但这个print是不能打印的,只能用其它方法。4)注意数组创建要在初始的时候就要先明确声明多少内存(一定要先声明),然后在进行一 一 赋值,或直接把要存某些对数据立马存进去(也算是一开始就声明)。3)数组的打印通过toString()方法打印的 ,方法体写什么就打印什么,也可以打印某个索引元素的部分内容。5)一维数组的地址一个' [ '开头,二维数组' [[ ' 开头。原创 2023-04-27 13:50:32 · 104 阅读 · 0 评论