初见数据结构

sf论数据结构系列(一)

这是我第一次写系列的博文,在这里只是想借助CSDN这个平台写下自己对数据结构学习的一些心得体会!这一系列文章,没有繁琐的官方语言描述,也没有复杂的实例,旨在用最通俗易懂的语句来描述数据结构到底是怎么回事。所以只能作为小白学习辅助理解,如需深入学习还需购买相应的教材。本人才疏学浅,文中难免有少许错误,各位看官如有发现,还望海涵,不吝指教。废话不多说,直接进入正题。

1.前言

什么是数据结构?当这样一个陌生而由抽象的名词放在大家面前,每个人的感觉都可能不尽相同。有人一阵头大,有人迷之熟悉。其实学习一个陌生的东西我们的思考应该是有严格的逻辑顺序的。第一步:找到熟悉的名词去映射这个事物。第二步:知道它是干什么的。第三步:去掌握它。

2.正文

按照我们的逻辑开始往下走。第一步,用熟悉的名词去映射。

2.1 什么是数据?

数据是关于事件之一组离散且客观的事实描述,是构成讯息和知识的原始材料。资料可分模拟资料和数字资料。加工的“原料”,如影像、声音、文字、数、字符和符号等。

参照:https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE

这是最官方的话,也是在学习中最令人头大的,当然大家也不要去反感这个东西,因为「这种话」无非就是让“自己”没有漏洞。我们大可以找一种自己看起来熟悉而又具体的东西去替代它。我们可以把数据当作数字,字符,文字等等。(这种思维模式恰是:找「熟悉的事物」映射「陌生的事物」)

为了文章的严谨程度在这里要衍生介绍一下什么是数据元素

数据元素其实并不什么新的概念,它只是数据结构讨论的基本单位!(注意不是最小单位)也就是说它与「数据」存在一种集合上面的关系。如图
数据与数据元素的关系
在数据结构中主要讨论的就是数据元素数据元素的关系,所以其他的像数据项,数据对象,等等可以无需了解(有兴趣可以自行google)

2.2 数据结构

这里的「数据」自然就是「数据元素」这二者的概念有时候可以等同(参考严蔚敏版数据结构),而结构我们理解为数理逻辑上的结构也好,理解为建筑学上的结构也好。whatever,它说的就是数据元素与数据元素的关系!这里的「关系」分为两种,一种在描述上的关系我们叫「逻辑结构」,一种在具体实现的关系我们叫做「物理结构」。(稍后详细解释)

2.2.1 逻辑结构

逻辑结构,就是对「数据元素」与「数据元素」之间关系的一种「描述」。简单理解为逻辑结构看不见摸不着,但是可以「画出来」,可以被「描述出来」。简单来说就是在数据元素之间制定一个「规则」。
我们把抽象东西具体化。在「现实世界」中为什么你要给你父亲的哥哥叫伯伯?为什么要给父亲的父亲叫爷爷?这是在社交关系所潜移默化制定的约束人与人的「规则」。而在计算机世界中,你就是God,你是一切规则的制定者,然而这种规则是一种关系,首先你要「描述」出来。这就是逻辑结构。

(a)逻辑结构之「线性结构」

这里的线形结构就是你制订的数据元素之间的关系。那么什么叫线形呢?这里简单来说,就是「数据元素」在「组团」的时候(因为数据元素作为基本单位,就是一个一个单独的个体,请读者知悉),为什么这里叫「组团」呢,

因为只有单独个体在群集的时候才存在「关系」这一说。(不映射各位单身汪…)。

组团的数据元素之间存在「一个接一个」这样的关系。如图。

这里写图片描述

图中黄色的圆代表一个数据元素。它们中间像一条线串起来,所以被称为线性结构(线性关系),这也是之后我们要讨论的「线形表」的逻辑结构。

(b)逻辑结构之非线形结构

非线形结构自然就是线形结构的反义,也就是「数据元素」与「数据元素」“组团“时,关系不在是一条线能解决的,也就是说这种「关系」更复杂。

这里写图片描述

如上图每个数据元素存在着多个数据元素与其有对应关系,明显它不是线形的。也就是树型结构。

下面看一个更复杂的。

这里写图片描述
如上图数据元素之间的关系更为复杂,「每个元素」与「每个元素」都可能有关系,基本上「无限制」。这就是更为复杂图型结构。
到此为止所有的逻辑结构已经说完。

也就是说数据元素与数据元素之间的「关系」已经弄明白,我们描述的这么好的「关系」具体怎么去实现呢?这就是即将登场的存储结构。

2.2.2存储结构

存储结构也称物理结构。一句话概括就是是「数据元素」之间的「逻辑结构」在计算机上的具体映像!这里区别与逻辑结构,这是看的见摸得着的。

存储结构也分为两种。这里值得额外注意的是,存储结构是逻辑结构的具体实现,而存储结构有两种,也就是说一种「逻辑结构」是对应多种「存储结构」的!!!每种逻辑关系的具体实现是不同的。只要符合你指定的这个「规则」即可。

(a)存储结构之顺序映像

这里的顺序印象要与逻辑结构的线形结构区分开,再次重复逻辑结构只是数据元素之间「关系」的「描述」。而这里的顺序映像则是这种关系在计算机的物理存储空间(这是为什么也叫物理结构的原因)上具体的实现,物理空间可以理解为内存之内的东西。

这里之所以叫顺序,只是在内存上开辟连续的储存空间,顺序指的是「数据元素」与「数据元素」在群集后相互的位置上毗邻。

顺序映像主要借助的就是”数组”(在c语言中)。数组就是在内存上面申请一块连续的空间,进行数据的存储,天然属性满足我们的要求。

下图是一个顺序表(线形表的顺序映像)
这里写图片描述

数组确是满足逻辑结构中”线形”的关系。再加上自己天然的属性。就是线形表的顺序映像表示啦。当然线形表还有非顺序映像表示。马上就会说到。

非线形关系也可以用数组去表示(主要是二维数组)。
例如”图”

这里写图片描述

对于学过数据结构与没有学过数据结构的朋友,我想告诉你这就是个”图”。可以很清晰的看出这种结构的逻辑结构是「非线形」的很明显每个数据元素都与其他数据元素可能有关系。我们可以借助二维数组来表示这个「逻辑结构」。

这里写图片描述

二维数字的下标值分别代表的是「数据元素」的「编号」。

因为这个图为无向图且无权值。所以用数字1表示,数据元素与数据元素有关系!INF为∞,表示的是无关系!这样用「顺序映像」成功的表示出「非线形的逻辑结构」

总结一下,顺序映像主要用到的工具叫数组

(b)存储结构之非顺序映像

非顺序映像与顺序映像概念相对,「数据元素」与「数据元素」群集的时候物理位置上「不再连续」。

这里用到的主要工具叫指针,指针的天然属性是”指向”,指针里面存的是地址,也就是说如果知道一个数据元素并且知道下一个数据元素的地址照样可以符合「逻辑结构」进行群集

首先给的例子还是逻辑结构的「线形结构」,它的逻辑规则是要”一个接一个”

这里写图片描述

图中的方块表示的是内存空间,内存空间中存储的是数据元素,箭头表示的是结构体,数据元素之间通过指针的「指向」功能组成一个线形的结构。

然后给出的例子就是逻辑结构的「非线形结构」。这里给大家看的是一颗”树”.
这里写图片描述

这是一颗树,还是个不折不扣的二叉树。每个「圆坨坨」表示的是一个数据元素,可以看出一个数据元素会有多个数据元素与它有关系。

看看它的「非顺序映像」

这里写图片描述

各位看客看到这里,一定会说这**不是在逗我么,就是把「圆坨坨」换成「长框框」么!这…好吧,有必要解释一下,这里的长框框代表的就是一个内存空间,内存空间里面自然存储的是数据元素,而蓝色的线就是指针。数据元素通过指针相连接表示出了其逻辑结构。

3.用途

首先简单总结一下。

数据结构中的逻辑结构,就是你做为一个God,给计算机世界中的个体「数据元素」之间制定的一种关系,也就是约束规则。逻辑结构分为两种,线性结构,非线形结构。

「关系」制定出来之后要在计算机上具体去实现。怎么去实现呢?这就是数据结构的存储结构:顺序映像,非顺序映像!

一种逻辑结构对应多种存储结构!!

一种逻辑结构对应一种存储结构之后。数据元素之间有所谓的“关系”也有具体的存储方式。这时候会形成一个模型,我们的算法也就是符合这个模型规则的前提下,对数据元素的一些列的指令操作。也就是算法是以数据结构的前提存在的。

什么意思?

举个栗子,最简单的数据结构线形表,其逻辑结构是「线形结构」。

线形结构+顺序映像,也就是顺序表。
线形结构+非顺序映像,也就是链表。

顺序表和链表的插入删除操作序列有很大的区别!

再看一下!
Nicklaus Wirth的著名公式:
算法+数据结构=程序。

原来如此啊!


原创作品为经作者同意严禁转载谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值