Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Java基础相关 >

labuladong的算法小抄完整版 PDF 下载


分享到:
时间:2021-09-09 08:50来源:http://www.java1234.com 作者:转载  侵权举报
labuladong的算法小抄完整版 PDF 下载
失效链接处理
labuladong的算法小抄完整版 PDF 下载


本站整理下载:
提取码:lnpq 
 
 
相关截图:
 
主要内容:

⼀、数据结构的存储⽅式
数据结构的存储⽅式只有两种:数组(顺序存储)和链表(链式存储)。
这句话怎么理解,不是还有散列表、栈、队列、堆、树、图等等各种数据结
构吗?
我们分析问题,⼀定要有递归的思想,⾃顶向下,从抽象到具体。你上来就
列出这么多,那些都属于「上层建筑」,⽽数组和链表才是「结构基础」。
因为那些多样化的数据结构,究其源头,都是在链表或者数组上的特殊操
作,API 不同⽽已。
⽐如说「队列」、「栈」这两种数据结构既可以使⽤链表也可以使⽤数组实
现。⽤数组实现,就要处理扩容缩容的问题;⽤链表实现,没有这个问题,
但需要更多的内存空间存储节点指针。
「图」的两种表⽰⽅法,邻接表就是链表,邻接矩阵就是⼆维数组。邻接矩
阵判断连通性迅速,并可以进⾏矩阵运算解决⼀些问题,但是如果图⽐较稀
疏的话很耗费空间。邻接表⽐较节省空间,但是很多操作的效率上肯定⽐不
学习算法和刷题的思路指南
8
过邻接矩阵。
「散列表」就是通过散列函数把键映射到⼀个⼤数组⾥。⽽且对于解决散列
冲突的⽅法,拉链法需要链表特性,操作简单,但需要额外的空间存储指
针;线性探查法就需要数组特性,以便连续寻址,不需要指针的存储空间,
但操作稍微复杂些。
「树」,⽤数组实现就是「堆」,因为「堆」是⼀个完全⼆叉树,⽤数组存
储不需要节点指针,操作也⽐较简单;⽤链表实现就是很常⻅的那种
「树」,因为不⼀定是完全⼆叉树,所以不适合⽤数组存储。为此,在这种
链表「树」结构之上,⼜衍⽣出各种巧妙的设计,⽐如⼆叉搜索树、AVL
树、红⿊树、区间树、B 树等等,以应对不同的问题。
了解 Redis 数据库的朋友可能也知道,Redis 提供列表、字符串、集合等等
⼏种常⽤数据结构,但是对于每种数据结构,底层的存储⽅式都⾄少有两
种,以便于根据存储数据的实际情况使⽤合适的存储⽅式。
综上,数据结构种类很多,甚⾄你也可以发明⾃⼰的数据结构,但是底层存
储⽆⾮数组或者链表,⼆者的优缺点如下:
数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,⽽
且相对节约存储空间。但正因为连续存储,内存空间必须⼀次性分配够,所
以说数组如果要扩容,需要重新分配⼀块更⼤的空间,再把数据全部复制过
去,时间复杂度 O(N);⽽且你如果想在数组中间进⾏插⼊和删除,每次必
须搬移后⾯的所有数据以保持连续,时间复杂度 O(N)。
链表因为元素不连续,⽽是靠指针指向下⼀个元素的位置,所以不存在数组
的扩容问题;如果知道某⼀元素的前驱和后驱,操作指针即可删除该元素或
者插⼊新元素,时间复杂度 O(1)。但是正因为存储空间不连续,你⽆法根
据⼀个索引算出对应元素的地址,所以不能随机访问;⽽且由于每个元素必
须存储指向前后元素位置的指针,会消耗相对更多的储存空间。

 

------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐