2020-12-06

数据结构导论

  1. 概论
    1.1数据,数据元素,数据项
    数据:视频,音频,字符,图片,表等
    数据元素:表的一行为什数据元素
    数据项:一行中一个字段的值
    1.2数据逻辑结构
    集合:集合中任意两个节点都之间都没有邻接关系,组织形式松散
    线性结构:一对一
    树形结构:一对多
    图形结构:多对多
    1.3数据的存储结构
    定义:数据的逻辑结构在计算机中的实现叫做存储结构
    包括两个部分:
    (1)存储数据元素
    (2数据元素间的关联方式)
    主要存储方式顺序存储链式存储
    顺序存储:所有的存储点存放在一个连续的存储区,利用节点在存储器中的相对位置来表示数据元素间的逻辑关系
    链式存储:每个存储节点除了含有一个数据元素外,还包含指针,每个指针指向一个与本节点有逻辑关系的节点,用指针表示数据元素之间的逻辑关系
    索引存储:
    散列存储:
    1.4运算
    指某个逻辑结构上施加的操作,增删改查
    1.5算法和函数
    函数是算法的具体实现
    1.5算法分析
    评价算法好坏标准:
    (1)正确性(满足需求)
    (2)易读性(容易阅读,修改,交流,扩充)
    (3)健壮性(输入非法数据,能做出适当的反应,不会产生预料不到的运行结果)
    (4)时空性(时间复度度和空间复杂度)
    时间复杂度:O表示,常数阶O(1),线性阶O(n),
    多项式阶O(n^2),对数阶O(logn),O(nlog2 ^n),指数阶O(2 ^n),
    一般采用算法的最坏时间复杂度来评判算法的好坏
    一般看算法中含有多少个循环递归 ,没有循环递归称常数阶
    效率排序O(1)<O(nlog n) < O(n^2)<O(n ^3)<O(2 ^n)
    <O(n!) <O (n ^n)
    空间复杂度:对算法运行过程中临时占用存储空间大小的度量
    2.线性表
    2.1概念:线性表中节点具有一对一的关系,如果节点数不为零,则除起始节点没有直接的前驱,其他节点有且只有一个前驱,除了终端节点没有后继,其他的节点只有一个后继;
    缺点:很可能造成空间的浪费,存储空间的碎片化
    基本运算:初始化,求表长,读表元素,定位,插入
    2.2线性表的顺序存储:逻辑结构相邻的节点其存储位置也相邻,
    用顺序存储实现的线性表为顺序表,一般用数组表示顺序表
    顺序表
    在这里插入图片描述

2.3线性表的链接存储:链接存储是指它的存储结构是链式的。线性表常见的链式存储结构有,单链表,循环链表和双向链表
2.4单链表:由两部分组成:数据元素和指针,相当于火车的车厢跟车钩。各个节点在内存中的存储位置不一定连续。链表的节点可以重新连接,相当于火车的编组
单链表分非空单链表和空单链表
单链表分为两种
2.4.1 单链表建表
尾插法:从链表的尾部添加结点
方法一:这个过程分为三部分,首先建立带头结点的空表,其次建立一个新的结点,然后将节点连接到头结点之后,重复后面两个步骤,直到线性表中所有元素的链接到单链表中。
方法二:方法一由于每次插入都从表头开始查找,比较浪费时间。因为每次都是把新的结点链接到表尾,我们可以用一个指针指向为结点,这样就为下一个新的结点指明了方向
头插法:从链表的头部还是插入结点
2.5循环链表
概述:在单链表中,如果让最后一个结点的指针域指向第一个结点,可以构成循环链表,从任一结点出发能够扫描整个链表。
四种类型循环链表
在这里插入图片描述

在这里插入图片描述
2.5.1双向循环链表
双向循环链表的结点由两个指针域,前指针域和后指针域,前指针域指向前驱结点,后指针域指向后继结点
在这里插入图片描述
在单链表中,找直接后继结点的时间复杂度度是O(1),在双向循环链表中,找直接后继结点和前驱结点的时间复杂度都是O(1)
2.6顺序实现和连接实现的比较
1.查找:对于按位置查找运算,顺序表是随机存取,时间复杂度为O(1)。单链表需要对表元素进行扫描,它的时间复杂度为O(n)
定位:基本操作是比较,顺序表和单链表上的实现算法的时间复杂度是相同的,均为O(n)

2.插入和删除:在顺序表和链表中,都需要进行定位。在顺序表中,其基本操作是元素的比较和结点的移动,平均时间复杂度度为O(n)。在单链表中,由于需要定位,基本操作是元素的比较,尽管不需要移动结点,其平均时间复杂度仍然为O(n)

3.单链表的每个结点包括数据域跟指针域,指针域需要占用额外空间。从整体考虑,顺序表要预分配存储空间,如果预先分配的空间过大,将造成浪费,若分配空间过小,又将发生上溢;单链表不需要预先分配空间,只要内存空间没有消耗殆尽,单链表中的结点个数就没有限制。
3.栈,队列,数组
栈,队列与线性表的逻辑结构相同,可以把栈,队列看成特殊的线性表,
其操作只能在表的一端或两端进行
3.1栈
栈是运算受限的线性表,这种线性表上的插入删除运算限定在表的某一端进行,允许插入删除的一端称之为栈顶,另一端为栈底。不含任何数据元素的栈称之为空栈,处于栈顶位置的数据元素称之为栈顶元素。
栈具有先进后出,后进先出的特点。
3.1.1栈的顺序实现
栈的顺序存储结构是一组连续的存储单元依次存放栈中的每个元素,并用始端作为栈底。用顺序结构实习的栈称之为顺序栈,同常用一个一维数组和一个记录栈顶位置的变量来实现的。元素从下标为1开始,top为0时为空栈。
3.1.2栈的链式实现
栈的链式实现,即用链表作为存储结构实现栈的先进后出的特性,我们称之为链栈,链栈不用考虑容量大小。
在进栈操作算法中采用前插操作,新增结点始终插入到头结点之后。
链栈为空的条件首结点指针域为NULL。
3.1.3栈的简单应用与递归
1.递归前进段
2.递归边界条件
3.递归回归段
递归函数的运行引起递归调用。为了保证在不同层次的递归调用能正确的返回,必须将每一次递归调用的参数和返回值保存起来。由于函数的递归调用是后进先出的,所以要用栈来保存这些值
3.2队列
队列是有限个同类型数据元素的线性顺序,是一种先进先出的线性表,新加入的数据元素插在队列的尾端,出队列的数据元素在队列的首部删除
3.2.1队列的顺序实现
下标为零的结点不存储数据,当front跟rear指针指向同一个下标,front=rear时队列为空
在这里插入图片描述
为了解决假溢出现象,可以将存储队列的元素的一维数组首尾相接,形成一个环状,这样的队列称之为循环队列
循环队列队满条件: ((CQ.rear+1)%maxsizeCQ.front)
循环队列队空条件:(CQ.rear
CQ.front)
在这里插入图片描述
3.2.2队列的链式实现
使用一个带头结点的单链表来表示队列,称之为链队列
链队列为空front,rear指针指向头结点,头结点数据域为空,指针域为null
在这里插入图片描述
3.3数组
3.3.1数组的逻辑结构和基本运算
数组是由一组具有相同类型的数据元素组成,并存储在一个连续的单元中。二维数组可以看成一个一维数组的每一个元素又是一个一维数组,数组的每一个元素都是一个二维数组,我们称之为三维数组。
3.3.2数组的存储结构
一维数组的内存单元地址是连续的,二维数组由两种存储方法:以列序为主序存储,以行序为主序存储,通常采用行序存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值