(计算机考研复试)数据结构重点知识

本文详细介绍了数据结构的重点知识,包括线性表、栈、队列、字符串、树、二叉树、图、查找和排序等内容。对于各种数据结构的特点、优劣、存储结构以及操作进行了深入讲解,如链表的插入、删除操作,二叉树的遍历和存储,图的最小生成树算法等,是计算机考研者的重要参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构

1.绪论

​ 数据结构是相互有一定联系的数据元素的集合,数据结构作用包括数据的组织和存储

​ 算法是问题的解决方案,是能获得正确答案的指令,是对特定问题求解的一种描述

​ 好的算法:“证件课酬高“:正确性,健壮性,可理解性,抽象性,高效性

​ 抽象:抽出问题本质特征,而忽略非本质特征

​ 时间复杂度:算法中基本语句执行次数在渐近意义下的阶

​ 空间复杂度:算法临时开辟的存储空间

2.线性表

​ 随机存储:只要确定了存储顺序表的起始地址,计算任意一个存储单元的存储地址的时间是相等的

​ 单链表:区别头结点和头指针,每个单链表都含有头指针,这是用于找到单链表位置的(类似于数组名),但是头结点的作用在于使插入操作中插入头和插入中间的操作变得一样,若没有头结点,插入操作就要分两种情况,代码坑长,所以需要头结点。故:头指针是指向头结点的指针,头结点是一个没有data的结点。

​ 双链表的插入:若在p后插入s,先完成s所含有的指针的指向,再执行s前后指针使其指向s(四条语句)

​ s->pre=p; s->next=p->next; p->next->pre=s; p->next=s;

​ 双链表删除:删除p,则将p前后指针连接即可(二条语句)

​ p->pre->next=p->next; p->next->pre=p->pre;

​ 循环链表:仍然有头结点,是一个头尾相接的循环单链表

顺序表与链表的优劣

​ 时间性能:顺序表适合查询,链表适合插入,删除

​ 空间性能:一方面链表有指针,占用了内存;但另一方面顺序表在可能分配存储空间过大,导致存储空间没有得到充分利用。

​ 总结:事先知道大致长度,可使用顺序表; 而元素个数变化大或未知,则用链表

3.栈和队列

​ 顺序栈:也就是通过数组来实现栈,一个变量top来代表栈顶,当空栈top=-1,满栈top=size-1。要注意数组的哪一边是底部。

​ 链栈:各人认为是比较好理解的,无论是插入元素还是删除元素都在栈顶操作,所以就不用像单链表一样设立头结点了,且时间复杂度都为o(1)

​ 链栈的入栈操作:假设s是要插入的节点,执行s->next=top;top=s;(top是指针)

​ 链栈的出栈操作:要先判断是否是空栈–if(top==null) 然后再记录top的data和指针,最后top=top->next

​ 队列:

​ 顺序队列:存放在数组中,入队直接写在后面o(1)出队是o(n)因为要全部向前移动;也可以放宽约定通过front和rear两个指针指向队列的头和尾,那么就都是o(1)(双指针法:这在队列中可以说非常常见)

​ 循环队列:解决顺序队列的单向移动性:假溢出。而循环队列:当元素到达数组最大时,再增加元素该元素坐标就执行rear=(rear+1)%quenesize,通过取余操作来判定是否超出了总体长度(其实每次rear都是+1的,但是多个取余保证了不会溢出)。

​ 循环队列队满与队空:这是一个约定,当front=rear队空,当front在rear的前一格视为队满

​ 链队列:链队列其实就是通过单链表制作而成,只是前后两端多了front和rear指针,从而实现在前面出队,只在后面入队(记住这个规则),为了与特殊空链表插入一致,设立头结点。队头指向头结点。

​ 链队列入队:先初始化节点:s->data=x; s->next=null;再插入到尾部:rear->next=s;rear=s;

​ 链队列出队:先判断是不是空节点:if(rear==front) throw"下溢"

​ 删除前保存一下删除节点信息:p=front->next;x=p->data;

​ 再删除:front->next=p->next;

​ 最后再判断一下是不是空链表了:if(p->next==null){rear=front}//如果是就要让rear=front而不是跟着删掉的p节点了

​ 循环队列和链队列的比较:首先他们时间复杂度都是o(1)循环队列需要提前设定存储空间,而链队列则不需要,但是会有指针这种多出来的空间消耗,所以当频繁需要变化时使用链队列,若没有则使用循环队列,在保证不会出现假溢出的情况下也可以使用顺序队列。

综上会发现:链适合变化,顺序表适合存储

4.字符串和多维数组

​ 字符串位置:通过字符串首字母来定位

​ 模式匹配:在主串中寻找子串

​ BF算法:就是暴力法,从一开始每个字符串匹配,直到匹配所有或者中途匹配失败回溯,如果全部匹配完找不到子串返回0,匹配成功,返回本趟匹配起始地址。

​ 最佳情况是每次失败都在第一个字母失败:那么时间复杂度o(n+m);

​ 最坏情况是每次失败都在倒数第二个字母失败:那么时间复杂度o(n*m)

​ KMP算法:是一种字符串匹配的高效办法,不建议理解他的本质,比较复杂。他是通过对子串进行研究,然后生成一个next[j],next数组中每个元素对应子串一个字符串。然后当后面子串与主串匹配时,就不会全部都回溯,而是根据next数组来操作。

​ next的获取:1.当j=0时,next[j]=-1;

​ 2.当j=1时,next[j]=0;

​ 3.当j>1时,看从2到j-1的小串中互相有几个相等的;比如子串T[]=“ababc”,当j=2,T[0]!=T[1],所以next[2]=0; 当j=3,T[0]=T[2],T[0]T[1]!=T[1]T[2]所以next[3]=1;同理next[4]=2;(注意:j为单数比较到中间那个的两边

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值