基本数据结构梳理

一、前文

数据结构这个东西,一般在实际开发过程中,很容易顾不上那么多性能或者内存占用问题,但往往在大数据操作的情况下这些就是引发性能问题的关键。

二、基本的数据结构类型

数据结构从大的概念来说可以分为四大类:

  1. 线性表,结构中所有数据都是按线性排列的,常用的比如数组、链表、栈都属于线性表的一种,更具体点,比如说java中的ArrayList就属于线性表的一种
  2. 树,指结构中所有数据都交错有着某种关系,都有父节点、子节点,类似一棵树的结构,主要分为两大类,比如二叉树和图。
  3. 散列表,是根据键值和散列函数映射地址,直接访问在内存中的数据,查询速度较快
  4. 集合,结构中所有元素之间都没有联系,所有元素都是平等的,集合和集合之间有包括和被包括的关系,类似数学中集合的概念。

三、杂谈


线性表



线性表有很多种,线性表分为顺序表和链表,而链表又分为单链表、双链表和循环链表等。此外还有静态链表,是集合顺序表和链表两者特征的存储结构。

顺序表

顺序表指结构中所有元素在内存中都按照顺序排列,所以在查询过程中的性能和在尾部添加、删除的性能非常高,但是如果再顺序表当中进行删、加操作,就需要把要修改的元素后方所有元素进行前移或者后移,就大大降低了性能,我们所熟知的ArrayList和数组就是采取类似的存储结构

线性表

链表


链表分为单链表、双链表以及循环链表,单链表即每个元素会记录下一个元素的位置,但是这样的缺点就是,当遍历数据的时候,只能从头开始遍历,所以就产生了双链表,元素不但会记录下一个元素的位置,还会记录上一个元素的位置,所以我们就可以双向遍历,不过还有一个问题,就是如果遍历到最后一个元素,就不能继续遍历,所以就产生了循环遍历,最后一个元素会指向第一个元素。

这里写图片描述

静态链表


而静态链表则是在数组的前提下,增加游标指针,我们成为curPos,指向下一个脚标。空的静态链表如下图所示,每个游标都会指向下一个脚标,最后一个游标指向第一个脚标。静态链表由于要实现该特性,所以它往往需要比实际空间更大的内存空间来操作。

静态链表空状态

填入数据后如图所示

静态链表有数据初始状态

我们向乙后面插入数据戊,就会变成如下图所示

静态链表数据增加

红色为发生更改的变量,我们可以看到乙的游标指向了5,5的游标指向了3,这样就成功插入了戊在乙之后。

树分为二叉树和图,二叉树一般有一个根节点和两个子节点,图则是错综复杂的关系连线。

二叉树

二叉树也有很多种,分为满二叉树和完全二叉树,而完全二叉树满足一定规则就叫做堆。二叉树也可以根据规则来编程红黑树。树的查找在某些情况很很多优势。因为树的存在就衍生出来了广度优先遍历算法和深度优先遍历算法。

广度优先遍历算法即从最顶点开始遍历,随层级下降,优先遍历每一层的顶点。

深度优先遍历算法即从顶点开始遍历,一直遍历左节点,当走到头之后,再遍历就进的右节点,依次类推

Java中的TreeSet就是红黑树的实现
经典红黑树

树是图的基础,树是一种更简单意义上的图。为了方便认识,这里我把图分到了树的一种。图因为元素之间关系相对复杂,所以开始也需要花些时间才能运用熟练。图按照有无方向可以分为有向图和无向图。按照存储结构可以分为邻接矩阵、邻接表、十字链表和邻接多重表。

有向图和无向图

有向图和无向图

根据功能的不同,图经常运用在最短路径、拓扑排序,也可以用作深度/广度优先搜索等实际应用。拓扑排序简单来说,就相当于游戏里面,很多角色的技能树排序,得要学了前置技能才能学习高级技能的这种排序。

想详细了解邻接矩阵、邻接表、十子表和邻接多重表可以参照 这篇文章 讲的比较详细。

散列表

我把散列表单独分出来是因为他的存储结构与其他基类都是不同的,散列表是依靠key-value进行数据存储的,即通过key直接寻址获得value,在查找上面有一定的优势。使用的过程类似于java的HashMap。

集合


集合元素是不能重复的。元素是没有顺序的。所以它不能基于位置访问元素。Java中很多数据结构都有集合的一些特性。类似于TreeSet、HashSet。



个人github地址:https://github.com/Kongdy

个人掘金主页:https://juejin.im/user/595a64def265da6c2153545b

csdn主页:http://blog.csdn.net/u014303003

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值