数据结构期末复习

写在最前面:给好朋友写的算半个错题集的文章,很多都不是原创。不过我觉得考试里面的选择题、填空题、判断题大部分都能在里面找到相应的知识点,以后可能会来完善吧,知识概念比较多,没有关于算法的代码(因为本人是在太菜惹)

绪论
当问题的规模n趋向无穷大时,算法执行时间T(n)的数量级被称为算法的时间复杂度。通常情况下,鉴于运算空间较充足,人们都以算法的时间复杂度作为算法优劣的衡量指标。
空间复杂度也是问题规模n的函数。
评价一个算法时间性能的主要标准是算法的时间复杂度。
数据项:数据的最小单位
数据元素:数据的基本单位
数据结构是带有结构的各数据元素的集合
一些表面上很不相同的数据可以有相同的逻辑结构
一个递归算法必须包括终止条件和递归部分

逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。
算法的时间复杂度不仅与问题的规模有关,还与问题的其他因素有关。如某些排序的算法,其执行时间与待排序记录的初始状态有关。为此,有时会对算法有最好、最坏以及平均时间复杂度的评价。

关于时间复杂度的判断:
i=1;      
while(i<=n)         
i=i3; 答案:O(log3 n)  
解释:语句i=i
3;的执行次数log3 n。

  1. 线性结构
    第一章 线性表
    将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是n次。
    解释:当第一个有序表中所有的元素都小于(或大于)第二个表中的元素,只需要用第二个表中的第一个元素依次与第一个表的元素比较,总计比较n次。
    线性表中结点的集合是有限的,结点间的关系是一对一的。
    创建一个包括n个结点的有序单链表的时间复杂度是O(n²)。         解释:单链表创建的时间复杂度是O(n),而要建立一个有序的单链表,则每生成一个新结点时需要和已有的结点进行比较,时间复杂度为O(n),所以确定合适的插入位置的单链表,时间复杂度是O(n2)。

注意线性表和广义表两个名词的区别!
线性表,最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
求表长、定位这二种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低。
顺序存储结构的地址在内存中是连续的所以可以通过计算地址实现随机存取,与此相对,链式存储结构的存储地址不一定连续,只能通过第i个结点的指针顺序存取。

顺序表(随机存取结构)
可随机访问任一个元素是顺序表的特点。
顺序表中基本操作的实现(插入,删除,求表长)
代码:
若长度为n的线性表采用顺序存储结构,在其第i个插入一个新元素的算法的时间复杂度为O(n)。
顺序存储可以实现“随机存取”,因此访问结点的时间复杂度为O(1),而插入、删除结点由于涉及到大量移动元素,故其时间复杂度为O(n)。
一个向量(即一批地址连续的存储单元)第一个元素的存储地址是N,每个元素的长度(所占用的存储单元)为n,则第i个元素的地址是N+i*n。
顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第(1 2 3 4 5 5和1之间的确隔了4个数)5个元素的地址是108【100+4】(注意:不是110)
将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是n(当第一个有序表所有的元素都小于或大于第二个表中的元素)
除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继。
在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为63.5(平均要移动的个数:n/2;)
补充1:n个元素的顺序表中,查找:平均移动的元素个数为(n+1)/2
补充2:n个元素的顺序表中,插入:平均移动的元素个数为n/2
补充3:n个元素的顺序表中,删除:平均移动的元素个数为(n-1)/2

链表(顺序存取结构):
线性表若采用链式存储结构,要求内存中可用存储单元的地址连续或不连续都可以
顺序表存储密度等于1
链表适用于需不断对表进行插入,删除
创建一个包括n个结点的有序单链表的时间复杂度是O(n的平方) (创建表O(n),排序也是如此)
存储密度=单链表数据项所占空间/结点所占空间

链栈的基本操作:

单链表存储密度小于1是因为结点所占空间由数据项所占空间和存放后继结点地址的链域,所以,存储密度小于1。原因是在数据结构中,存储密度:结点数据本身所占的存储量和整个结点结构所占的存储量之比。
在单链表中增加头结点,是因为通过比较带头结点与不带头结点单链表的建立、插入、删除等基本操作,说明带头结点单链表的算法简单、易懂、容易实现。
循环链表的特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活。
①循环链表中没有NULL指针。涉及遍历操作时,其终止条件就不再是像非循环链表那样判别p或p->next是否为空,而是判别它们是否等于某一指定指针,如头指针或尾指针等。
②在单链表中,从一已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其它结点。而在单循环链表中,从任一结点出发都可访问到表中所有结点,这一优点使某些运算在单循环链表上易于实现。

需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是静态链表。
顺序存储的线性表可以随机存取,在随机查找时,顺序表比较有优势,但由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活。

链表具有的特点是,插入删除不需要移动元素,不必事先估计存储空间,所需空间与线性表长度成正比。

对于只在表的首、尾两端进行插入操作的线性表,宜采用的存储结构为用尾指针表示的循环单链表

在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是O(N),因为要想使插入的元素后仍然有序,就是把所有节点(n个节点)都遍历下,所以是N。
建立一个有n个元素的有序单链表的时间复杂度是O(n2),因为对单链表而言,一些快速的排序算法,不能用,只能用直接插入等o(n2) 级的排序算法来实现排序。而有序单链表每次插入到链表尾结点,那么每次插入都要从头扫到尾,然后1+2+3+… m = O(m^2)这样。

带头结点的单链表head为空的判定条件head-next= =NULL
不带头结点的单链表head为空的判定条件是head= =NULL

循环列表的概念
循环链表的主要优点是在表中任一结点出发都能扫描整个链表。

第二章 栈和队列
栈和队列的共同点是只允许在端点处插入和删除元素。
一个递归算法必须包括终止条件和递归部分。

队列(先进先出)
解决缓冲区问题,用到队列(先进先出的线性表)
循环队列用数组A【0,m-1】存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是(rear-front+m)%m
数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为(n+r-f)%n 
解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列, 差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n。 
总结(尾-头+总数)再对总数取余。

队列只允许在队尾(rear)的一端进行插入操作,在队头(front)的一端进行删除操作

当利用大小为n的数组顺序存储一个队列时,该队列的最后一个元素的下标为(n-1 )
当利用大小为n的数组顺序存储一个队列时,该队列最大的容量为n-1
假设数组是type array[n]
type* front,*rear;
front=rear=array;
入队操作
*rear=x;
rear++;
出队操作
front++;
数组下标最大是n-1

用链接方式存储的队列,在进行删除运算时头,尾指针可能都要修改(一般情况下只修改头指针,但是,当删除的是队列中的最后一个元素时,队尾指针也丢失了,因此需要对队尾指针重新赋值)

最大容量为n的循环队列,队满(rear+1)%n == front;;队空rear ==front;

循环队列存储在数组A[0…m]中,则入队时的操作为rear=(rear+1)%(m+1) 
解释:数组A[0…m]中共含有m+1个元素,故在求模运算时应除以m+1。

队列的基本运算:
① 在队尾插入一个新元素,指针移动到新队尾
② 删除队列中的队头元素,指针移动到新队头
③ 判断一个队列是否为空,该函数为布尔函数,若队列为空,返回真值;反之返回假值。
④ 初始化队列,建立一个空队列Q
⑤ 读取队头元素的值

栈(先进后出)
栈在递归调用,函数调用,表达式求值都有所应用
【栈是堆栈,是一种“特殊”的线性表,这种线性表的插入和删除运算只允许在表的一端进行】
若已知一个栈的进栈序列是1,2,3,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为n-i+1
正常情况下,删除非空的顺序存储结构的堆栈的栈顶元素,栈顶指针top的变化是top=top-1

判断表达式中括号配对用到栈

栈的插入和删除运

  • 34
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值