考研数据结构必须掌握的知识点与算法-打印版
数据结构考研笔记整理(全)

数据结构考研笔记整理(全)数据结构考研笔记整理数据结构是计算机科学中非常重要的一门课程,对于计算机专业的学生来说,考研复习过程中对数据结构的准备非常关键。
因此,我们需要系统地整理数据结构的相关知识点,以便更好地理解和掌握。
一、线性表线性表是数据结构中最基本的一种数据结构,它是一种有序的数据元素的集合。
常见的线性表有顺序表和链表。
1. 顺序表顺序表是将数据元素存放在一块连续的存储空间中,通过元素的下标来访问。
具有随机访问的特点,但插入和删除操作比较麻烦。
适用于查找操作频繁的场景。
2. 链表链表是将数据元素存放在任意的存储空间中,通过指针来连接各个元素。
具有插入和删除操作方便的特点,但不支持随机访问。
适用于插入和删除操作频繁的场景。
二、栈和队列栈和队列是特殊的线性表,它们都具有先进先出的特点。
1. 栈栈是一种特殊的线性表,只能在表的一端进行插入和删除操作,即“先进后出”。
常见的应用有函数调用的过程中的参数传递、表达式求值等。
2. 队列队列也是一种特殊的线性表,只能在表的一端进行插入操作,而在另一端进行删除操作,即“先进先出”。
常见的应用有任务调度、缓冲区管理等。
三、树树是一种非常重要的非线性数据结构,它由节点和边组成。
树具有层次结构,常见的树结构有二叉树、二叉搜索树和平衡二叉树等。
1. 二叉树二叉树是每个节点最多有两个子树的树结构,包括左子树和右子树。
二叉树的遍历方式有前序遍历、中序遍历和后序遍历。
2. 二叉搜索树二叉搜索树是一种特殊的二叉树,它的左子树中的所有节点都小于根节点,右子树中的所有节点都大于根节点。
具有快速查找和插入的特点。
3. 平衡二叉树平衡二叉树是一种特殊的二叉搜索树,它的左右子树的高度差不超过1。
通过旋转操作可以保持树的平衡性。
四、图图是一种非常复杂的非线性数据结构,它由顶点和边组成。
图可以分为有向图和无向图,常见的图算法有深度优先搜索和广度优先搜索。
1. 深度优先搜索深度优先搜索是一种用于遍历或搜索图和树的算法,它从一个节点开始,尽可能深地访问每个节点的所有子节点,直到没有子节点为止。
《数据结构与算法》知识点整理

《数据结构与算法》知识点整理数据结构与算法知识点整理1. 数据结构1.1 数组- 数组是一种线性数据结构,由一组连续的内存空间组成,用于存储相同类型的数据元素。
- 数组的访问时间复杂度为O(1)。
- 插入和删除操作的时间复杂度为O(n)。
1.2 链表- 链表是一种动态数据结构,通过指针将一组零散的内存块串联起来。
- 链表分为单链表、双向链表和循环链表。
- 链表的访问时间复杂度为O(n)。
- 插入和删除操作的时间复杂度为O(1)。
1.3 栈- 栈是一种先进后出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。
- 栈的插入和删除操作时间复杂度为O(1)。
- 栈的应用场景有函数调用栈、括号匹配等。
1.4 队列- 队列是一种先进先出(FIFO)的数据结构,只能在队尾插入元素,在队头删除元素。
- 队列的插入和删除操作时间复杂度为O(1)。
- 队列的应用场景有任务调度、消息队列等。
1.5 树- 树是一种非线性数据结构,由一组有层次关系的节点组成。
- 树的节点包含一个数据元素和指向子树的指针。
- 常见的树有二叉树、二叉搜索树、AVL树、红黑树等。
1.6 图- 图是一种非线性数据结构,由一组节点和边组成。
- 图分为有向图和无向图,每个节点可以有多个相邻节点。
- 图的表示方法有邻接矩阵和邻接表两种。
2. 算法2.1 排序算法- 冒泡排序:通过不断比较相邻元素的大小,将较大(或较小)的元素交换到最后(或最前)。
- 插入排序:将元素逐个插入到已排序的部分,保持已排序部分始终有序。
- 选择排序:在未排序的部分选出最小(或最大)的元素,放到已排序的部分末尾。
- 快速排序:选择一个枢纽元素,将小于枢纽元素的放在左侧,大于枢纽元素的放在右侧,再对左右两侧进行递归快速排序。
- 归并排序:将数组不断二分,直到每个子数组只有一个元素,然后再将子数组两两归并,保持归并后的数组有序。
2.2 查找算法- 顺序查找:从头到尾依次比较每个元素,直到找到目标元素或搜索结束。
考研《数据结构》复习知识点归纳

《数据结构》复习重点知识点归纳一.数据结构的章节结构及重点构成数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文件,动态存储分配。
对于绝大多数的学校而言,“外排,文件,动态存储分配”三章基本上是不考的,在大多数高校的计算机本科教学过程中,这三章也是基本上不作讲授的。
所以,大家在这三章上可以不必花费过多的精力,只要知道基本的概念即可。
但是,对于报考名校特别是该校又有在试卷中对这三章进行过考核的历史,那么这部分朋友就要留意这三章了。
按照以上我们给出的章节以及对后三章的介绍,数据结构的章节比重大致为:·概论:内容很少,概念简单,分数大多只有几分,有的学校甚至不考。
·线性表:基础章节,必考内容之一。
考题多数为基本概念题,名校考题中,鲜有大型算法设计题,如果有,也是与其它章节内容相结合。
·栈和队列:基础章节,容易出基本概念题,必考内容之一。
而栈常与其它章节配合考查,也常与递归等概念相联系进行考查。
·串:基础章节,概念较为简单。
专门针对于此章的大型算法设计题很少,较常见的是根据KMP进行算法分析。
·多维数组及广义表:基础章节,基于数组的算法题也是常见的,分数比例波动较大,是出题的“可选单元”或“侯补单元”。
一般如果要出题,多数不会作为大题出。
数组常与“查找,排序”等章节结合来作为大题考查。
·树和二叉树:重点难点章节,各校必考章节。
各校在此章出题的不同之处在于,是否在本章中出一到两道大的算法设计题。
通过对多所学校的试卷分析,绝大多数学校在本章都曾有过出大型算法设计题的历史。
·图:重点难点章节,名校尤爱考。
如果作为重点来考,则多出现于分析与设计题型当中,可与树一章共同构成算法设计大题的题型设计。
·查找:重点难点章节,概念较多,联系较为紧密,容易混淆。
出题时可以作为分析型题目给出,在基本概念型题目中也较为常见。
数据结构与算法知识点必备

数据结构与算法知识点必备一、数据结构知识点1. 数组数组是一种线性数据结构,用于存储一组相同类型的元素。
它具有以下特点:- 连续的内存空间,可以通过索引快速访问元素。
- 插入和删除元素的效率较低,需要移动其他元素。
- 数组的大小固定,无法动态调整。
2. 链表链表是一种非连续的数据结构,由一系列节点组成。
每个节点包含数据和指向下一个节点的指针。
它具有以下特点:- 内存空间不连续,通过指针链接各个节点。
- 插入和删除元素的效率较高,只需修改指针指向。
- 链表的大小可以动态调整。
3. 栈栈是一种后进先出(LIFO)的数据结构,只能在一端进行插入和删除操作。
它具有以下特点:- 插入和删除元素的效率较高。
- 可以用数组或链表实现。
4. 队列队列是一种先进先出(FIFO)的数据结构,只能在一端插入元素,在另一端删除元素。
它具有以下特点:- 插入和删除元素的效率较高。
- 可以用数组或链表实现。
5. 树树是一种非线性数据结构,由节点和边组成。
每个节点可以有多个子节点,但只能有一个父节点。
树具有以下特点:- 根节点是树的顶端节点,没有父节点。
- 叶子节点是没有子节点的节点。
- 二叉树是一种特殊的树结构,每个节点最多有两个子节点。
6. 图图是一种非线性数据结构,由节点和边组成。
每个节点可以与其他节点相连,边表示节点间的关系。
图具有以下特点:- 有向图中的边有方向,无向图中的边没有方向。
- 图可以有环,表示节点间存在循环关系。
7. 哈希表哈希表是一种根据关键码值(Key)直接进行访问的数据结构。
它通过散列函数将关键码值映射到表中的位置,具有以下特点:- 查找、插入和删除元素的效率较高。
- 哈希冲突可能导致性能下降,需要解决冲突问题。
二、算法知识点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的最小生成树中的边。
数据结构必考知识点总结

数据结构必考知识点总结在准备考试时,了解数据结构的基本概念和相关算法是非常重要的。
以下是一些数据结构的必考知识点总结:1. 基本概念数据结构的基本概念是非常重要的,包括数据、数据元素、数据项、数据对象、数据类型、抽象数据类型等的概念。
了解这些概念有助于更好地理解数据结构的本质和作用。
2. 线性表线性表是数据结构中最基本的一种,它包括顺序表和链表两种实现方式。
顺序表是将数据元素存放在一块连续的存储空间内,而链表是将数据元素存放在若干个节点中,每个节点包含数据和指向下一个节点的指针。
了解线性表的概念和基本操作是非常重要的。
3. 栈和队列栈和队列是两种特殊的线性表,它们分别具有后进先出和先进先出的特性。
栈和队列的实现方式有多种,包括数组和链表。
掌握栈和队列的基本操作和应用是数据结构的基本内容之一。
4. 树结构树是一种非线性的数据结构,它包括二叉树、多路树、二叉搜索树等多种形式。
了解树的基本定义和遍历算法是必考的知识点。
5. 图结构图是一种非线性的数据结构,它包括有向图和无向图两种形式。
了解图的基本概念和相关算法是非常重要的,包括图的存储方式、遍历算法、最短路径算法等。
6. 排序算法排序是一个非常重要的算法问题,掌握各种排序算法的原理和实现方式是必不可少的。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。
7. 查找算法查找是另一个重要的算法问题,包括顺序查找、二分查找、哈希查找、树查找等。
了解各种查找算法的原理和实现方式是必考的知识点之一。
8. 算法复杂度分析算法的时间复杂度和空间复杂度是评价算法性能的重要指标,掌握复杂度分析的方法和技巧是非常重要的。
9. 抽象数据类型ADT是数据结构的一种概念模型,它包括数据的定义和基本操作的描述。
了解ADT的概念和实现方式是非常重要的。
10. 动态存储管理动态存储管理是数据结构中一个重要的问题,包括内存分配、内存释放、内存回收等。
了解动态存储管理的基本原理和实现方式是必考的知识点之一。
算法与数据结构需要掌握的知识点
算法与数据结构需要掌握的知识点算法与数据结构是计算机科学中非常重要的两个领域,它们是计算机程序设计的基础。
掌握算法与数据结构的知识,对于编写高效、可靠的程序至关重要。
下面将介绍一些算法与数据结构需要掌握的知识点。
一、算法1. 算法的概念:算法是解决问题的一系列步骤或指令的有限序列。
它具有输入、输出和确定性的特点。
2. 时间复杂度和空间复杂度:算法的时间复杂度是指执行算法所需要的时间,空间复杂度是指执行算法所需要的内存空间。
3. 常见的算法设计策略:分治法、贪心算法、动态规划、回溯法等。
4. 常见的算法:排序算法(如冒泡排序、插入排序、选择排序、快速排序、归并排序等)、查找算法(如二分查找、哈希查找等)、图算法(如深度优先搜索、广度优先搜索、最短路径算法等)等。
二、数据结构1. 数据结构的概念:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,它包括线性结构、树形结构、图形结构等。
2. 线性结构:包括数组、链表、栈、队列等。
数组是一种连续存储的线性结构,链表是一种离散存储的线性结构,栈和队列是特殊的线性结构。
3. 树形结构:包括二叉树、堆、哈夫曼树等。
二叉树是一种每个节点最多有两个子节点的树形结构,堆是一种特殊的二叉树,哈夫曼树是一种用于数据压缩的树形结构。
4. 图形结构:包括有向图和无向图。
有向图中的边有方向,无向图中的边没有方向。
5. 数据结构的存储方式:顺序存储和链式存储。
顺序存储是利用连续的存储单元存储数据,链式存储是利用指针将数据元素按照一定的逻辑关系连接起来。
三、算法与数据结构的应用1. 算法与数据结构在搜索引擎中的应用:搜索引擎需要使用数据结构来存储和索引大量的网页,使用算法来进行网页排序和相关性计算。
2. 算法与数据结构在图像处理中的应用:图像处理需要使用数据结构来表示图像,使用算法来进行图像的处理和分析。
3. 算法与数据结构在人工智能中的应用:人工智能需要使用数据结构来存储和处理大量的数据,使用算法来进行数据的分析和模型的训练。
云南省考研计算机科学与技术复习资料数据结构与算法重点知识点梳理
云南省考研计算机科学与技术复习资料数据结构与算法重点知识点梳理一、数据结构基础知识1. 算法与数据结构的关系- 算法的定义与特性- 数据结构的定义与分类2. 线性表- 线性表的概念- 顺序表与链表的实现与比较- 线性表的应用场景二、树结构1. 树的基本概念- 树的定义与性质- 二叉树的基本概念2. 二叉树的遍历- 前序遍历、中序遍历、后序遍历的定义与实现- 二叉树遍历的应用3. 平衡二叉树- 平衡二叉树的概念与性质- AVL树与红黑树的实现与比较三、图结构1. 图的基本概念- 图的定义与表示方法- 有向图与无向图的区别与应用场景2. 图的遍历- 深度优先遍历与广度优先遍历的实现与比较 - 图的遍历应用举例3. 最短路径算法- Dijkstra算法的原理与实现- Floyd算法的原理与应用四、排序与查找算法1. 排序算法- 冒泡排序、插入排序、选择排序的原理与实现 - 快速排序、归并排序的原理与比较2. 查找算法- 顺序查找、二分查找的原理与实现 - 散列查找的概念与应用场景五、高级数据结构1. 堆与优先队列- 堆的定义与性质- 优先队列的实现与应用举例2. 并查集- 并查集的基本操作与实现- 并查集的应用场景3. 字典树- 字典树的原理与实现- 字典树的应用举例六、动态规划1. 动态规划的基本概念- 状态、状态转移方程的定义- 最优子结构与重叠子问题的性质2. 动态规划算法的实现步骤- 划分阶段、确定状态、状态转移方程的推导3. 动态规划的应用举例- 背包问题、最长公共子序列等七、算法复杂度分析1. 算法时间复杂度的概念与计算- 大O表示法的介绍与使用2. 算法空间复杂度的概念与计算- 内存占用量的估算方法3. 算法复杂度的性能比较与选择- 最优算法的选择原则与实例八、应试技巧与备考建议1. 考研数据结构与算法的特点与重要性2. 复习方法与备考策略3. 常见考点与解题技巧的总结以上是云南省考研计算机科学与技术复习资料中数据结构与算法的重点知识点梳理,希望对你的复习有所帮助。
数据结构考研笔记整理(全)
数据结构考研笔记整理(全)一、第二章线性表●考纲内容●一、线性表的基本概念●线性表是具有相同数据结构类型的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.最小生成树:无向连通图的所有生成树中有一棵边的权值总和最小的生成树1.1 问题背景:假设要在n个城市之间建立通信联络网,则连通n个城市只需要n—1条线路。
这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信网。
在每两个城市之间都可以设置一条线路,相应地都要付出一定的经济代价。
n个城市之间,最多可能设置n(n-1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?1.2 分析问题(建立模型):可以用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价。
对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网。
即无向连通图的生成树不是唯一的。
连通图的一次遍历所经过的边的集合及图中所有顶点的集合就构成了该图的一棵生成树,对连通图的不同遍历,就可能得到不同的生成树。
图 G5无向连通图的生成树为(a)、(b)和(c)图所示:G5G5的三棵生成树:可以证明,对于有n 个顶点的无向连通图,无论其生成树的形态如何,所有生成树中都有且仅有n-1 条边。
1.3最小生成树的定义:如果无向连通图是一个网,那么,它的所有生成树中必有一棵边的权值总和最小的生成树,我们称这棵生成树为最小生成树,简称为最小生成树。
最小生成树的性质:假设N=(V,{ E}) 是个连通网,U是顶点集合V的一个非空子集,若(u,v)是个一条具有最小权值(代价)的边,其中,则必存在一棵包含边(u,v)的最小生成树。
1.4 解决方案:两种常用的构造最小生成树的算法:普里姆(Prim)和克鲁斯卡尔(Kruskal)。
他们都利用了最小生成树的性质1.普里姆(Prim)算法:有线到点,适合边稠密。
时间复杂度O(N^2)假设G=(V,E)为连通图,其中V 为网图中所有顶点的集合,E 为网图中所有带权边的集合。
设置两个新的集合U 和T,其中集合U(顶点集)用于存放G 的最小生成树中的顶点,集合T (边集合)存放G 的最小生成树中的边。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》必须掌握的知识点与算法第一章绪论1、算法的五个重要特性(有穷性、确定性、可行性、输入、输出)2、算法设计的要求(正确性、可读性、健壮性、效率与低存储量需求)3、算法与程序的关系:(1)一个程序不一定满足有穷性。
例操作系统,只要整个系统不遭破坏,它将永远不会停止,即使没有作业需要处理,它仍处于动态等待中。
因此,操作系统不是一个算法。
(2)程序中的指令必须是机器可执行的,而算法中的指令则无此限制。
算法代表了对问题的解,而程序则是算法在计算机上的特定的实现。
(3)一个算法若用程序设计语言来描述,则它就是一个程序。
4、算法的时间复杂度的表示与计算(这个比较复杂,具体看算法本身,一般关心其循环的次数与N的关系、函数递归的计算)第二章线性表1、线性表的特点:(1)存在唯一的第一个元素;(这一点决定了图不是线性表)(2)存在唯一的最后一个元素;(3)除第一个元素外,其它均只有一个前驱(这一点决定了树不是线性表)(4)除最后一个元素外,其它均只有一个后继。
2、线性表有两种表示:顺序表示(数组)、链式表示(链表),栈、队列都是线性表,他们都可以用数组、链表来实现。
3、顺序表示的线性表(数组)地址计算方法:(1)一维数组,设DataType a[N]的首地址为A0,每一个数据(DataType类型)占m个字节,则a[k]的地址为:A a[k]=A0+m*k(其直接意义就是求在数据a[k]的前面有多少个元素,每个元素占m个字节)(2)多维数组,以三维数组为例,设DataType a[M][N][P]的首地址为A000,每一个数据(DataType 类型)占m个字节,则在元素a[i][j][k]的前面共有元素个数为:M*N*i+N*j+k,其其地址为:A a[i][j][k]=A000+m*(M*N*i+N*j+k);4、线性表的归并排序:设两个线性表均已经按非递减顺序排好序,现要将两者合并为一个线性表,并仍然接非递减顺序。
可见算法2.25、掌握线性表的顺序表示法定义代码,各元素的含义;6、顺序线性表的初始化过程,可见算法2.37、顺序线性表的元素的查找。
8、顺序线性表的元素的插入算法,注意其对于当原来的存储空间满了后,追加存储空间(就是每次增加若干个空间,一般为10个)的处理过程,可见算法2.49、顺序线性表的删除元素过程,可见算法2.510、顺序线性表的归并算法,可见算法2.711、链表的定义代码,各元素的含义,并能用图形象地表示出来,以利分析;12、链表中元素的查找13、链表的元素插入,算法与图解,可见算法2.914、链表的元素的删除,算法与图解,可见算法2.1015、链表的创建过程,算法与图解,注意,链表有两种(向表头生长、向表尾生长,分别用在栈、队列中),但他们的区别就是在创建时就产生了,可见算法2.1116、链表的归并算法,可见算法2.1217、建议了解所谓的静态单链表(即用数组的形式来实现链表的操作),可见算法2.1318、循环链表的定义,意义19、循环链表的构造算法(其与单链表的区别是在创建时确定的)、图解20、循环链表的插入、删除算法、图解21、双向链表的定义,意义22、双向链表的构造算法(其与单链表的区别是在创建时确定的)、图解23、双向链表的插入、删除算法、图解,可见算法2.18、2.1924、补充:在循环链表中,只设立一个表尾指针比只设立一个表头指针更方便些,为什么?第三章 栈和队列1、栈的顺序表示与实现2、栈的链表表示与实现3、栈的入栈、出栈操作算法4、栈的几个经典应用(迷宫、表达式求值)5、栈与递归的实现,如Hanoi 塔问题6、队列链式表示与实现7、链式队列的入队、出队操作算法8、循环队列的表示(顺序表示)和实现,特别注意其判满、判空方法、入队操作、出队操作的实现(特别重要,考得频率很大)9、补充:共享栈的方法与实现(即两个栈共享一个空间,他们采用栈顶相向,迎面增长的存储方式)10、补充:用两个栈来模拟一个队列的思路、算法11、补充:表达式(前缀、后缀、中缀)的表达互换,这个操作要求对栈在表达式求值中的应用相当熟练,并要求对后面的二叉树相当熟练12、补充:了解双端队列(只需了解)13、补充:链栈比顺序栈的优点与缺点14、补充:一系列元素依次入栈再出栈的顺序,经典题目为:有5个元素,其入栈次序为A 、B 、C 、D 、E ,以下哪种出栈的顺序是不可能的?15、补充:了解用循环链表实现队列,注意在该循环链表中只有一个头指针或一个表尾指针(只需了解)16、补充:根据给出的数学公式,写出对应的递归算法,最经典的就是用递归求阶乘。
第六章 树和二叉树1、几个重要的概念:树、森林、子树、根、终端结点(叶子)、非终端结点、双亲、孩子、兄弟、堂兄弟、度、深度、有序树、无序树、二叉树、k 叉树、完全二叉树、满二叉树、线索二叉树;2、二叉树的5种基本形态;3、二叉树的5个重要性质:(1)在二叉树的第i 层上至多有2i -1个结点(i ≥1);(2)深度为k 的二叉树至多有2k -1个结点,(k ≥1)(3)对任何一棵二叉树T ,如果其终端结点(叶子)数为n 0,度为2的结点数为n 2,则n 0=n 2+1;(4)具有n 个结点的完全二叉树的深度为⎣⎦1log 2+n ; (5)如果对一棵有n 个结点的完全二叉树(其深度为⎣⎦1log 2+n )的结点按性层序编号(从第1层到第⎣⎦1log 2+n 层,每层从左到右),则对任一结点i (1≤i ≤n ),有:(i )如果i =1,则结点i 是二叉树的根,无双亲;如果i >1,则其双亲Parent (i )是结点⎣⎦2i (ii )如果2i >n ,则结点i 无左孩子(结点i 为叶子结点);否则其左孩子LChild (i )是结点2i ;(iii )如果2i +1>n ,则结点i 无右孩子;否则其右孩子RChild (i )是结点2i +1利用完全二叉树的上述性质,能处理大多数完全二叉树的计算题;4、二叉树的存储结构:(1)了解顺序存储结构,只做了解;(2)链式存储结构,重要,需要掌握,后面的算法都是基于此结构;5、二叉树的遍历:(1)能对任意一棵二叉树进行手动前序、中序、后序遍历;(2)能将由前序+中序、后序+中序给出的序列还原成一棵二叉树;(3)能将一个数学表达式用中序方法将其用二叉树画出来,并能写出其前缀(波兰式)、中缀、后缀(逆波兰式)表达出来;6、二叉树的遍历递归算法(注意前、中、后序三个算法只有细微的差别),可见算法6.1,而他们的非递归算法不作要求;7、建立二叉树链表的递归算法,可见算法6.4;8、线索二叉树的存储结构图;9、能用手画出任意二叉树对应的线索二叉树(中序、后序线索);10、线索二叉树的非递归遍历算法,可见算法6.5;11、理解线索二叉树的中序线索化过程算法,可见算法6.6;12、手动写出任意森林、树的深度优先、广度优先遍历顺序;13、森林、二叉树的转换过程,能用手画出即可;14、哈夫曼树的相关概念:路径长度、带权路径长度WPL 、权值;15、二叉哈夫曼树的构造过程,能用手动构造,并能将构造好的树用编码表示出来;16、了解哈夫曼树的构造算法,可见算法6.12,只需要了解,无需掌握;17、记住树的记数公式:对一棵有n 个结点的有n n C n 211 棵不同的二叉树 18、补充:二叉排序树、插入、删除结点的操作(在查找一章中有详述);19、补充:满二叉树、完全二叉树用数组存储方式,其元素、结点对应关系;20、补充:求二叉树的高度(深度)算法;21、补充:将二叉树中左、右孩子交换的算法;22、补充:将用数组存储的完全二叉树转换成链式结构的算法;23、补充:对用数组存储的完全二叉树进行非递归的前序、中序、后序遍历算法;24、补充:求二叉树中叶子数、度为1的、度为2的结点数算法;25、补充:对于K 叉树,其结点总数为N ,求出该树的最大高度、高小高度;26、补充:构造结点数为n 的k 叉哈夫曼树(其所有的结点要么度为0,要么度为k ),注意一般都需要增加m 个权为0的结点(称为虚结点),其中如果叶子结点数目不足以构成正则的k 叉树(树中只有度为k 或0的结点),即不满足(n -1)MOD (k -1)=0(其中MOD 是取余运算),需要添加权为0的结点,添加的个数为m =k -(n -1)MOD (k -1)-1。
添加的位置应该是距离根结点的最远处。
假设n =10,k =3,则需要添加1个权为0的虚结点(其字母可以为空)。
第七章 图1、图的几个重要概念:顶点、弧、弧尾、弧头、边、有向图、无向图、完全图、邻接点、入度、出度、度、路径、回路(环)、连通图、连通分量、强连通图、强连通分量、生成森林、关节点、重连通图、AOV-网、AOE-网;2、图的几种存储、表示方法:数组表示法(重要)、邻接表(最重要,应用最广)、逆邻接表(掌握)、十字链表(理解)、邻接多重表(了解),并能大致掌握他们各种方法表示的优缺点;3、图的两种遍历顺序:深度、广度优先,建议同时掌握其算法;4、图的生成树和生成森林(只需掌握手画方法);5、图的最小生成树的两种算法:普里姆(Prim )算法(实质是顶点优先)、克鲁斯卡尔(Kruskal )算法(实质是边优先),掌握他们的手动构造过程,了解算法;6、理解求关节点算法,可见算法7.10、7.11;7、了解拓扑排序;8、掌握由AOE-网得到关键路径的方法(手动),了解算法(7.13、7.14);9、掌握最短路径的手动求解过程、方法(两种:迪杰斯特拉Dijkstra 、弗洛伊德Floyd ),了解算法;10、补充:Prim 算法、Kruskal 算法、Dijkstra 算法、Floyd 算法的时间复杂度;11、补充:了解拓扑排序算法;12、补充:能将图的抽象定义,如有向图G=(V,{A}),V={v1,v2,v3,v4},A={<v1,v2>,<v1,v3>,<v3,v4>,<v4,v1>}画成图,也能将图用抽象定义写出;13、补充:能根据图的邻接表、逆邻接表、数组表示法表示出来的图画出,亦能根据图写出其邻接表、逆邻接表、数组表示法;14、补充:了解四色定理(Four color theorem):最先是由一位叫古德里(Francis Guthrie)的英国大学生提出来的。
德·摩尔根(Augustus De Morgan,1806~1871)1852年10月23日致哈密顿的一封信提供了有关四色定理来源的最原始的记载。
他在信中简述了自己证明四色定理的设想与感受。
四色问题的内容是:“任何一张地图只用四种颜色就能使具有共同边界的国家染上不同的颜色。