vector<>
这个作者很懒,什么都没留下…
展开
-
【测开求职】面试题:数据结构 吐血整理
本篇文章是笔者为准备研究生复试以及校招而写,因此主要针对问答,注重理解,而不在于细节计算。涵盖考研范围内的所有知识内容,读者可以先查看上面的链接走一遍数据结构的整体框架结构。其中,重点难点以及易混淆的知识点,笔者用其他近30篇文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。原创 2021-03-07 21:05:35 · 6337 阅读 · 6 评论 -
【数据结构】-数据结构讲什么?
齐悦老师在书中谈到数据结构研究的是计算机所处理的数据元素之间的关系,以及处理这些元素的操作算法第一章线性表讲了顺序表,链表,栈,队列,压缩矩阵第二章树介绍了树,森林,二叉树,其中二叉树还介绍了三种应用第三章图主要介绍了图的集中存储方式,遍历方式,以及几种与图相关的应用第四章查找共介绍了六种查找,其中包括三种应用于查找的数据结构,B树和B+树,以及哈希表第五章排序介绍了内部排序和外部排序,内部排序中五种排序算法是重点第六章串重点..原创 2021-03-03 22:12:15 · 1172 阅读 · 2 评论 -
【数据结构】-408真题-编程题总结
单链表【2009】【2012】【2015】【2019】数组【2010】https://blog.csdn.net/qq_39328436/article/details/108555686考点:循环左移数组方法:1.全部翻转 2.前面翻转 3.后面翻转【2011】https://blog.csdn.net/qq_39328436/article/details/106673506考点:找两个数组的中位数方法:归并比较【2013】https://blog原创 2020-11-19 21:14:38 · 5800 阅读 · 7 评论 -
【数据结构】-单链表-按照递减的顺序合并两个递增的单链表
这道题融汇了单链表编程中的几个重要技巧1.前后指针2.头指针next设置为空,用原始节点组合成新的单链表根据下面这个例子不难看懂 LinkList Re_Con_Sort(LinkList L, LinkList M){ LNode*p = L->next, *q = M->next; LNode *p_rear = NULL; LNode *q_rear = NULL; L->next = NULL; M->ne...原创 2020-07-20 21:02:00 · 1157 阅读 · 11 评论 -
【数据结构】-排序-基于单链表的简单选择排序
方法一:不进行任何断链插入操作,找到目标节点之后,只是交换data值,这个思路很简单,与简单选择排序的思路一摸一样。编程注意事项:min不能标记最小值,应该要标记最小值对应的链表节点LinkList createLink(LinkList L) { cout << "尾插法创建单链表:"<<endl; int a; L = (LinkList)malloc(sizeof(LinkNode)); L->next = NULL; LinkNode *p=L,原创 2020-07-12 11:08:18 · 9767 阅读 · 9 评论 -
【数据结构】-模式匹配-KMP算法
模式匹配:在主串中找到与模式串相同的子串,并返回其位置在讨论KMP时,先来看看朴素模式匹配有什么问题。朴素模式匹配的思路是把主串中与模式串长度相同的所有子串搞出来,挨个与模式串对比,有一个字符不匹配时,立即放弃当前子串,转而索引下一个子串。在最坏的情况中,主串指针向前走m步,回退m-1步(前m-1个字符都匹配,到最后一个字符不匹配,白干了),模式串也不断在回退,导致算法时间复杂度很高。由此引入了KMP算法,需要注意的是只有在子串与模式串经常能部分匹配的时候,kmp才比朴素模式匹配优秀很多。思路:.原创 2021-03-08 21:44:45 · 568 阅读 · 2 评论 -
【数据结构】-B树与B+树
比较B树(多路平衡查找树) B+树 由二叉查找树进化而来---->m叉查找树 由分块查找进化而来--->多级分块查找 根节点的关键字范围:[1,m-1] 根节点的关键字范围:[2,m] n个关键字对应n+1个分支 n个关键字对应n个分支 关于分支是一样的:根节点分支数范围:[2,m];除根节点外,其他节点数范围:[m/2,m] 所有节点中都包含记录信息 只有叶子结点中包含记录信息 不支持顺序查找 支持顺序查找 查.原创 2021-03-08 20:54:35 · 453 阅读 · 0 评论 -
【数据结构】-树-查找根节点到某结点的路径
【2021王道模拟2】是一个老生常谈的问题,和之前王道上的一道模拟题大同小异https://blog.csdn.net/qq_39328436/article/details/106788087【算法要点】看到关于树的路径问题,祖先问题,第一个就要想到后序遍历,掌握住后序遍历的两种方法https://blog.csdn.net/qq_39328436/article/details/106762908掌握住便利模板,按照要求往里面套就好了(哎,太容易遗忘了)【存储结构】typedef原创 2020-12-15 20:47:29 · 1340 阅读 · 0 评论 -
【数据结构】-线性表-【2020真题】-三元组最小距离
【算法思路】不妨设三元组中a<b<c ,a为最小值,b为最大值,要求的距离=2*(c-a),如图所示也就是说只有最大值c和最小值a会影响距离的大小,寻找最小距离的方法是每次都固定一个c,寻找这个c下使得距离最小的a1.开始遍历时最小值为a,最大值为c,当前的abc确定一个距离54,暂时保存下来2.试探是否存在更大一点的a使得a-c更小,也就是a的下标向前移动,得到新的三元组3.新的三元组中重新确定abc的身份,此时新的最小值更小,于是更新54为244.继续向前..原创 2020-12-04 22:15:30 · 2379 阅读 · 3 评论 -
【数据结构】-树-求先序遍历中第k个结点的值
【算法思路】采用递归中序遍历,设置递归计数器,第k次递归结束后,输出结点的值,并结束程序【二叉树存储结构与算法】typdef struct BiTNode{ int data; struct BiTNode*lchild; struct BiTNode*rchild;}BiTNode, *BiTree;int num = 0;void DLR_k(BiTree T,int k) { if (T) { num++; if (num == k) { ...原创 2020-11-29 12:27:04 · 3472 阅读 · 0 评论 -
【数据结构】-时间复杂度和空间复杂度
1.时间复杂度注意研究的是n趋向于无穷大的时候的数量级做题方法:寻找基本语句执行次数与问题规模之间的关系基本语句的选取方法:即有乘法又有加法时,选取乘法为基本语句;只有加法时,选取加法为基本语句主要有三种考察方式:普通类型:直接找基本语句执行次数与问题规模之间的关系【2017年真题】嵌套类型:涉及到无穷小量的乘法【2014年408真题】并列类型:涉及道无穷小量的加法递归类型:寻找递归次数即可...原创 2020-10-30 18:36:42 · 417 阅读 · 0 评论 -
【数据结构】-串-朴素模式匹配
算法注意事项:1.这个算法单独用k来标记伦次,教材中用i-j+2来返回伦次,虽然省去了k使得代码更简单,但是不那么清晰易懂2.注意匹配成功的条件是模式串遍历成功int PusuMoshi(string t, string s) { int i = 0;//主串下标 int j = 0, k = 0; while (i<t.length()) { if (t[i] == s[j]) { i++; j++; } else { ...原创 2020-09-21 20:09:00 · 165 阅读 · 0 评论 -
【数据结构】-线性表-【2010真题】-数组循环左移
算法思路:完全没有想到这个点,先将全部元素翻转,后将前部分翻转,最后将后部分翻转,最后就满足了循环左移的效果翻转的算法思路:从前向后,移动到中点位置的时候停止交换typedef struct { int *data; int maxsize, length;}sqlist;sqlist Reverse2(sqlist L, int left, int right) { int temp = 0; for (int i = left; i < (right + ...原创 2020-09-12 22:08:21 · 1382 阅读 · 0 评论 -
【数据结构】-图-用DFS实现逆拓扑排序
DFS实现逆拓扑排序算法思路:1.只要某结点还有没有访问的邻接节点,就会继续向下递归调用DFS,不断填充递归栈。2.没有未访问的邻接结点时,退栈,只要退栈时将节点输出即可编程注意事项:用DFS实现拓扑排序(https://blog.csdn.net/qq_39328436/article/details/107450388)以及逆拓扑排序,算法中都是基于DAG图实现的,没有考虑有环的情况。按照这样的方法,在有环的情况下也会输出一个排序,所以更严谨的算法应该增加环路判断。void D原创 2020-09-03 09:45:06 · 3864 阅读 · 5 评论 -
【数据结构】-树-从大到小输出二叉排序树中所有值不小于k的关键字
算法思路:已知在二叉排序树中,按照DLR的顺序遍历可以得到一个递增的序列,因此按照RDL的顺序遍历,便可得到逆序序列。模仿中序递归的思想就可以做出来这个题目了。注:可以看到连着的好几个二叉排序树的题目,都是思路简单,代码简单,(当然前提是要想得到),在写程序的过程中才发现这是多么美丽的一个数据结构。void RDL_print(btree T,int k) { if (T != NULL) { RDL_print(T->rchild,k); if(T->data>=k原创 2020-08-29 23:06:14 · 4712 阅读 · 9 评论 -
【数据结构】-树-求二叉排序树上的最大最小值
算法思路:在二叉排序树的查找过程中,只要往左走,数字就会变小,往右走数字就会变大。因此,最小的就是最左下角的树,最大的就是最右下角的树。(刚开始的思路是先序遍历的第一个数和最后一个数,想太复杂了),有了这个思路之后,程序就非常简单了。int max(btree T) { while (T->lchild) { T = T->lchild; } return T->data;}int min(btree T) { while (T->rchild) {原创 2020-08-29 22:52:40 · 1062 阅读 · 2 评论 -
【数据结构】-树-求指定节点在二叉排序树中的层次
算法思路:在二叉排序树中查找节点,每查找一次,层次就+1,因此判断指定节点在二叉树中的层次,只需要看进行了几次非递归查找操作。有了这个思路之后代码就非常简单啦~int search_1(btree T, int a) { while (T!=NULL) { if (T->data == a)return n; if (a < T->data)T = T->lchild; if (a > T->data)T = T->rchild原创 2020-08-29 22:41:34 · 3058 阅读 · 1 评论 -
【数据结构】-树-二叉排序树的创建-递归与非递归查找-递归与非递归删除
编程注意事项:1.插入算法形参一定是引用。2.非递归插入要有pre指针标记插入位置的父节点typedef struct bnode { int data; struct bnode *lchild, *rchild;}bnode, *btree;//非递归插入void insert_1(btree &T, int k) { //为新插入的数据创建节点 bnode *s = (btree)malloc(sizeof(bnode)); s->da...原创 2020-08-25 18:20:57 · 380 阅读 · 0 评论 -
【数据结构】-树-【2014真题】-求二叉树叶节点的带权路径长度之和
带权路径长度有一个求法是:wpl=非叶子结点的权值之和,因此可以选择一个遍历算法,求出所有非叶子结点的权值之和即可。但是这个方法是针对huffman树的,如果不是huffman树,必须按照叶子结点的深度与权值之积总和来求解。https://blog.csdn.net/qq_39328436/article/details/107866297...原创 2020-08-17 22:04:02 · 1295 阅读 · 2 评论 -
【数据结构】-栈-括号匹配
编程注意事项:遇到右括号:先判断是否栈空,再判断是否匹配,匹配之后记得弹出栈顶元素遇到左括号:入栈遍历结束之后,栈必须为空才是匹配bool isKuoHao(char a) { string s = "()[]{}"; if (s.find(a) != -1)return true; else return false;}bool isCom(string s) { stack<char> sst; for (int i = 0; i < s.length原创 2020-08-14 15:44:58 · 528 阅读 · 0 评论 -
【数据结构】-树-计算huffman树的wpl
wpl=非叶子结点的权值之和使用上面这个方法的前提是,是一棵huffman树才行,对普通的树没有这个说法。int wpl = 0;void WPL(BiTree T) { if (T != NULL) { if (T->lchild || T->rchild) wpl=wpl+T->data; WPL(T->lchild); WPL(T->rchild); }}int main() { BiTree T; cout <<原创 2020-08-07 17:06:00 · 1276 阅读 · 0 评论 -
【数据结构】-单链表-【2019真题】按要求重新排列单链表
思路:p指针指向第一个结点,q为p的后继节点,r指针指向未处理的最后一个结点,每一轮都将p的后继指针指向r,r的后继指针指向q, 随后将p,q向后移动一个结点,并重新将r定位到未处理的最后一个结点。LinkList reSort(LinkList L) { LNode*p = L->next; LNode *q = p->next; LNode *r = L->next; LNode *new_r = NULL; while (r->next) r = ...原创 2020-08-04 22:43:01 · 735 阅读 · 0 评论 -
【数据结构】-树-【2017真题】表达式树转中缀表达式
1.思路:按照中序遍历输出整棵树,并在适当的位置加上括号即可,关键在于如何加括号,第一次做题的时候没有想出来怎么加括号。加括号的方法:观察表达式的结构可以知道,根节点将表达式分成左右两个部分,因此根节点不可能包含在任何一个括号内,并且只要不是叶子结点就说明有“子表达式”存在。除了叶子结点和根节点之外,在其他节点的左子树遍历之前加上左括号,在右子树遍历之后加上右括号。因此算法就是对普通的中序遍历进行改进,改进过程关键是如何识别根节点和叶子结点。参考答案给出识别根节点的办法是对每一个结点求深度...原创 2020-08-02 21:41:49 · 1089 阅读 · 0 评论 -
【数据结构】-排序-【2016真题】-划分满足要求的两个子集
1.思路: //划分规则:元素个数尽可能相同,元素值和尽可能相差大,整数集合中不会有相同元素,因此可以按照下面的思路划分 //第一步,将数组A中的所有元素从小到大排序; //第二步,如果是偶数个元素,则前n/2个划分在A1,后n/2个划分在A2;如果是奇数个元素,前n/2向下取整个在A1,后n/2向下取整+1个在A2 //第一种情况元素个数相差0,第二种情况元素个数相差1。2.要使排序效率尽可能高,肯定是快速排序,笔者之前详细写过快速排序的过程,但是答案用的是非递归的快速...原创 2020-07-28 21:53:52 · 666 阅读 · 0 评论 -
【数据结构】-线性表-【2013真题】找出数组的主元
值得注意的是,这个题目就算写出来是n2的时间复杂度,最后给的分数也只扣了一分,所以花大量时间来思考时间复杂度最高的算法是得不偿失的,应该在短时间内精进自己第一时间想到的那个算法。 //思路: //由于ai的取值只可能是0-n-1中中间的整数,因此可以创建一个大小为n的整数数组showtime来记录ai出现的次数 //shotime[j]>n/2说明j就是主元,若找不到这样的j则返回-1. //时间复杂度n;空间复杂度:n答案: //出现的次数大于所有元素...原创 2020-07-27 21:45:51 · 770 阅读 · 0 评论 -
【数据结构】-单链表-【2012真题】-查找共同后缀的起始位置
https://blog.csdn.net/qq_39328436/article/details/106715561与之前做的一个练习题,去单链表的公共节点大同小异。练习题时还写得更加简洁一点。2012年真题思路:分别求得两个链表的长度,长链表长度为longer,短链表长度为shorter,设置两个遍历指针,long和short,长链表从第longer-shorter+1个位置开始,锻炼表从第一个位置开始,同时遍历,当两个指向同一个节点的时候就是目标节点。时间复杂度:主要消耗在求两个单链表原创 2020-07-26 20:33:57 · 1185 阅读 · 2 评论 -
【数据结构】-单链表-【2015真题】删除绝对值第二次出现的节点
1.算法思路:创建一个大小为n的数组showtime,标记绝对值出现的次数,并且初试化为0;遍历指针p,以及p的前驱指针pre。遍历单链表,求链表节点绝对值x,以x为下标查找showtime中的值,若showtime[x]=0,则修改showtime[x]为1,并继续遍历若showtime[x]=1时要删除p指针指向的节点。2.单链表节点的数据类型定义:typedef struct LNode{int data;struct LNode* next;}LNode,*LinkList;3原创 2020-07-25 14:41:45 · 394 阅读 · 0 评论 -
【数据结构】-线性表-【2018真题】找出未出现的最小正整数
原本我的思路:创建一个大数组show,表示整数数组是否出现的标记。遍历整数数组,把以该整数为下标的show中的值改为1(如果是负数统一修改0位置上的标记)遍历show,第一个不为1的位置就是答案,时间复杂度为o(n),空间复杂度由整数数组的最大值决定。虽然把握住了“空间换时间”的精髓,但是未免也要得太多了,发生错误的关键在于,没有把握结果只可能是1-n+1中的一个正整数。int find_min(vector<int> A) { vector<int> B(A..原创 2020-07-24 17:43:53 · 980 阅读 · 0 评论 -
【数据结构】-单链表-不断删除并输出循环单链表的最小节点
刚开始做这个题目的时候,设置了五个指针,pre_p,p,min.pre_min还有q,用q来做内循环,当p==q的时候标记内循环结束,后来发现多此一举了。既然内循环每次从第一个节点开始,那么内循环结束的标价就是p==L,想得太复杂了。编程注意事项:外循环标记:L->next!=L内循环标记:p!=L;例子如下:...原创 2020-07-23 14:30:08 · 213 阅读 · 0 评论 -
【数据结构】-图-用DFS实现拓扑排序-环路检测
void BubbleSort(vector<int> &p, int length,vector<int> &ind_diff){ for (int m = 0; m < length; m++) { ind_diff[m] = m; } for (int i = 0; i < length; i++) { for (int j = 0; j < length - i - 1; j++) { if (p[j] &g.原创 2020-07-19 20:02:59 · 3297 阅读 · 9 评论 -
【数据结构】-单链表-将一个单链表奇偶位置节点原地拆分成两个单链表
L=a1,b1,a2,b2,....an,bn返回值:a1,a2,a3,.....an原始单链表:b1,b2,b3..bn LinkList split(LinkList &L) { //分成的两个单链表一个是返回值M,另一个在原始单链表L中 LNode *p = L->next; LNode *q = p->next; LinkList M = (LinkList)malloc(sizeof(LNode)); M->next = ..原创 2020-07-18 16:28:45 · 3190 阅读 · 2 评论 -
【数据结构】-图-判断图中是否存在vi到vj的路径
方法一:深度优先,不断向前走,采用递归形式比较简单,下图是递归的例子编程注意事项:1.递归出口:i==j2.判断i到j是否存在路径,把问题化解到最简单的情况,一步一步向前走,能向前迈步的条件是:本次已经有连通路径,并且下一个要加进来的点没被访问过。bool exit_path(ALGraph G, int i, int j) { if (i == j)return true; else { visited[i] = true; for (ArcNode* p = G.原创 2020-07-16 17:04:28 · 2947 阅读 · 0 评论 -
【数据结构】-单链表-按递增顺序输出单链表节点的值
思路:采用最简单的打擂台的办法,题目要求删除节点,因此必须保留前驱。引入遍历指针p,前驱指针pre,最小值指针min,最小值前驱pre_min。(最小值前驱可以省略,但是加入之后会使得程序更加清晰,况且一个指针的内存开销也不大)。编程注意事项:1.教材上最后free(L)了,个人觉得好像没有必要,只要将节点全部删除一直到最后L->next=null即可。2.要明白free(p)干了什么,它只是把p所指向的内存空间交还给了操作系统,并不会将指针变为null,所以建议每次用完free后,手原创 2020-07-15 17:12:31 · 2253 阅读 · 0 评论 -
【数据结构】-图-输出顶点u到v的所有简单路径
思路:一步一步递归向下走,以下面这个图为例,详细的递归过程如下所示:编程注意事项:1.path数组少为开大一点,避免越界2.一定记得返回之前要把visited恢复3.path和visited要加引用,但是d一定不能加void printPath(vector<int> &path,int d) { for (int i = 0; i <= d; i++) cout << path[i] << " ";...原创 2020-07-08 11:47:00 · 4880 阅读 · 11 评论 -
【数据结构】-图-判断一个无向图是否是一棵树
思路:判断一个无向图是否是一棵树,只需要判断该图是否是一个包含n个顶点的连通子图且边数为n-1,只要这两个条件都满足,那么就是一棵树。因此我们可以采用深度遍历,若图连通,那么只要一次深度遍历就可以遍历出所有的顶点,于是只需要调用一次dfs,并设置两个计数器记录边和顶点的数目即可。变成注意事项:邻接表在存储无向图的时, 每一条边都存储了两次,所以计数器中得到的是两边的边数void DFS_my(ALGraph &G, int v, int &count_vec, int &a原创 2020-07-08 09:35:42 · 8008 阅读 · 6 评论 -
【数据结构】-单链表-判断序列B是否是序列A的连续子序列
算法思路:用两个指针来遍历两个单链表,当节点值相同的时候,两个指针同时向后移动一个位置当节点值不相同的时候,A表的指针继续向后面遍历,B表的指针回到头部重新开始遍历例子如下: bool isSon(LinkList A, LinkList B) { LNode *p,*q; p = A->next; q = B->next; while (p) { if (p->data != q->data) { p = p->n.原创 2020-07-07 14:29:51 · 1910 阅读 · 1 评论 -
【数据结构】-排序-快速排序的改进算法
快速排序的最好情况是每一趟排序的基准值都将序列划分成两个长度尽可能一样的序列在默认情况下,我们通常选择第一个元素作为基准值,但是,则会有问题。最坏情况是原序列顺序和逆序的情况,此时基准值左右的序列长度一个是0,一个是n-1即使序列原本就是顺序的,但是快排它无法判断有序,还是不断地做比较;逆序的情况下是不断地比较,不断地移动元素。因此,将基准值的选取对快排的效率有很大的影响,我们用“随机”法和“三数取中”法来选取基准值,这样的方法基本可以避免上述两种最坏的情况发生。编程注意事项:1.c原创 2020-07-05 09:53:40 · 712 阅读 · 0 评论 -
【数据结构】-排序-外部排序总结
1.影响内部排序时间效率的是移动和比较的次数,影响外部排序时间效率的是i/o次数2.减少平衡归并中i/o次数的有两个办法:第一:增大归并路数第二:减少归并段(有序段)个数为了提高效率,我们考虑将归并路数尽可能地增大 可是归并路数一旦增大,内部比较的压力就会变大,内部比较效率降低。那么,增大归并路数而提高的时间效率就被内部排序给抵消了。那怎么办呢?有没有可能使得内部排序效率不受归并路数增加的影响呢?这个办法就是“败者树”,用败者树的方法挑选出每一路中的最小值。 ...原创 2020-07-04 18:00:54 · 3329 阅读 · 0 评论 -
【数据结构】-双链表-判断循环单链表是否对称
两个指针分别从双链表的两端向中间遍历奇数个节点时:p==q为出口偶数个节点时:p->next=q为出口编程注意事项:不需要讨论奇数个节点还是偶数个节点,因为以上两种情况并不会同时出现。typedef struct DLNode { int data; struct DLNode *next; struct DLNode *prior;}DLNode, *DLinkList;/*双链表*/DLinkList DList_HeadInsert(DLinkList L)原创 2020-07-04 17:27:02 · 820 阅读 · 0 评论 -
【数据结构】-排序-内排序总结
1.时间复杂度总结n2: 直接插入排序,冒泡排序,简单选择排序(这三种里面直接插入排序好一点)nlogn: 快速排序,堆排序,归并排序n: 基数排序其他:n22.时间性能与初始序列无关:口诀:“一堆乌龟选基友”堆排序,归并排序,选择排序,基数排序3.空间性能:快速排序:logn归并排序:n基数排序:rd其他:14.不稳定的有:口诀:尔快选(你快选!!)希尔排序,快速排序,选择排序两个选择排序都...原创 2020-07-02 17:42:32 · 596 阅读 · 2 评论