数据结构复习
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构的研究内容为:
研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系。
五个基本概念
数据(Data):是对客观事物的符号表示(信息的描述),一切能够由计算机接受和处理的对象。
数据元素(Data element):是数据的基本单位,在程序中作为一个整体加以考虑和处理。
数据项(Data item):是数据的不可分割的最小单位,在有些场合下,数据项又称为字段或域。
数据对象(Data object):性质相同的数据元素的集合,是数据的一个子集。
数据结构(Data structure):相互之间存在一种或多种特定关系的数据元素的集合。元素之间的关系称为逻辑结构。
四种经典数据(逻辑)结构
集合——数据元素间除“同属于一个集合”外,无其它关系
线性结构——元素间有严格的前后关系,且是“一对一”的关系
树形结构——元素间有层次关系,且是“一对多”的上下关系
图形结构——元素间有复杂的“多对多”关系
数据的两种物理(存储)结构
物理结构:描述数据元素在计算机存储器中的存储方式。
顺序存储结构(顺序映像):逻辑相邻的元素物理存储上相邻;
链式存储结构(非顺序映像):逻辑相邻的元素物理存储无关。
数据类型与抽象数据类型
数据类型是一个值的集合和定义在这个值集上的一组操作的总称。
按值的不同特性,高级语言中的数据类型分为:
原子类型:原子类型的值是不可分解的
结构类型:结构类型的值是由若干成分按某种结构组成的,是可以分解的。
算法:为了实现特定的目标而设计的一组有序的操作步骤。
算法的特性
1)有穷性
算法在执行有限的步骤后,能正常结束而不会出现无限循环,并且每一步在可接受的时间内完成;
2)确定性
算法每一步都有确定的含义,不能出现二义性;
3)可行性
算法的每一步可以转换为程序上机运行,并得到正确结果;
4)输入与输出
算法存在0或多个输入,至少1个输出。
“好算法”的目标
1)正确性:对于每一个输入,总能得到正确的输出;
2)可读性:便于人类的阅读、学习和扩展;
3)健壮性:对于错误的输入,算法要能做出处理,而不是发生异常或莫名其妙的结果;
4)高效率与低存储量:对于相同的问题,在保证上面3个特性的前提下,尽量做到时间和空间的低消耗。
时间复杂度的常见形式:
◆单个表达式和语句的运行时间是常数,可认为与问题规模n 无关,记为O(1),称为常量阶。
◆对数阶O(log n)
◆线性阶O(n)
◆nlogn阶O(nlogn)
◆平方阶O(n2)
◆指数阶O(2n)
线性表
①只有一个首元素和尾元素;
②除首元素外,其他元素只有一个直接前驱,除尾元素外每个元素只有一个直接后继。
线性表的顺序存储/顺序映像:用一组地址连续的存储单元(数组)依次存储线性表的数据元素。
顺序存储的线性表称为顺序表。
顺序存储的优点:数据的存储位置反映数据间的逻辑关系,即不用特意存储数据间的关系
顺序存储的优势:根据元素的逻辑位序可以实现对数据元素的随机存取(获取元素所需要的时间与数据所在的位置无关)
顺序表的实现(数组)
静态数组:通过数组定义语句,预先分配固定大小的存储空间
动态数组:在需要存储数据时,动态申请所需大小的存储空间
插入第i个数据操作
从表尾向前到第i个位置,依次将数据元素后移,共移动length-i+1个数据
删除第i个数据操作
从第i+1个位置往后到表尾,依次将数据元素前移,共移动length-i个数据
顺序表的插入和删除操作时间复杂度:T(n)=O(n)
算法时间主要耗费在移动元素的操作上
删除元素的平均移动次数
链式存储结构:
数据元素在存储器中的存储位置是任意的,即逻辑上相邻的数据元素在物理存储上不一定相邻
线性表的链式表示被称为链表:
单链表
静态链表
双链表
循环链表
单链表
定义:用一组地址任意的存储单元存放线性表中的数据元素( 存储单元可以是连续, 也可以是不连续的)。
结点:每个元素由结点(Node) 构成, 它包括两个域: 数据域data 和指针域next;数据域存储数据元素的值,指针域存储逻辑上相邻的后继元素的存储地址。
▪表尾元素结点的指针域的值为NULL,称为空指针。
▪表头元素结点的地址称为头指针,是访问单链表的入口。
插入:已知指针p和s,将s指向的结点插入到p指向的结点后面
s->next = p->next;
p->next = s;
删除q操作代码(p为q的前一个元素)
q = p->next ;
p->next = q->next;
free(q);
静态链表
用连续的存储单元(数组)实现链式结构,方便在无指针类型的环境下使用链表结构。
循环链表
表中最后一个结点的指针域指向头结点。
循环链表的好处:
从任意结点开始,可以找到表中其他结点。
带头结点的循环链表为空的判定条件:L->next == L
双向链表
每个结点中包含指向直接前驱和直接后继的两个指针域。
若p为指向表中某一结点的指针,则有:p->next->prev = p->prev->next =p