考研数据结构图的必背算法及知识点
- 格式:docx
- 大小:61.09 KB
- 文档页数:20
数据结构考研笔记整理(全)数据结构考研笔记整理数据结构是计算机科学中非常重要的一门课程,对于计算机专业的学生来说,考研复习过程中对数据结构的准备非常关键。
因此,我们需要系统地整理数据结构的相关知识点,以便更好地理解和掌握。
一、线性表线性表是数据结构中最基本的一种数据结构,它是一种有序的数据元素的集合。
常见的线性表有顺序表和链表。
1. 顺序表顺序表是将数据元素存放在一块连续的存储空间中,通过元素的下标来访问。
具有随机访问的特点,但插入和删除操作比较麻烦。
适用于查找操作频繁的场景。
2. 链表链表是将数据元素存放在任意的存储空间中,通过指针来连接各个元素。
具有插入和删除操作方便的特点,但不支持随机访问。
适用于插入和删除操作频繁的场景。
二、栈和队列栈和队列是特殊的线性表,它们都具有先进先出的特点。
1. 栈栈是一种特殊的线性表,只能在表的一端进行插入和删除操作,即“先进后出”。
常见的应用有函数调用的过程中的参数传递、表达式求值等。
2. 队列队列也是一种特殊的线性表,只能在表的一端进行插入操作,而在另一端进行删除操作,即“先进先出”。
常见的应用有任务调度、缓冲区管理等。
三、树树是一种非常重要的非线性数据结构,它由节点和边组成。
树具有层次结构,常见的树结构有二叉树、二叉搜索树和平衡二叉树等。
1. 二叉树二叉树是每个节点最多有两个子树的树结构,包括左子树和右子树。
二叉树的遍历方式有前序遍历、中序遍历和后序遍历。
2. 二叉搜索树二叉搜索树是一种特殊的二叉树,它的左子树中的所有节点都小于根节点,右子树中的所有节点都大于根节点。
具有快速查找和插入的特点。
3. 平衡二叉树平衡二叉树是一种特殊的二叉搜索树,它的左右子树的高度差不超过1。
通过旋转操作可以保持树的平衡性。
四、图图是一种非常复杂的非线性数据结构,它由顶点和边组成。
图可以分为有向图和无向图,常见的图算法有深度优先搜索和广度优先搜索。
1. 深度优先搜索深度优先搜索是一种用于遍历或搜索图和树的算法,它从一个节点开始,尽可能深地访问每个节点的所有子节点,直到没有子节点为止。
计算机考研数据结构的复习要点计算机考研数据结构的复习要点考生们在进行计算机考研的复习阶段时,需要把数据结构的复习要点了解清楚。
店铺为大家精心准备了计算机考研数据结构的复习重点,欢迎大家前来阅读。
计算机考研数据结构重点:二叉树二叉树是数据结构中的重点内容,在这两年的考试中也将二叉树作为重点内容来考查。
二叉树这部分内容要求大家掌握二叉树的定义、性质、存储结构、遍历、线索化、森林和二叉树的转换等内容。
算法的重点是二叉树的遍历及其应用,这也是二叉树这部分的重点和难点。
遍历是二叉树各种操作的基础,可以在遍历过程中对结点进行各种操作。
例如:求二叉树结点总数,建立二叉树,建立二叉树的存储结构等。
二叉树的很多算法是在遍历算法基础上改造完成的,这就要求大家在复习时,熟练掌握二叉树遍历的递归和非递归算法。
下面为大家介绍一下二叉树的几种遍历方法:由二叉树的定义可知,一颗二叉树由根节点及左、右子树三个基本部分组成,因此,只要依次遍历这三部分,就可以遍历整个二叉树。
1.先序遍历先序遍历的递归过程为:若二叉树为空,遍历结束。
(1)访问根节点;(2)先序遍历根节点的左子树;(3)先序遍历根节点的右子树。
2.中序遍历中序遍历的递归过程为:若二叉树为空,遍历结束。
否则,(1)中序遍历根节点的左子树;(2)访问根节点;(3)中序遍历根节点的右子树。
3.后序遍历后序遍历的递归过程为:若二叉树为空,遍历结束。
否则,同济大学四平路(1)后序遍历根节点的左子树;(2)后序遍历根节点的右子树;(3)访问根节点。
层次遍历二叉树的层次遍历,是指从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。
在进行层次遍历时,对一层结点访问完后,再按照它们的访问次序对各个结点的左孩子和右孩子顺序访问,这样一层一层进行,先遇到的结点先访问,这与队列的操作原则比较吻合。
因此,在进行层次遍历时,可设置一个队列结构,遍历从二叉树的根结点开始,首先将根结点指针入队列,然后从对头取出一个元素,每取一个元素,执行下面两个操作:(1)访问该元素所指结点;(2)若该元素所指结点的左、右孩子结点非空,则将该元素所指结点的左孩子指针和右孩子指针顺序入队。
数据结构考研复习重点归纳数据结构是计算机科学中非常重要的一门基础课程,考研复习数据结构时,需要重点掌握的内容有以下几个方面。
1.线性表:线性表是数据结构中最基本的一种结构,常见的线性表有数组、链表和栈等。
考生需要掌握线性表的定义、插入、删除、查找等基本操作,并能够分析它们的时间复杂度。
2.树:树是一种非常重要且常见的数据结构,它具有分层结构和层次关系。
其中,二叉树是最简单也是最基本的一种树结构,树的遍历(如前序遍历、中序遍历和后序遍历)是树算法中的重要内容。
此外,还要了解一些特殊的树结构,如平衡树和B树等。
3.图:图是由节点和边组成的一种数据结构,它是一种非常灵活的结构,常用来表示各种实际问题中的关系。
在考研复习中,需要掌握图的基本概念(如顶点和边)、图的存储结构(如邻接矩阵和邻接表)以及图的遍历算法(如深度优先和广度优先)等。
4.查找和排序:在实际问题中,经常需要查找和排序数据。
查找算法(如顺序查找、二分查找和哈希查找)和排序算法(如冒泡排序、插入排序和快速排序)是数据结构中常见的算法,考生需要熟练掌握这些算法的原理和实现方法。
此外,还要了解一些高级的查找和排序算法,如二叉查找树和归并排序等。
5.散列表:散列表(也称哈希表)是一种特殊的数据结构,它利用散列函数将数据映射到一个固定大小的数组中。
散列表具有快速的查找和插入操作,常用于实现字典和数据库等应用。
在考研复习中,需要了解散列表的原理和实现方法,以及处理冲突的方法,如链地址法和开放地址法。
6.动态规划:动态规划是一种解决问题的数学方法,也是一种重要的算法思想。
在考研复习中,需要掌握动态规划的基本原理和解题思路,以及常见的动态规划算法,如背包问题和最长公共子序列等。
7.算法复杂度分析:在考研复习中,需要有一定的算法分析能力,能够对算法的时间复杂度和空间复杂度进行分析和估算。
此外,还要能够比较不同算法的效率,并选择合适的算法来解决实际问题。
除了以上重点内容,考生还要注意掌握一些基本的编程知识,如指针、递归和动态内存分配等。
数据结构复习资料复习提纲知识要点归纳数据结构复习资料:复习提纲知识要点归纳一、数据结构概述1. 数据结构的定义和作用2. 常见的数据结构类型3. 数据结构与算法的关系二、线性结构1. 数组的概念及其特点2. 链表的概念及其分类3. 栈的定义和基本操作4. 队列的定义和基本操作三、树结构1. 树的基本概念及定义2. 二叉树的性质和遍历方式3. 平衡二叉树的概念及应用4. 堆的定义和基本操作四、图结构1. 图的基本概念及表示方法2. 图的遍历算法:深度优先搜索和广度优先搜索3. 最短路径算法及其应用4. 最小生成树算法及其应用五、查找与排序1. 查找算法的分类及其特点2. 顺序查找和二分查找算法3. 哈希查找算法及其应用4. 常见的排序算法:冒泡排序、插入排序、选择排序、归并排序、快速排序六、高级数据结构1. 图的高级算法:拓扑排序和关键路径2. 并查集的定义和操作3. 线段树的概念及其应用4. Trie树的概念及其应用七、应用案例1. 使用数据结构解决实际问题的案例介绍2. 如何选择适合的数据结构和算法八、复杂度分析1. 时间复杂度和空间复杂度的定义2. 如何进行复杂度分析3. 常见算法的复杂度比较九、常见问题及解决方法1. 数据结构相关的常见问题解答2. 如何优化算法的性能十、总结与展望1. 数据结构学习的重要性和难点2. 对未来数据结构的发展趋势的展望以上是数据结构复习资料的复习提纲知识要点归纳。
希望能够帮助你进行复习和回顾,加深对数据结构的理解和掌握。
在学习过程中,要注重理论与实践相结合,多进行编程练习和实际应用,提高数据结构的实际运用能力。
祝你复习顺利,取得好成绩!。
考研题型包括:简答题;方法选择(分析);构造题;算法题。
第一章绪论1. 数据结构的基本概念:数据、数据元素、数据对象、数据结构2. 抽象数据类型:数据对象、逻辑关系、一组操作。
ADT的特点:数据抽象、信息隐蔽3. 数据结构三要素:数据元素间的逻辑关系、物理存储和一组操作。
元素间的逻辑关系:集合、线性、树、图元素在计算机内存中的存储结构:顺序、非顺序4. 算法的定义:规则的有限集合,为了解决某个特定问题而规定的一系列基本操作。
算法特性:有限性、确定性、可行性、输入、输出算法设计目标:正确性、可读性、鲁棒性、高效率低存储5. 算法性能评价:时间和空间算法时间复杂度:T(n)=O(f(n))。
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。
其中f(n)是问题规模n的某个函数。
求解算法的时间复杂度的具体步骤是:⑴找出算法中的基本语句;⑵计算基本语句的执行次数的数量级;保留基本语句执行次数的函数中的最高次幂,忽略所有低次幂和最高次幂的系数。
⑶用大Ο记号表示算法的时间性能。
将基本语句执行次数的数量级放入大Ο记号中。
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < { O(2^n) < O(n!) < O(n^n) }【例】分析下面各算法的时间复杂度算法1:int fact(int n){ if (n<=1) return 1;return n*fact(n-1);}算法2:i=l;while (i<n){for(j=l;j<=n;j++)x=x+l;i=i*2;}算法3:for(i=l;i<=n;i++){ j=l;while (j<=i){x+=l; j++;}}算法:4void sort(int b[],int n){ int i, j, k;for (i=0; i<n-1; i++){ k = i;for (j=i+1; j<n; j++)if (b[k] > b[j]) k = j;x = b[i]; b[i] = b[k]; b[k] = x;}}算法5void add(int n){ int i = 0, s = 0;while (s<n){ i++;s = s + i;}}设while循环语句执行次数为T(n),则算法6void hanoi(int n, char a, char b, char c){ if (n==1) printf("move %d disk from %c to %c \n", n, a, c);else{ hanoi(n-1, a, c, b);printf("move %d disk from %c to %c \n", n, a, c);hanoi(n-1, b, a, c);}}算法7:void PreOrder(BiTree T){ if (T){ v isit(T->daata)PreOrder(T->lchild);PreOrder(T->rchild);}}算法空间复杂度:空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。
数据结构考研知识点总结数据结构是计算机科学中一门重要的课程,其是计算机科学的核心基础之一、在考研中,数据结构也是一个必考的科目,对于应试者来说,掌握数据结构的知识点是非常重要的。
下面是对数据结构考研知识点的总结。
1.数据结构的基本概念和分类。
数据结构是指一组数据的存储方式和相应的操作方法。
常见的数据结构包括线性结构、树形结构、图结构等。
线性结构包括数组、链表、栈、队列等;树形结构包括二叉树、堆、哈希树等;图结构包括有向图、无向图等。
2.线性结构。
线性结构是数据元素之间存在一对一的关系的数据结构。
常用的线性结构有数组、链表、栈和队列。
-数组是一种连续存储的线性结构,可以通过下标直接访问元素。
-链表是一种离散存储的线性结构,有单向链表、双向链表和循环链表等。
-栈是一种特殊的线性结构,只能在一端进行插入和删除操作,遵循后进先出(LIFO)的原则。
-队列也是一种特殊的线性结构,只能在一端进行插入操作,另一端进行删除操作,遵循先进先出(FIFO)的原则。
3.树形结构。
树形结构是一种非线性的数据结构,具有层次关系的集合。
常用的树形结构包括二叉树、AVL树、B树和哈夫曼树等。
-二叉树是一种每个节点最多有两个子节点的树形结构,包括满二叉树、完全二叉树和二叉树等。
-AVL树是一种自平衡的二叉树,通过维护平衡因子来保证树的平衡。
-B树是一种多路平衡查找树,用于大规模数据存储和文件系统等。
-哈夫曼树是一种用于数据压缩的最优二叉树。
4.图结构。
图结构是由顶点和边组成的一种数据结构。
常用的图结构包括有向图、无向图、带权图和图的遍历等。
-有向图是边有方向的图结构,边具有指向关系。
-无向图是边无方向的图结构,边没有指向关系。
-带权图是边具有权值的图结构。
-图的遍历有深度优先(DFS)和广度优先(BFS)两种常见方法。
5.排序算法。
排序算法是数据结构中重要的应用之一、常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序、快速排序和堆排序等。
考研数据结构图的必背算法及知识点Prepared on 22 November 20201.最小生成树:无向连通图的所有生成树中有一棵边的权值总和最小的生成树问题背景:假设要在n个城市之间建立通信联络网,则连通n个城市只需要n—1条线路。
这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。
在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。
n个城市之间,最多可能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢分析问题(建立模型):可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。
对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。
即无向连通图的生成树不是唯一的。
连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。
图G5无向连通图的生成树为(a)、(b)和(c)图所示:G5G5的三棵生成树:可以证明,对于有n个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1条边。
最小生成树的定义:如果无向连通图是一个网,那么,它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简称为最小生成树。
最小生成树的性质:假设N=(V,{E})是个连通网,U是顶点集合V的一个非空子集,若(u,v)是个一条具有最小权值(代价)的边,其中,则必存在一棵包含边(u,v)的最小生成树。
解决方案:两种常用的构造最小生成树的算法:普里姆(Prim)和克鲁斯卡尔(Kruskal)。
他们都利用了最小生成树的性质1.普里姆(Prim)算法:有线到点,适合边稠密。
时间复杂度O(N^2)假设G=(V,E)为连通图,其中V为网图中所有顶点的集合,E为网图中所有带权边的集合。
数据结构考研笔记整理(全)一、第二章线性表●考纲内容●一、线性表的基本概念●线性表是具有相同数据结构类型的n个数据元素的有限序列;线性表为逻辑结构,实现线性表的存储结构为顺序表或者链表●二、线性表的实现●1、顺序表●定义(静态分配)●#define MaxSize 50 \\ typedef struct{ \\ ElemType data[MaxSize];\\ intlength;\\ }SqList;●定义(动态分配)●#define MaxSize 50\\ typedef strcut{\\ EleType *data; //指示动态非配数组的指针\\ int MaxSize,length;\\ }SqList;●c的动态分配语句为L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);●c++动态分配语句为L.data=new ElemType[InitSize];●插入操作●删除操作●按值寻找●2、链表●单链表●单链表的定义●●头插法建立单链表●●尾插法建立单链表●●按序号查找getElem(LinkList L,int i)和按值查找locateElem(LinkListL,ElemType e)●插入结点(后插)●p=getElem(L,i-1); //查找插入位置的前驱结点\\ s.next=p.next;\\p.next=s;●将前插操作转化为后插操作,即先将s插入的p的后面然后调换s和p的数据域●s.next=p.next;\\ p.next=s.next;\\ temp=p.data;\\ p.data=s.data;\\s.data=temp;●删除结点●p.getElem(L,i-1);\\ q=p.next;\\ p.next=q.next;\\ free(q);●双链表(结点中有prior指针和next指针)●循环链表●静态链表●借助数组来描述线性表的链式存储结构,结点中的指针域next为下一个元素的数组下标●三、线性表的应用●使用的时候如何选择链表还是顺序表?●表长难以估计,经常需要增加、删除操作——链表;表长可以估计,查询比较多——顺序表●链表的头插法,尾插法,逆置法,归并法,双指针法;顺序表结合排序算法和查找算法的应用●小知识点(选择题)二、第三章栈,队列和数组●考纲内容●一、栈和队列的基本概念●栈:后进先出,LIFO,逻辑结构上是一种操作受限的线性表●队列:先进先出,FIFO,逻辑结构上也是一种操作受限的线性表●二、栈和队列的顺序存储结构●栈的顺序存储●●队列的顺序存储●进队:队不满时,送值到队尾元素,再将队尾指针加一●出队:队不空时,取队头元素值,再将队头指针加一●判断队空:Q.front==Q.rear==0;●循环队列(牺牲一个单元来区分队空和队满,尾指针指向队尾元素的后一个位置,也就是即将要插入的位置)●初始:Q.front==Q.rear●队满:(Q.rear+1)%MaxSize=Q.front●出队,队首指针进1:Q.front=(Q.front+1)%MaxSize●入队,队尾指针进1:Q.rear=(Q.rear+1)%MaxSize●队列长度:(Q.rear+MaxSize-Q.front)%MaxSize●三、栈和队列的链式存储结构●栈的链式存储●●队列的链式存储●实际是上一个同时带有头指针和尾指针的单链表,尾指针指向单链表的最后一个结点,与顺序存储不同,通常带有头结点●四、多维数组的存储●行优先:00,01,02,10,11,12●列优先:00,10,01,11,02,12●五、特殊矩阵的压缩存储●对称矩阵●三角矩阵●三对角矩阵(带状矩阵)●稀疏矩阵●将非零元素及其相应的行和列构成一个三元组存储●十字链表法●六、栈、队列、数组的应用●栈在括号匹配中的应用●栈在递归中的应用●函数在递归调用过程中的特点:最后被调用的函数最先执行结束●队列在层次遍历中的应用●二叉树的层次遍历●1跟结点入队●2若队空,则结束遍历,否则重复3操作●3队列中的第一个结点出队并访问,若有左孩子,则左孩子入队;若有右孩子,则右孩子入队●重点为栈的(出入栈过程、出栈序列的合法性)和队列的操作及其特征●小知识点(选择题)●n个不同元素进栈,出栈元素不同排列的个数为{2n\choose n }/(n+1)●共享栈是指让两个顺序栈共享一个存储空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸,可以更有效的利用存储空间,同时对存储效率没有什么影响●双端队列是指允许两端都可以进行入队和出队操作的队列●输出受限的双端队列:允许两端插入,只允许一端删除●输入受限的双端队列:允许两端删除,只允许一端插入三、第四章串●考纲内容●字符串模式匹配●暴力算法●注意指针回退时的操作是i=i-j+2;j=j+1;●kmp算法●手工求next数组时,next[j]=s的最长相等前后缀长度+1,其中s为1到j-1个字符组成的串●在实际kmp算法中,为了使公式更简洁、计算简单,如果串的位序是从1开始的,则next数组需要整体加一;如果串的位序是从0开始的,则next数组不需要加一●根据next数组求解nextval数组:如果p[j]==p[next[j]],则nextval[j]=nextval[next[j]],否则nextval[j]=next[j];●小知识点●串和线性表的区别:1线性表的数据元素可以不同,但串的数据元素一般是字符;2串的操作对象通常是子串而不是某一个字符四、第五章树与二叉树●考纲内容●一、树的基本概念●定义●树是一种递归的数据结构,是一种逻辑结构●树的性质●结点数为n,则边的数量为n-1●树中的结点数等于所有结点的度数之和加1(一个结点的孩子个数称为该结点的度,树中结点的最大度数称为树的度,每一条边表示一个结点,对应一个度,只有根结点上面无边,故结点树=度数之和+1)●度为m的树中第i层至多有m^{i-1}个结点(i\geq1)(m叉树的第i层最多有m^{i-1}个结点)●高度为h的m叉树至多有(m^h-1)/(m-1)个结点(假设每一个结点都有m个孩子,则由等比数列的求和公式可以推导出该式子)●具有n个结点的m叉树的最小高度是\lceil log_m(n(m-1)+1)\rceil(由高度为h的m叉树的最大结点树公式有,n满足式子(m^{h-1}-1)/(m-1) \leq n\leq (m^h-1)/(m-1))●高度为h的m叉树至少有h个结点;高为h,度为m的树至少有h+m-1个结点(m叉树并不等于度为m的树,m叉树可以为空树,要求所有结点的度小于等于m,而度为m的树一定有一个结点的度数为m)●二、二叉树●二叉树的定义及其主要特征●定义●特点●每个结点至多只有两颗子树●二叉树是有序树,其子树有左右之分,次序不能颠倒,否则将成为另一颗二叉树,即使树中结点只有一颗子树,也要区分他是左子树还是右子树●特殊的二叉树●满二叉树:高度为h,结点数为2^h-1,所有叶子结点都集中在二叉树的最下面一层,除叶子结点外的所有结点度数都为2,从根结点为1开始编号,对于编号为i的结点,其父结点为\lfloor i/2 \rfloor,左孩子(若有)编号为2i,右孩子(若有)编号为2i+1,所以编号为偶数的结点只可能是左孩子,编号为奇数的结点只可能是右孩子●完全二叉树:删除了满二叉树中编号更大的结点,高为h,结点数为n的完全二叉树的每个结点的编号都与高度为h的满二叉树中编号为1到n的结点相同。
第1章绪论内容提要:◆数据结构研究的内容。
针对非数值计算的程序设计问题,研究计算机的操作对象以及它们之间的关系和操作。
数据结构涵盖的内容:◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型。
数据——所有能被计算机识别、存储和处理的符号的集合。
数据元素——是数据的基本单位,具有完整确定的实际意义。
数据对象——具有相同性质的数据元素的集合,是数据的一个子集。
数据结构——是相互之间存在一种或多种特定关系的数据元素的集合,表示为:Data_Structure=(D, R)数据类型——是一个值的集合和定义在该值上的一组操作的总称。
抽象数据类型——由用户定义的一个数学模型与定义在该模型上的一组操作,它由基本的数据类型构成。
◆算法的定义及五个特征。
算法——是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。
算法的基本特性:输入、输出、有穷性、确定性、可行性◆算法设计要求。
①正确性、②可读性、③健壮性、④效率与低存储量需求◆算法分析。
时间复杂度、空间复杂度、稳定性学习重点:◆数据结构的“三要素”:逻辑结构、物理(存储)结构及在这种结构上所定义的操作(运算)。
◆用计算语句频度来估算算法的时间复杂度。
第二章线性表内容提要:◆线性表的逻辑结构定义,对线性表定义的操作。
线性表的定义:用数据元素的有限序列表示◆线性表的存储结构:顺序存储结构和链式存储结构。
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
链式存储结构: 其结点在存储器中的位置是随意的,即逻辑上相邻的数据元素在物理上不一定相邻。
通过指针来实现!◆线性表的操作在两种存储结构中的实现。
数据结构的基本运算:修改、插入、删除、查找、排序1)修改——通过数组的下标便可访问某个特定元素并修改之。
核心语句:V[i]=x;顺序表修改操作的时间效率是O(1)2) 插入——在线性表的第i个位置前插入一个元素实现步骤:①将第n至第i 位的元素向后移动一个位置;②将要插入的元素写到第i个位置;③表长加1。
1.最小生成树:无向连通图的所有生成树中有一棵边的权值总和最小的生成树问题背景:假设要在n个城市之间建立通信联络网,则连通n个城市只需要n—1条线路。
这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。
在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。
n个城市之间,最多可能设置n(n-1)/ 2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢分析问题(建立模型):可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。
对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。
即无向连通图的生成树不是唯一的。
连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。
图G5无向连通图的生成树为(a)、(b)和(c)图所示:G5G5的三棵生成树:可以证明,对于有n个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1条边。
最小生成树的定义:如果无向连通图是一个网,那么,它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简称为最小生成树。
最小生成树的性质:假设N=(V,{E})是个连通网,U是顶点集合V的一个非空子集,若(u, v)是个一条具有最小权值(代价)的边,其中,则必存在一棵包含边(u,v)的最小生成树。
解决方案:两种常用的构造最小生成树的算法:普里姆(Prim)和克鲁斯卡尔(Kruskal)。
他们都利用了最小生成树的性质1.普里姆(Prim)算法:有线到点,适合边稠密。
时间复杂度O(N^2)假设G=(V,E)为连通图,其中V为网图中所有顶点的集合,E为网图中所有带权边的集合。
设置两个新的集合U和T,其中集合U(顶点集)用于存放G的最小生成树中的顶点,集合T(边集合)存放G的最小生成树中的边。
T,U的初始状态:令集合U的初值为U={u1}(假设构造最小生成树时,从顶点u1出发),集合T的初值为T={}。
Prim算法的思想是:从所有u∈U,v∈V-U的边中,选取具有最小权值的边(u,v)∈E,将顶点v加入集合U中,将边(u,v)加入集合T中,如此不断重复,直到U=V时,最小生成树构造完毕,这时集合T中包含了最小生成树的所有边。
Prim算法可用下述过程描述,其中用wuv表示顶点u与顶点v边上的权值。
(1)U={u1},T={};(2)while(U≠V)do(u,v)=min{wuv;u∈U,v∈V-U}T=T+{(u,v)}U=U+{v}(3)结束。
按照Prim方法,从顶点1出发,该网的最小生成树的产生过程如图:为实现Prim算法,需设置两个辅助closedge,用来保存U到集合V-U的各个顶点中具有最小权值的边的权值。
对每个Vi∈(V-U)在辅助数组中存在一个相应的分量closedge[i-1],它包括两个域:typedefstructArcNode{intadjvex;owcost=0;owcost,故需修改closedge[1]为边(v2,v3)及其权值,同理修改c losedge[4],closedge[5].closedge[1].adjvex=3.closedge[1].lowcost=5.closedge[4].adjvex=1.closedge[4].lowcost=5.closedge[5].adjvex=3.closedge[5].lowcost=6.以此类推,直至U=V;下图给出了在用上述算法构造网图的最小生成树的过程中:Prim算法实现:按照算法框架:(1)U={u1},T={};(2)while(U≠V)do(u,v)=min{wuv;u∈U,v∈V-U}T=T+{(u,v)}U=U+{v}(3)结束。
当无向网采用二维数组存储的邻接矩阵存储时,Prim算法的C语言实现为:owcost中求最小值,其频度为n-1;其二是重新选择具有最小代价的边,其频度为n。
由此,普里姆算法的时间复杂度为O(n2),与网中的边数无关,因此适用于求边稠密的网的最小生成树。
2.克鲁斯卡尔(Kruskal):由点到线,适合边稀疏的网。
时间复杂度:O(e*loge)Kruskal算法是一种按照网中边的权值递增的顺序构造最小生成树的方法。
基本思想是:1)设无向连通网为G=(V,E),令G的最小生成树为T,其初态为T=(V,{}),即开始时,最小生成树T由图G中的n个顶点构成,顶点之间没有一条边,这样T中各顶点各自构成一个连通分量。
2)在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量,则将此边加入到T中,否则舍弃此边而选择下一条边(若该边依附的两个顶点属于同一个连通分量,则舍去此边,以免造成回路)。
依此类推,当T中的连通分量个数为1时,此连通分量便为G的一棵最小生成树。
按照Kruskal方法构造最小生成树的过程如图所示:在构造过程中,按照网中边的权值由小到大的顺序,不断选取当前未被选取的边集中权值最小的边。
依据生成树的概念,n个结点的生成树,有n-1条边,故反复上述过程,直到选取了n-1条边为止,就构成了一棵最小生成树。
Kruskal算法的实现:算法的框架:构造非连通图T=(V,{})k=i=0;1);vf2=Find(father,edges[i].v2);if(vf1!=vf2){father[vf2]=vf1;j++;printf(“%3d%3d\n”,edges[i].v1,edges[i].v2);}i++;}}vernum-1]InitStack(S);for(i=0;i<;++i)键路径(AOE网):在AOE-网中有些活动可以并行地进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度,路径长度最长的路径叫做关键路径(CriticalPath)。
网:(Activityonedgenetwork)AOE网示意图若在带权的有向图中,以顶点表示事件,以有向边表示活动,边上的权值表示活动的开销(如该活动持续的时间),则此带权的有向图称为AOE网。
实际问题:如果用AOE网来表示一项工程,那么,仅仅考虑各个子工程之间的优先关系还不够,更多的是关心整个工程完成的最短时间是多少;哪些活动的延期将会影响整个工程的进度,而加速这些活动是否会提高整个工程的效率。
因此,通常在AOE网中列出完成预定工程计划所需要进行的活动,每个活动计划完成的时间,要发生哪些事件以及这些事件与活动之间的关系,从而可以确定该项工程是否可行,估算工程完成的时间以及确定哪些活动是影响工程进度的关键。
如图是一个假想的有11项活动的AOE-网:其中有9个事件v1,v2,v3,…,v9,每个事件表示在它之前的活动已经完成,在它之后的活动可以开始。
如v1表示整个工程开始,v 9表示整个工程结束,v5表示a4和a5已经完成,a7和a8可以开始。
与每个活动相联系的数是执行该活动所需的时间。
比如,活动a1需要6天,a2需要4天等。
和AOV-网不同,对AOE-网有待研究的问题是:(1)完成整项工程至少需要多少时间(2)哪些活动是影响工程进度的关键关键路径由于在AOE-网中有些活动可以并行地进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度(这里所说的路径长度是指路径上各活动持续时间之和,不是路径上弧的数目)。
路径长度最长的路径叫做关键路径(CriticalPath)。
AOE网有关的概念:1)路径长度:路径上各个活动的持续时间之和2)完成工程的最短时间:由于AOE网中有活动是并行进行的,所以完成工程的最短时间就是从开始点到完成点的最长路劲长度。
3)活动最早开始时间(earlisttime)(e(i)):从开始点到顶点vi的最长路径称为事件vi的最早发生时间。
这个时间决定了以vi为尾的弧表示的活动的最早开始时间.4)活动最晚开始时间(latesttime)(l(i)):在不推迟整个工程完成的前提下,活动最迟开始的时间5)完成活动的时间余量:该活动的最迟开始时间减去最早开始时间6)关键路径(criticalpath):路径长度最长的路径称为关键路径7)关键活动(criticalactivity):关键路径上的活动称为关键活动,关键活动的特点是:e(i)=l(i)分析关键路径的目的就是辨别在整个工程中哪些是关键活动,以便争取提高关键活动的工作效率,缩短整个工程的工期。
解决方案:由上分析可知,辨别关键活动就是要找e(i)=l(i)的活动。
为了求得AOE-网中活动的e(i)和l(i),首先求事件的最早发生时间ve(j)和最迟发生时间vl(j)。
如果活动ai由弧<j,k>表示,其持续时间记为dut(<j,k>),则有如下关系:e(i)=ve(j)l(i)=vl(k)-dut(<j,k>)求ve(j)和vl(j)需分两步进行:(1)从ve(0)开始向前递推其中,T是所有以第j个顶点为头的弧的结合。
(2)从vl(n-1)=ve(n-1)起向后递推其中,S是所有以第i个顶点为尾的弧的集合。
这两个递推公式的计算必须分别在拓扑有序和逆拓扑有序的前提下进行。
也就是说ve(j-1)必须在vj的所有前驱的最早发生时间求得之后才能确定,而vl(j-1)则必须在vj的所有后继的最迟发生时间求得之后才能确定。
因此,可以在拓扑排序的基础上计算ve(j-1)和vl(j-1)。
关键路径的算法:(1)输入e条弧<j,k>,建立AOE-网的存储结构;(2)从源点v0出发,令ve[0]=0,按拓扑有序求其余各顶点的最早发生时间ve[i](1≤i≤n-1)。
如果得到的拓扑有序序列中顶点个数小于网中顶点数n,则说明网中存在环,不能求关键路径,算法终止;否则执行步骤(3)。
(3)从汇点vn出发,令vl[n-1]=ve[n-1],按逆拓扑有序求其余各顶点的最迟发生时间vl[i](n-2≥i≥0);(4)根据各顶点的ve和vl值,求每条弧s的最早开始时间e(s)和最迟开始时间l(s)。
若某条弧满足条件e(s)=l(s),则为关键活动。
先将拓扑排序算法:TopologicalOrder()CriticalPath便为求关键路径的算法:短路径:最短路径问题是图研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。
最短路径问题是图的又一个比较典型的应用问题。
例如,某一地区的一个公路网,给定了该网内的n个城市以及这些城市之间的相通公路的距离,能否找到城市A到城市B之间一条举例最近的通路呢如果将城市用点表示,城市间的公路用边表示,公路的长度作为边的权值,那么,这个问题就可归结为在网图中,求点A到点B的所有路径中,边的权值之和最短的那一条路径。