紫薇星上的数据结构(1)

部分观点与数据来自https://study.163.com/https://www.baidu.com/

今天开一个新系列:数据结构,其实也是填之前的坑,第一次写紫薇星系列的时候就说过会开数据结构的整理系列,结果快一个月了Java都没整理完(lll¬ω¬),不过昨天终于是将Java中的一些特性整理的差不多了,于是数据结构立马提上日程,GoGoGo!


0.写在前面

C语言是一种编程语言,编程的语言有很多种,而数据结构讲的是关于一些数据的理论知识,所以我们这个系列将数据结构在C语言的环境下实现作为一个版本。

可以说不管什么编程语言都能用到数据结构的知识,数据结构是程序设计基础又核心的知识。可以将C语言想象为一种语言比如汉语,那么数据结构就是一种说话的技巧,如何让你说话更简洁,有逻辑,容易让人听懂,这表达技巧不管中文或者英文都可以用上。当然,如果想成为一个优秀的程序设计人员,数据结构是必须掌握好的。

1.1数据结构的基本概念

数据结构是计算机存储、组织数据的方式,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率,数据结构往往同高效的检索算法和索引技术有关。

数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的结构逻辑和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。

简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。

数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的储存结构。

数据结构的研究内容是构造复杂软件系统的基础,它的核心技术是分解与抽象。通过分解可以划分出数据的3个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。上述两个方面的结合可以将问题变换为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。然后,通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。

什么是数据?

猴子和打字机(Monkeys and Typewriters),如果无数多的猴子在无数多的打字机上随机的打字,并持续无限久的时间,那么在某个时候,它们必然会打出莎士比亚的全部著作。猴子和打字机的设想在20世纪初被法国数学家Emile Borel推广,但其基本思想——无数多的人员和无数多的时间能产生任何/所有东西——可以追溯至亚里士多德。

在上述的例子中,猴子敲出的内容就是数据。而在计算机中,数据就是描述客观事物的符号,是计算机中可以操作的对象;是能被计算机识别,并输入给计算机处理的符号集合。这里要注意:

  1. 数据有两个特点,一是可以输入到计算机中,二是能被计算机处理。
  2. 数据不仅仅包括整型,实性等数值类型,还包括字符及声音、图像、视频等非数值类型。

什么是数据元素?

如果我们来谈论游戏,大家可能会谈到很多:王者荣耀、吃鸡、LOL、第五人格等等,这里面随便某一个就是游戏这个数据中的数据元素;再比如我们谈论电影:复联、福尔摩斯、了不起的盖茨比等等都是电影这个数据中的数据元素。

组成数据的、有一定意义的基本单位,在计算机中通常作为整体来处理,也被称为记录。由数据元素组成了数据,数据元素是数据结构的聚焦点。

什么是数据项?

一个数据元素可以由多个数据项组成,数据项是数据不可分割的最小单位。比如我们来举个例子:现在有一个人,叫小明;那么小明就是人这个数据中的一个数据元素,他有哪些数据项呢?名称、性别、年龄、社会地位、是否结婚等等太多了,这些就是这个数据元素的数据项。当然接触过面向对象的同学就能清楚地了解到:这不就是对象和属性嘛!是的,这就是面向对象中的成员和属性。

什么是数据对象?

数据对象就是数据元素的集合,是数据的子集。这个时候就会有同学分不清数据与数据元素还有数据对象的区别了,我们来举一个例子:

以《复仇者联盟》为例,数据元素就是其中的角色:钢铁侠、蜘蛛侠、美国队长等等;数据对象就是他们的集合,也可以说他们的归属:复仇者联盟成员;而数据呢,就是复联这部电影中的人物、场景、BGM等等;所以我们可以看到:数据元素的集合就是数据对象,而数据对象和其他的数据对象一起构成了数据。当然接触过面向对象的同学一定能很快的理解我的意思,没有接触过的同学正好可以开始理解。

什么是数据结构?

我们已经了解了数据元素,那么在复联这部电影中,我们看钢铁侠和美国队长看的是他们叫什么,多少岁了吗?不是的,我们看的是他们之间的故事。对于现实生活来说,数据元素之间不是独立的而是存在一种特殊的关系,这种特定的关系我们就成为数据结构。数据结构是互相之间存在多种或者一种特定关系的数据元素的集合。

1.2逻辑结构与物理结构

现在我们已经知道如果要写程序,应该有数据,还要有数据结构;那么所谓的数据结构有哪些结构呢?我们可以分为物理结构与逻辑结构,那么这两个结构分别是什么意思呢?数据的逻辑结构是对数据之间关系的描述,有时就把逻辑结构简称为数据结构;数据结构在计算机中的表示(映像)称为数据的物理(存储)结构。它包括数据元素的表示和关系的表示。

简单来说,逻辑结构就是编程的时候开发者使用人类的思想想象的结构,而物理结构就是我们想象的东西要在计算机上实现的话,要在硬盘上存储它,在内存里保存它,这种存储结构就是物理结构。

逻辑结构

逻辑结构有很多结构:

  • 集合结构:集合结构中的数据元素同属一个集合,数据元素之间没有其他关系。比如我们在同一列地铁上的人,就是“地铁上的人”这个集合中的数据元素,但是他们没有任何关系,只是同属这个结构罢了。
  • 还有线性结构:数据元素之间是一一对应的关系,就像排队一样。线性结构在C语言中有很多,比如数组就是线性结构。
  • 还有树形结构:元素之间存在一种“一对多”的关系。树形结构就像公司中的职位关系一样,一个主管下面有好几个小组长,小组长下面又有好多组员。
  • 还有图形结构:元素之间存在“多对多”的关系。图形结构与树形结构的区别就是图形结构中有多对多的关系,就像地铁站的路线图一样,每一站都可以去很多站,而其他的站也可以到这个站来。

逻辑结构只存在于思想层面,那么我们如何在计算机中存储呢?就要来看一下物理结构了。

物理结构

物理结构又叫存储结构,是指数据的逻辑结构在计算机中存储形式。物理结构的存储方法也有很多:

顺序存储结构:把数据存储在地址连续的存储空间中,数据间的逻辑关系与物理关系一致。但是他是有缺点的,那就是不能随便插入数据!顺序结构中数据都是排列好的,所以插入之后要将其后面所有数据都向后挪动一个存储位置,结构中只有几个数据还好说,如果有几千几万个数据呢,那就是一件非常麻烦的事情了。

还有链式存储结构:链式存储结构可以把数据元素放在任意的存储单元里,这就可以解决刚才所说的顺序存储结构的插入问题了。因为链式结构中的存储关系就像是排队叫号一样,只需要关心自己前面的那个人的号码,和自己的号码就可以了。这样就可以随便插入数据,因为数据存储只需要知道前一个数据就可以了,所以插入数据并不麻烦。

1.3抽象数据类型

希望大家在学习数据类型的时候,先忘掉之前学习的东西,比如学了C语言就先忘记整型,浮点型啊这些。

什么是数据类型?

计算机中,内存空间是有限的,不同类型等数据分配的内存空间大小都是不相同的。因为数据类型是指一组性质相同的集合及定义在次集合上的一些操作的总称,所以数据类型就是用来规定不同类型所占空间的大小的。

在C语言中,按照取值的不同,数据类型分为两块:

  • 原子型:不可再分解的基本类型,包括整型、实型、字符型等。
  • 结构性:由若干个类型组合成的,是可以再分解的。例如:整型数组是由若干个整形数据组成的。

什么是抽象数据类型?

抽象数据类型是对已有的数据类型进行抽象,是指一个数据模型及定义在该模型的操作。这样子大家可能不能理解,简单举个例子,我们在打吃鸡游戏的时候,对人物的移动,开枪,捡拾物资等操作都有明确的定义,如何使用这些操作也有明确的说明,但是我们在游戏中使用的战术:掩护队友时要扔烟雾弹,伏击敌人时要趴下匍匐前进等等这些意识,游戏中是没有明确的说明按哪个按钮就可以做这样的动作,这些动作要通过我们的意识以及一系列的动作来完成的,这里的“意识”就是抽象。

抽象其实就是对某个问题的思考方式而没有复杂的实现细节,我们在考虑抽象的时候并不用考虑问题的实际实现,只需要在概念中实现就可以了,而将概念转换为实际就由其他实现。所以抽象数据类型就是:

  • 把实际生活中的问题分解为多个规模小且容易处理的问题。
  • 建立一个计算机能处理的数据模型。
  • 把每个功能模块的实现细节作为一个独立单元,使具体实现过程隐藏起来。

要注意的是:抽象是数据类型在数学特性上的抽象,所有的数据类型都满足这种抽象。


今天就先开个头,因为数据结构是大家在工程师路上必要的一课,虽然大学时可能学过这门课,但当时学的又能记住多少呢?之所以开新的系列专门来整理数据类型而不是放在C语言或者Java下面当作一个分支,是因为数据类型是语言类的基础,就像说话的时候要会说话方式一样,不然说出来的话就没有逻辑性、连贯性,同时数据结构也是人工智能的基础,所以要好好学习哇!我们下次见👋

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值