数据结构入门
已同步微信公众号乐享Coding,欢迎关注!
程序=数据结构
和算法
不知各位有没有玩过一款名为英雄联盟(LOL)的游戏,或者王者荣耀的MOBA类游戏,因为这是数据结构的第一篇文章入门,只是让大家能够对数据结构有个初步的通感,本篇文章理解需要有王者荣耀,英雄联盟这类游戏的试玩经验。
数据结构
- 相互之间存在一种或多种特定关系的数据元素的集合。
在游戏中,我们把控制英雄作为一个程序,那么英雄可以作为一个数据对象,如上单英雄,那我需要一个地图(部分内存空间)来存储它,但是由于他是上单英雄,它需要上路这样的地形(数据结构)因为上单英雄不止一个,可以是多个,但是大多都依赖上单这个地形。然而,光有地形还不够,我们还需要研究对面的英雄的技能怎么克制我,自己如何出装,技能如何释放等等(算法),这样才能在游戏中打败它,否则,就会坑到被队友无脑喷,装备出的所用金币越少,价值大(时间效率高),我们的英雄才能更好的击杀对手,从而拿到First blood!
总结如下:
术语 | 例子 |
---|---|
数据元素(组成数据,有一定意义的基本单位,可以由很多数据项组成也被称为记录) | 某个具体英雄 |
数据结构(相互之间存在一种或多种特定关系的数据元素的集合。) | 地形 |
算法(解决特定问题求解步骤的描述) | 策略 |
数据项(数据元素的属性) | 英雄的属性 |
数据(描述客观事物的符号,是计算机可以操作的对象,能够被识别并输入给计算机处理) | 英雄 |
数据对象(性质相同的数据元素的集合,是数据的子集) | 上单英雄 |
关系图解如下:
提问:如何去选择数据结构去存储数据?
回答:这里还是以游戏为例,英雄联盟的地图共有4种地形,上单,中单,下路,打野,而这些地形都存储在一个地图上,每个地形都有对应位置的英雄,如拿我近期玩的比较多的上单英雄武器大师贾克斯(王者荣耀花木兰)为例,在游戏中他们被标为上单英雄,但是你可以选择他们去下路,去中路,也可以打野,
同样,存储数据也不一定只能用一种数据结构,现实就是这样的情况比较少,选择去上路的原因极大的是依靠上路的地形可以为自己建立一个很大的优势,而去别路或许就天生具有劣势,那么我们为什么不去选择上路这种地形呢?存储一些数据我们可以使用单向链表存储,也可用顺序存储,但是到底改选哪一种呢?这就需要根据具体的功能而定,如想要查询快的话(想一些购物的商品网页),当然是顺序存储占优势,速度更快,因为每一个都有索引,根据索引就能返回查询的数据。
相比以上的例子,数据结构可能知识点会更多些,因为计算机中的数据元素种类很多,数量巨大,依赖关系十分复杂,为解决这个问题,数据结构分为逻辑结构
和物理结构
。
逻辑结构
定义:数据对象中数据元素之间的相互关系。
集合结构 | 数学学过,不能重复,各个平等 |
---|---|
线性结构 | 一对一,糖葫芦 |
树形结构 | 一对多,有层次,倒着的树 |
图形结构 | 多对多,网状结构 |
如何去理解逻辑结构
相信各位都学过物理,画过电路图,电路图其实就是电路的逻辑结构,我们画电路图就是为了减少无关影响,更加注重逻辑,还有一个例子就是质点,如图:
物理结构显而易见了,就是电路实际的样子,如图:
物理结构
定义:数据的逻辑结构在计算机中的储存形式.
顺序存储结构 | 连续(one by one) |
---|---|
链式存储结构 | 不连续,数据中包含指针,指向下一数据地址 |
抽象数据类型
数据类型
(官方):一组性质相同的集合及定义在此集合上的一些操作的总称。
通俗:有范围的数据及操作规范。
抽象数据类型
(官方):指一个数学模型及定义在该模型上的一组操作。
通俗:可以自定义的数据类型
描述抽象数据类型
ADT 抽象数据类型名
Data
数据元素之间逻辑关系的定义
Operation
操作1
操作结果描述
操作2
......
操作n
endDAT
举例:一个游戏人物(如马里奥)在初始中只有跳,跑的操作,但是有的公司这个人物可能需要打枪的动作,有的公司这个人物可能需要趴下的动作,因此自定义的抽象数据类型就很重要!