-
数据结构概述
-
基本概念
数据结构指的是计算机存储数据和组织数据的方式,存储数据和组织数据的目的是为了后期对数据的再次利用,所以存储的数据一般是具有一个或者多个特定关系的集合,利用不同的数据结构可以提高数据的访问效率。
思考:为什么大家来到新教室选好座位之后需要填写座位表?? 答案:方便对数据管理
数据指的是可以被输入到计算机并且可以被计算机处理的符号的总称,数据的英文是Data。
数据是有单位的,数据的基本单位是数据元素(Data Element),在计算机中数据元素是作为整体来处理的,比如学生的信息。数据元素是由多个数据项组成的,所以数据项也被称为数据的最小单位,比如学生信息中的学号、姓名、年龄,数据项属于数据元素不可分割的一部分。
举例:比如国家是数据元素,则每个国家的城市就是数据项,数据项是数据不可分割的部分。
注意:世界上不止有一个国家,如果每个国家都是数据元素的话,则多个数据元素的集合就被称为数据对象(Data Object)。
数据结构就是描述多个数据之间的逻辑结构和物理结构。逻辑结构指的是数据元素之间的逻辑关系,物理结构指的是计算机中存储数据的方式,所以物理结构也被称为存储结构。
注意:数据元素的逻辑关系和物理关系没有必然的联系,数据元素可能同时存储逻辑关系和物理关系,数据元素之间也可能只存在一种关系,或者数据元素之间一种关系都没有。
-
逻辑关系
对于数据结构的逻辑关系,可以分为四种:集合(无关系)、线性结构(一对一)、树状结构(一对多)、图状结构(多对多)。
-
物理关系
数据的物理关系可以分为两种:一种是顺序结构(连续存储),另一种是离散结构(离散存储),一般把顺序结构也称为顺序存储,一般把离散结构也称为链式存储,两种区别如下图
练习:请问该笔试题的结果是什么?请给出简单的推理过程,请独立完成该笔试题的分析。
- 算法概念
广义上讲算法是研究数据之间的逻辑关系,然后选择某种方案来存储数据,并在此基础上对数据进行处理,其实更加直白的说:算法指的是计算或者解决问题的步骤。
请问:如果把下面的一个随机数列中的数值按照从小到大顺序进行排列??具体步骤是什么??
-
算法特征
- 有穷性:指的是程序执行必须在有限次数内完成,而每一次必须在有限时间内执行完成。
- 确定性:执行的每一条语句都必须有准确的解释,不能出现二义性,意味着相同的输入 就会相同的输出。
- 可行性:程序中每一条复杂语句都可以分解为基本指令,并且每条基本指令都必须在有 限时间完成。
- 输入项:指的是算法可以有一个或者多个参数作为初始条件,然后对程序进行有效执行。
总结:一个程序的执行是需要用户选择合适的算法和数据结构的,程序 = 数据结构+算法。
思考:到底什么样的数据结构和算法是合适的?怎么去评定选择的数据结构和算法是否合适?
回答;对于数据结构的选择和算法的选择并不是唯一的,但是选择要是合适的,衡量数据结构和算法的选择是否合适,取决于算法实现的运行时间和内存空间。一般是通过两个专业性名称,分别是“时间复杂度”和“空间复杂度”。
-
时间复杂度
时间复杂度不是指算法完成1次花费的时间,因为取决于硬件的性能,比如8位单片机的主频一般是12MHZ,而32位的MCU的主频有72MHZ、180MHZ,而64位的CPU的主频高达2.9GHZ。
时间复杂度指的是算法程序的基本执行语句的执行次数,也可以称为语句频度,一个程序的语句执行次数越多,则时间复杂度越大,则说明算法不合适。时间复杂度一般采用数学符号大O()表示,一般时间复杂度的计算中都会出现n,n表示规模,对于时间复杂度是表示算法的趋势。
一般会把算法程序的语句的执行次数用T()表示,但是对于函数T()可能是一个多项式,而时间复杂度就是找出函数T()影响最大的项,所以时间复杂度是执行语句的估算值,使用数学符号大O()表示。O其实是order的缩写。大O的括号中写的值就是影响程序执行语句最大的那个项。
计算技巧:如果算法中没有使用n来表示规模,也就是如果计算出的多项式是一个常数项,则时间复杂度恒为 O(1)。
-
空间复杂度
空间复杂度指的是程序运行期间所需要的内存空间,空间复杂度越大,则说明程序运行期间需要的内存越多,则说明算法不合适。
注意:程序中的时间复杂度和空间复杂度是可以互相转换的,一般情况下是相互制约的,意味着“鱼和熊掌不可兼得”,所以用户根据实际情况去选择时间还是空间,意味着要选择合适的算法来保持平衡。
一个好的算法通常是执行时间短,占用空间少,并且可读性好、容易维护,易于移植到其他平台。
练习:请问该笔试题的结果是什么?请给出简单的推理过程,请独立完成该笔试题的分析。
- 结构类型
大家在学习C语言的时候接触的数组在数据结构中是属于线性表的一种,线性表是由一组具有n个相同类型的数据元素组成的。
线性表中的任何一个数据元素有且只有一个直接前驱,以及有且只有一个直接后继,另外首元素是没有前驱的,尾元素是没有后继的。
某个元素的左侧相邻元素被称为“直接前驱”,元素左侧所有的数据元素被称为“前驱元素”。
某个元素的右侧相邻元素被称为“直接后继”,元素右侧所有的数据元素被称为“后继元素”。
满足这种数学关系的一组元素,逻辑关系就是线性结构,并且逻辑关系是一对一的,比如一个教室学生的学号、一个排队的队伍、一摞堆好的盘子.....都属于线性结构,当然线性结构和存储方式是无关的,简单理解:只有逻辑关系是一对一的,就是线性结构。
所以,根据数据的存储方式可以把线性表分为两种:顺序存储的线性表,链式存储的线性表。
顺序表的原理与应用
-
基本概念
顺序表指的是使用一组内存地址连续的内存单元来依次存储线性表中的数据元素,使用这种存储结构的线性表就被称为顺序表。
简单理解:数据存储在一块连续的内存中,在C语言中可以具名的数组,也可以使用匿名的数组(堆内存)。
顺序表的特点:数据元素之间的逻辑关系是相邻的,并且内存地址也是相邻的,所以只要知道存储线性表的第一个数据元素的内存地址,就可以对线性表中的任意一个元素进行随机访问。通常用户使用动态分配的数组来实现顺序表,也就是使用堆内存实现。
随机访问指的是在同等时间内具有访问任意元素的能力,和随机访问相对立的就是顺序访问,顺序访问花费的时间要高于随机访问,比如卷轴(顺序)和书籍(随机)、磁带(顺序)和唱片(随机)。
练习:请问该笔试题的结果是什么?请给出简单的推理过程,请独立完成该笔试题的分析。
练习:请问该笔试题的结果是什么?请给出简单的推理过程,请独立完成该笔试题的分析。
练习:请问该笔试题的结果是什么?请给出简单的推理过程,请独立完成该笔试题的分析。
-
程序设计
思考:既然数组可以作为线性表来使用,请问如何对数组中的元素进行增加和删除以及访问?
回答:如果打算使用数组实现线性表的特性,需要知道三个条件:数组首元素地址、数组元素的容量、数组有效的最后一个元素的下标。
- 创建顺序表
- 插入新元素
- 删除元素
- 判断顺序表是否已满
- 判断顺序表是否为空
- 遍历顺序表
- 结果验证
练习:请问该笔试题的结果是什么?请给出简单的推理过程,请独立完成该笔试题的分析。
练习:请问该笔试题的结果是什么?请给出简单的推理过程,请独立完成该笔试题的分析。
int DeleteData(&L,int p,&e){if(p > length -1 )return 0;e = L[p];for(int i = p; i< length -1;i++){L[i] = L[i+1];}length --;return 1;}