408——数据结构(持续更新)

一、绪论

1.1 相关概念

  • 数据:数据是信息的载体,所有能被输入到计算机中,且能被计算机处理的符号的集合。如图片、身份信息等。
  • 数据元素和数据项数据元素是数据的基本单位数据项是构成数据元素的最小单位,一个数据集元素可有多个数据项。如:每个学生信息就是数据元素,而学生信息中包含的姓名、年龄等信息就是数据项。
  • 数据对象:具有相同性质的数据元素的集合,是数据的一个子集。如:所有学生的信息可以作为一个数据对象。
  • 数据类型:一组值的集合和定义在该集合上的操作的总和。其中有原子类型(不可再分割)、结构类型(多个原子类型值的集合)、抽象数据类型。
  • 数据结构:相互之间存在一种或多种特定关系的数据元素的集合。如:在学生表中,张三拍在李四的上面,这样有相互关系的数据集合表可称为结构。

blog.csdnimg.cn/direct/1ff2c20068a64c6fab28ba5a15420973.png)

  • 数据:该表就是数据;
  • 数据元素:每个学生的信息就是数据元素,即蓝框所示部分。每行为一个数据元素,其可由多个数据项组成,数据项不可再分。
  • 数据项:如红框所示。
  • 数据对象:如黄框所示,所有学生的信息可作为数据对象;
  • 数据类型:如图中年龄为int类型。

1.2 数据结构三要素

  1. 逻辑结构
    • 线性结构:线性表、栈和队列、数组、串
    • 非线性结构:集合、树、图
  2. 物理结构(存储结构)
    • 顺序存储(逻辑相邻,实际存储位置也相邻)
      在这里插入图片描述

    • 链式存储(逻辑相邻,物理不相邻)
      在这里插入图片描述

    • 索引存储(利用附加索引表):内存中不仅仅要存放每一个数据元素,还要建立一张索引表,其中有多个索引项,每个索引项包括关键字、关键字对应的地址。
      在这里插入图片描述

    • 散列存储(哈希存储)
      在这里插入图片描述

  3. 数据的运算

1.3 相关习题

在这里插入图片描述

顺序表、链表和有序表:

  • 顺序表链表是根据线性表的存储结构(顺序或链式)来划分的概念;
  • 有序表式根据线性表的数据元素的数值大小来划分的概念。

1.4 复杂度

1.4.1 时间复杂度

  1. 常数阶:与问题规模的大小无关,执行时间恒定的算法,O(1)时间复杂度。
    在这里插入图片描述

  2. 线性阶:要确定某个算法的阶次,需要确定某个特定语句运行的次数。因此,要分析算法的时间复杂度,关键是分析循环结构的某个特定语句运行情况。下图,循环的时间复杂度为O(n),因为循环体的代码必须要执行n次。
    在这里插入图片描述

  3. 对数阶
    在这里插入图片描述

  4. 平方阶
    在这里插入图片描述

推导时间复杂度时:

  • 当运行时间只有常数时,用1代替;
  • 在得到的运行次数函数中,只【保留最高阶】,且【除去最高阶项中相乘的系数】。

1.4.2 复杂度相关习题

在这里插入图片描述

  1. 算法执行过程中,所需要的存储空间被称为算法的空间复杂度
  2. 算法的时间复杂度取决于问题规模待处理数据的初态

二、线性表

2.1 概念

  • 前驱元素:若A元素在B元素前面,则称A为B的前驱;
  • 后继元素:若B元素在A元素后面,则称B为A的后继;
  • 特征:数据元素之间只有一对一的关系;
  • 头结点:第一个数据元素没有前驱;
  • 尾结点:最后一个数据元素没有后继。

2.2 线性表分类

2.2.1 顺序表

顺序表是以数组的方式进行存储,查询时间复杂度:O(1)插入时间复杂度为O(n)
在这里插入图片描述
特点:逻辑地址相邻,物理地址也相邻

2.2.2 链表

链表分为单向链表双向链表。特点是:逻辑地址相邻,物理上不一定相邻,由指针指向下一个数据元素。

  1. 单向链表
    在这里插入图片描述
    • 每个节点由一个数据域和一个指针域组成,数据域用来存储数据,指针域用来指向下一个节点。
    • 头结点的数据域不存储数据
    • 尾结点的指针域是空的。

判断单链表是否为空

p->next = null 

插入节点

newcode->next = t->next
t->next = newcode

在这里插入图片描述

删除节点

t->next = t->next->next

在这里插入图片描述

  1. 双向链表
    在这里插入图片描述
    • 每一个节点由一个数据域和两个指针域组成,数据域用来存储数据,指针域分别用来指向前一个节点和后一个节点。
    • 头结点不指向前一个节点,也不存储数据。
    • 尾结点不指向后一个节点,但是它指向后一个节点,存储数据。

双向链表初始化

head->prev = head
head->next = head

在这里插入图片描述
双向链表插入元素

node->next = p->next
p->next->pre = node
node->pre = p
p->next = node

在这里插入图片描述
双向链表删除元素

p->next->next->pre = p
p->next = p->next->next

在这里插入图片描述

2.3 相关习题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、栈和队列

3.1 栈

栈也是一种线性结构,特点:先进后出,后进先出
在这里插入图片描述
栈的初始化
在这里插入图片描述

  • s.top = s.base代表栈空。
  • top为栈顶指针,栈顶指针指向的地址值为空;top的初值指向栈底;
  • 每当插入一个元素时top+1,弹出一个元素时top-1

判断是否为满栈

s.top-s.base == s.StackSize # StackSize代表分配的存储空间

入栈

if(S.top-S.base==S.StackSize) return ERROR; # 栈满
*(s.top) = e; 将元素e压入栈顶,同时栈顶指针+1
s.top++

出栈

if(S.top-S.base==S.StackSize) return ERROR; # 栈满
s.top--;		# 栈顶指针-1,栈顶元素出栈
*(s.top) = e;  

3.2 栈相关习题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.3 队列

  • 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特性。
  • 队头:进行删除操作的一端。
  • 队尾:进行插入操作的一端。
    在这里插入图片描述
    队列的存储结构分为顺序存储链式存储

3.3.1 队列(顺序存储)

求顺序表的长度

Q.rear-Q.front

Q.rear跟栈的s.top一样,尾指针始终指向队尾元素的下一个位置。

入队
在这里插入图片描述

Q.base = new QElemType[Maxsize];
if(Q.rear == Maxsize) return 0; # 判断队列是否满了
Q.base[Q.rear] = e; # 将新元素插入队尾,队尾指针+1
Q.rear++;

在这里插入图片描述

Q.base = new QElemType[Maxsize];
if(Q.rear == Maxsize) return 0; # 判断队列是否满了
e = Q.base[Q.front]; # 删除队头元素,front指针+1
Q.front++;

假溢出
顺序存储的队列会出现假溢出现象,如下右图所示,rear指针会告诉我们队列已满,实际并没满。引入循环队列
在这里插入图片描述
判断队满、队空

Q.front == Q.rear # 队空
(Q.rear+1)%Maxsize == Q.ront # 队满,取余,损失一个空间

在这里插入图片描述

3.3.2 队列(链式存储)

在链队中,只允许单链表的表头进行删除操作(出队),表尾进程插入操作(入队)。分为普通节点和头结点。
在这里插入图片描述
链队初始化

q = (LinkQueue *)malloc(sizeof(LinkQueue));
q->front = null; # front指向空
q->rear = null;  # rear指向空

判断队列是否为空

q->front=null && q->rear=null

链队入队

p = new Qnode;
p->data = e; 
p->next = null; Q.rear->next=p; # 将新节点插入队尾
Q.rear = p;  # 修改队尾指针

链队出队

p=Q.front->next;
e=Q.front->next->data;
Q.front->next = p->next; # 修改头结点的front指针
if(Q.rear ==p) Q.rear=Q.front; # 最后一个元素被删,队尾指针指向头结点
delete(p); # 删除节点

3.4 队列相关习题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、串、数组和广义表

4.1 串

串是一种特殊的线性表,其是由零个或多个字符组成的有限序列,字符可以是字母、数字或其他字符;串中字符的个数n称为串的长度,n=0的串称为空串。串中任意个连续字符组成的子序列称为该串的子串

线性表的基本操作主要是以单个元素作为操作对象,串的基本操作主要以子串作为操作对象。

KMP算法
KMP算法的核心:一旦发生字符不匹配,保持主串指针不变,将模式串指针回溯到主串的最大后缀等于模式串的最大前缀

  • 前缀:除最后一个字符的所有子串;
  • 后缀:除第一个字符的所有子串。

在这里插入图片描述

next数组保存的指针j的值,next[1]默认写0

在这里插入图片描述

4.2 串习题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

nextval:相同元素情况下,找索引最小的next值。

4.3 数组

数组是线性表数据结构,它使用一组连续的内存空间,来存储一组具有相同类型的数据。二维数组内存结构:行优先存储列优先存储
在这里插入图片描述
特殊矩阵存储
1、对称矩阵
对称矩阵按照行优先进行存储,存储对称方阵最多存储n*(n+1)/2个元素。
在这里插入图片描述
在这里插入图片描述
2、上/下三角矩阵
上三角矩阵按行优先进行存储,最后一个位置存储常量C。
在这里插入图片描述
在这里插入图片描述

3、三对角矩阵
行优先存储,元素个数为:3n-2
在这里插入图片描述
4、稀疏矩阵
稀疏矩阵:非零元素远远少于矩阵元素的个数。
在这里插入图片描述

  • 顺序存储(三元组——行、列、值)
    在这里插入图片描述
  • 链式存储——十字链表法
    在这里插入图片描述

4.4 数组习题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5 广义表

广义表又称列表,也是一种线性存储结构
在这里插入图片描述

五、树

度:节点拥有的子树数目
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值