目录
前言
马上要数据结构考试了,蒟蒻如我为了不挂科开始临时抱起了佛脚,总结了一下书上的定义
一、数据
数据是客观事物的符号表示,是所有输入到计算机程序处理的符号的总称(包括但不限于数字,字符)。
计算机为了记录数据,于是乎就有了数据元素,它是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理,用于完整的描述一个对象。数据元素又是由数据项构成,它是最小的单位,和物理概念的元电荷一样不可再分。
举个例子,一个游戏人物,就属于一个数据元素,而人物的专注,体力等属性就属于数据项。(数据>数据元素>数据项)
二、数据结构
顾名思义,数据结构,就是带结构的数据元素组成的集合,“结构”可以抽象化的看作一种关系,于是乎,数据结构就可以看作一个数据的集合,其中元素都满足一定的关系(或者说是有着某些共同点)。
2.1 数据结构的两种层次
数据结构包含两种层次:逻辑结构和存储结构
2.1.1 逻辑结构
逻辑结构与数据存储无关,独立于计算机,可以视为将具体问题抽象化的模型(如图论中的无向图,就是地图等很多问题的抽象化表示)
逻辑结构的两个要素:数据元素和数据元素间的关系
最基本的四种逻辑结构:
集合结构 :除数据元素属于同一集合无其他关系 (非线性结构)
线性结构 :数据元素间存在一对一关系(四种基础的逻辑结构中唯一的线性结构)
树结构 : 数据元素间存在一对多的关系(非线性结构)
图结构 : 数据元素间存在多对多的关系(非线性结构)
关系如上图,其中:
线性表是一种典型的数据结构
数组的数据元素为线性表
栈与队列的操作只能在其一端或者两端进行
字符串可以看作一种数组,但是其数据元素为单个字符
广义表比较特殊,它的数据元素仍然是线性表,但是线性表之间可以不同构(如第一个线性表可能记录了一个人的身高体重但是下一个线性表可能记录的是这个人的资产状况,而不一定是另一个人的身高体重)
树是一种多分支层次的结构
有向图和无向图唯一的区别在于边是有序对或者无序对(因为这样在处理图论问题的时候,往往将无序对的二元组正反添加两次转换成有向图思考)
2.1.2 存储结构
数据对象在计算机中的存储表示称为数据的存储结构,也称物理结构
存储结构主要考虑两方面与逻辑结构相同,数据元素和数据元素间的关系
最基本的两种存储结构:顺序存储;链式存储
顺序存储:借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,借助数组类型来表述
缺点:占用大块连续空间,同时可能对后续的删除插入的效率有所影响
链式存储结构:无需占用整块连续的空间,为表示节点间关系,需要给每个节点附加指针信息,存储后继元素的存储地址(也不一定是后继,比如树的存储需要记录前继节点的位置;双向链表需要同时记录前继和后继),借助指针描述。
三、数据类型
每一个数据都属于一种数据类型,类型规定了数据的取值范围(由存储该数据分配了多少个字节决定),存储方式以及允许进行的运算(如浮点型不允许进行取模等)。
3.1 数据类型
下面介绍几种C/C++语言比较常见的自带类型;
整型(int,long,long long)
实型,又称浮点型(float,double,long double)
字符型(string,char)
允许用户自定义各种数据类型 :结构体,数组,指针(不太清楚后面的两个为什么算是用户自定义的不算在自带的里面)……
3.2 抽象数据类型(ADT)
找到问题的共同点,在操作过程中不必考虑实现细节(大白话:通解)
大多数数据结构都可以视为一种抽象的数据类型
一般ADT都由三部分构成:数据对象,数据对象上的关系集合,对该对象的基本操作集合
在看课后习题的时候注意到这种题还有一个模板需要注意
数据对象:数据对象的定义
数据关系:数据关系的定义
基本操作:基本操作的定义
在基本操作定义中,要写清楚初始条件和操作结果
四、算法和算法分析
算法:为解决某类问题而规定的有限长度操作序列
其具有五个性质:
1、有穷性:该序列必定可以在有限步数内结束(即一定能完成目标)
2、确定性:就和人说话不能产生歧义一样,算法在跑同样的数据时答案一定是确定的,不会发生变化
3、可行性:算法的操作需要基于基本操作实现(感觉有点废话)
4、输入:一个算法有零或多个输入,当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主函数获得输入值
5、输出:一个算法有一或多个输出,无输出算法没有任何意义
总而言之,广义上的算法指的是完成一件事情的方法,而耗费时间,耗费空间自然是衡量一个方法优劣的关键,于是现在说的算法多说的是一些狭义的算法,即经过多年时间筛选出来解决某一类问题有着优秀的时间复杂度和空间复杂度的算法。
评判算法优劣的标准
1、正确性:在输入合法的情况下,要能得到正确答案
2、可读性:算法的逻辑思路要清晰,具体体现在代码的层次结构上,提高了可读性才能降低隐藏错误的概率
3、健壮性:可以判别出非法的输入
4、高效性:即空间复杂度和时间复杂度要尽可能优秀(时间复杂度很简单就不多说了,容易出错的应该是由于现在空间相对宽裕,鲜少计算的空间复杂度上,空间复杂度计算的是额外占用空间,而不是程序本身占用空间!!!)
总结
菜鸡第一次根据自己的理解总结书本上的知识,希望大佬们看完能指出错误