数据结构
绪论
程序=数据结构+算法
数据结构是介于数学,计算机硬件和计算机软件三者之间的一门核心课程
勤于思考,多做练习,多上机,善于寻求帮助,不怕困难不放弃
具体问题抽象为数据模型(分析问题,提取操作对象,找出操作对象之间的关系,用数学语言描
述),设计算法,编程、调试、运行
增删改查
表,树,图
数据:能输入计算机且能被计算机处理的各种符号的集合。信息的载体,是对客观事物符号化的表示,能够被计算机识别、存储和加工。包括整数、实数、文字、图像、图形、声音
数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,也简称为元素,或称为记录,结点或顶点
数据项:构成数据元素的不可分割的最小单位
数据>数据元素>数据项
数据对象:是性质相同的数据元素的集合,是数据的一个子集
数据结构包括:逻辑结构,(物理结构,存储结构)数据的运算和实现
线性结构:有且只有一个开始和一个终端结点,并且所有的节点都最多只有一个直接前驱和一个直接后继:线性表,栈,队列,串
非线性结构:一对多,多对一。一个节点可能有多个直接前驱和直接后继,例如:树,图
集合,线性,树,图
顺序存储结构:用一组连续的存储单元一次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示
链接存储结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示
索引存储结构:在存储节点信息的同时,还建立附加的索引表
散列存储结构:根据节点的关键字直接计算出该节点的存储地址
int char float double
数据类型是一组性质相同的值的集合以及定义于这个值集合上的一组操作的集合
抽象数据类型形式定义:(D,S,P)D:是数据对象S:是D上的关系集P:是对D的基本操作集
算法:对特定问题求解方法和步骤的一种描述
流程图:传统流程图,NS流程图
一个问题可以有多种算法
算法特性:有穷性,确定性,可行性,输入,输出
算法设计的要求:正确性,可读性,健壮性,高效性
算法分析:时间效率,空间效率
为了便于比较不同算法的时间效率,我们仅比较数量级(渐进表示法)
T(n)=O(f(n)) 时间复杂度
例 :T(n)=O(n的三次方)
一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数
常数项去掉,只保留最高次项的数量级(忽略所有低次幂项和最高次幂系数)
1.找出语句频度最大的那条语句作为基本语句
2.计算基本语句的频度得到问题规模n的某个函数f(n)
3.取其数量级用符号“O”表示
x=0;y=0;
for(int k=0;k<n;k++)
x++;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
y++;
时间渐进复杂度:T(n)=O(n的平方)
空间复杂度:算法所需存储空间的度量
S(n)=O(f(n))
抽象数据类型=数据的逻辑结构+抽象运算
字母表:数据元素是字母,元素间关系是线性
线性表:典型线性结构
线性表中数据元素的类型可以为简单类型,也可以为复杂类型
顺序存储结构和链式存储结构
顺序存储结构,逻辑结构上相邻,物理结构上也相邻
顺序表:地址连续,依次存放,随机存取,类型相同
线性表长可变
数组长度不可动态定义
顺序表的查找算法分析:因为查找算法的基本操作为:将记录的关键字同给定值进行比较
基本操作:L.elem[i]==e
平均查找长度ASL(Average Search Length)(n+1)/2
为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望值叫做查找算法的平均查找长度
顺序表插入:
顺序表放在最后的位置,最简单,直接放置就好
顺序表插入位置在中间,把插入位置后面的元素依次往后搬,把那个位置空出来,在插入
顺序表插入位置在最前面,如上
算法思想:
1.判断插入位置i是否合法
2.判断顺序表的存储空间是否已满,若已满返回error
3.将n至第i位的元素依次向后移动一个位置,空出第i个位置
4.将要插入的新元素e放入第i个元素
5.表长加1,插入成功返回ok
算法时间主要耗费在移动元素的操作上
若插入在尾节点之后,则根本无需移动(特别快)
若插入在首节点之前,则表中元素全部后移(特别慢)
若要考虑各种位置插入(共n+1种可能)的平均移动次数,该如何计算?n/2
顺序表删除:
删除位置在最后:直接删除就行
删除位置在中间:删除位置后的元素依次往前搬
删除位置在最前面:如上
算法思想:
1.判断删除位置i是否合法(合法值为1<i<n)
2.将欲删除的元素保留在e中
3.将第i+1至第n位的元素依次向前移动一个位置
4.表长减1,删除成功返回OK
算法时间主要耗费在移动元素的操作上
若删除尾节点,则根本无需移动(特别快)
若删除首节点,则表中n-1个元素全部前移(特别慢)
若要考虑在各种位置删除(共n种可能)的平均移动次数,给如何计算?n-1/2
顺序表的特点:
1.利用数据元素的存储位置表示线性表中相邻数据元素之间的前后关系,即线性表的逻辑结构与存储结构一致
2.在访问线性表时,可以快速计算出任意一个数据元素的存储位置。因为可以粗略的认为,访问每个元素所花时间相等
这种存储方法是随机存储法
查找,插入,删除算法的平均时间复杂度为O(n)
空间复杂度为O(1)(没有占用辅助空间)
优点:存储密度大(节点本身所占存储量/节点存储所占存储量)
可以随机存取表中任意元素
缺点:在插入,删除某一元素时,需要移动大量元素
浪费存储空间
属于静态存储形式,数据元素的个数不能自由扩充
链式存储:
逻辑结构和物理结构不一定一致
一个节点有两部分,数据域和指针域
单链表:节点只有一个指针域的链表,称为单链表或线性链表
双链表:节点有两个指针域的链表,称为双链表
循环链表:首尾相连的链表称为循环链表
头指针:是指向链表中第一个节点的指针
首元结点:是指链表中存储第一个数据元素的节点
头节点:是在链表的首元结