Qcdqam考研数据结构学习笔记
- 格式:doc
- 大小:239.00 KB
- 文档页数:23
数据结构详细笔记数据结构是计算机科学中非常重要的一个概念,它可以帮助我们更有效地组织和管理数据。
在本文中,我将详细介绍各种常见的数据结构及其特点和应用场景。
一、线性表线性表是最简单也是最常见的数据结构之一。
它是由一系列具有相同类型的元素组成的序列,其中每个元素都有一个前驱元素和一个后继元素,除了第一个元素没有前驱元素,最后一个元素没有后继元素。
常见的线性表有数组、链表和栈。
1. 数组数组是一种在内存中连续存储的数据结构,可以通过下标来访问其中的元素。
它的优点是访问速度快,缺点是插入和删除操作比较慢。
2. 链表链表是通过指针将一组零散的内存块连接起来形成的数据结构,它的节点可以不连续存储。
链表的优点是插入和删除操作比较快,缺点是访问速度相对较慢。
3. 栈栈是一种后进先出(LIFO)的线性表,它只允许在表的一端进行插入和删除操作。
常见的应用场景有函数调用、括号匹配等。
二、队列队列是一种先进先出(FIFO)的线性表,类似于现实生活中的排队。
它有两个指针,分别指向队头和队尾。
常见的队列有普通队列、双端队列和优先队列。
1. 普通队列普通队列是最基本的队列形式,只能在队头删除元素,在队尾插入元素。
常见的应用场景有任务调度、消息队列等。
2. 双端队列双端队列是允许从两端插入和删除元素的队列。
它可以作为栈和队列的结合体,常见的应用场景有回文判断、迷宫问题等。
3. 优先队列优先队列是一种按照元素优先级进行插入和删除操作的队列。
常见的应用场景有任务调度、图像压缩等。
三、树树是一种非线性的数据结构,它由若干个具有层次关系的节点组成。
树的每个节点可以有多个子节点,但每个子节点只能有一个父节点。
常见的树有二叉树、二叉搜索树和平衡树。
1. 二叉树二叉树是每个节点最多有两个子节点的树结构。
它的遍历方式有前序遍历、中序遍历和后序遍历。
常见的应用场景有表达式计算、文件系统等。
2. 二叉搜索树二叉搜索树是一种特殊的二叉树,它的左子树的所有节点都小于根节点,右子树的所有节点都大于根节点。
数据结构考研笔记整理(全)数据结构考研笔记整理数据结构是计算机科学中非常重要的一门课程,对于计算机专业的学生来说,考研复习过程中对数据结构的准备非常关键。
因此,我们需要系统地整理数据结构的相关知识点,以便更好地理解和掌握。
一、线性表线性表是数据结构中最基本的一种数据结构,它是一种有序的数据元素的集合。
常见的线性表有顺序表和链表。
1. 顺序表顺序表是将数据元素存放在一块连续的存储空间中,通过元素的下标来访问。
具有随机访问的特点,但插入和删除操作比较麻烦。
适用于查找操作频繁的场景。
2. 链表链表是将数据元素存放在任意的存储空间中,通过指针来连接各个元素。
具有插入和删除操作方便的特点,但不支持随机访问。
适用于插入和删除操作频繁的场景。
二、栈和队列栈和队列是特殊的线性表,它们都具有先进先出的特点。
1. 栈栈是一种特殊的线性表,只能在表的一端进行插入和删除操作,即“先进后出”。
常见的应用有函数调用的过程中的参数传递、表达式求值等。
2. 队列队列也是一种特殊的线性表,只能在表的一端进行插入操作,而在另一端进行删除操作,即“先进先出”。
常见的应用有任务调度、缓冲区管理等。
三、树树是一种非常重要的非线性数据结构,它由节点和边组成。
树具有层次结构,常见的树结构有二叉树、二叉搜索树和平衡二叉树等。
1. 二叉树二叉树是每个节点最多有两个子树的树结构,包括左子树和右子树。
二叉树的遍历方式有前序遍历、中序遍历和后序遍历。
2. 二叉搜索树二叉搜索树是一种特殊的二叉树,它的左子树中的所有节点都小于根节点,右子树中的所有节点都大于根节点。
具有快速查找和插入的特点。
3. 平衡二叉树平衡二叉树是一种特殊的二叉搜索树,它的左右子树的高度差不超过1。
通过旋转操作可以保持树的平衡性。
四、图图是一种非常复杂的非线性数据结构,它由顶点和边组成。
图可以分为有向图和无向图,常见的图算法有深度优先搜索和广度优先搜索。
1. 深度优先搜索深度优先搜索是一种用于遍历或搜索图和树的算法,它从一个节点开始,尽可能深地访问每个节点的所有子节点,直到没有子节点为止。
数据结构考研复习重点归纳数据结构是计算机科学中非常重要的一门基础课程,考研复习数据结构时,需要重点掌握的内容有以下几个方面。
1.线性表:线性表是数据结构中最基本的一种结构,常见的线性表有数组、链表和栈等。
考生需要掌握线性表的定义、插入、删除、查找等基本操作,并能够分析它们的时间复杂度。
2.树:树是一种非常重要且常见的数据结构,它具有分层结构和层次关系。
其中,二叉树是最简单也是最基本的一种树结构,树的遍历(如前序遍历、中序遍历和后序遍历)是树算法中的重要内容。
此外,还要了解一些特殊的树结构,如平衡树和B树等。
3.图:图是由节点和边组成的一种数据结构,它是一种非常灵活的结构,常用来表示各种实际问题中的关系。
在考研复习中,需要掌握图的基本概念(如顶点和边)、图的存储结构(如邻接矩阵和邻接表)以及图的遍历算法(如深度优先和广度优先)等。
4.查找和排序:在实际问题中,经常需要查找和排序数据。
查找算法(如顺序查找、二分查找和哈希查找)和排序算法(如冒泡排序、插入排序和快速排序)是数据结构中常见的算法,考生需要熟练掌握这些算法的原理和实现方法。
此外,还要了解一些高级的查找和排序算法,如二叉查找树和归并排序等。
5.散列表:散列表(也称哈希表)是一种特殊的数据结构,它利用散列函数将数据映射到一个固定大小的数组中。
散列表具有快速的查找和插入操作,常用于实现字典和数据库等应用。
在考研复习中,需要了解散列表的原理和实现方法,以及处理冲突的方法,如链地址法和开放地址法。
6.动态规划:动态规划是一种解决问题的数学方法,也是一种重要的算法思想。
在考研复习中,需要掌握动态规划的基本原理和解题思路,以及常见的动态规划算法,如背包问题和最长公共子序列等。
7.算法复杂度分析:在考研复习中,需要有一定的算法分析能力,能够对算法的时间复杂度和空间复杂度进行分析和估算。
此外,还要能够比较不同算法的效率,并选择合适的算法来解决实际问题。
除了以上重点内容,考生还要注意掌握一些基本的编程知识,如指针、递归和动态内存分配等。
《数据结构》复习重点知识点归纳一.数据结构的章节结构及重点构成数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文件,动态存储分配。
对于绝大多数的学校而言,“外排,文件,动态存储分配”三章基本上是不考的,在大多数高校的计算机本科教学过程中,这三章也是基本上不作讲授的。
所以,大家在这三章上可以不必花费过多的精力,只要知道基本的概念即可。
但是,对于报考名校特别是该校又有在试卷中对这三章进行过考核的历史,那么这部分朋友就要留意这三章了。
按照以上我们给出的章节以及对后三章的介绍,数据结构的章节比重大致为:·概论:内容很少,概念简单,分数大多只有几分,有的学校甚至不考。
·线性表:基础章节,必考内容之一。
考题多数为基本概念题,名校考题中,鲜有大型算法设计题,如果有,也是与其它章节内容相结合。
·栈和队列:基础章节,容易出基本概念题,必考内容之一。
而栈常与其它章节配合考查,也常与递归等概念相联系进行考查。
·串:基础章节,概念较为简单。
专门针对于此章的大型算法设计题很少,较常见的是根据KMP进行算法分析。
·多维数组及广义表:基础章节,基于数组的算法题也是常见的,分数比例波动较大,是出题的“可选单元”或“侯补单元”。
一般如果要出题,多数不会作为大题出。
数组常与“查找,排序”等章节结合来作为大题考查。
·树和二叉树:重点难点章节,各校必考章节。
各校在此章出题的不同之处在于,是否在本章中出一到两道大的算法设计题。
通过对多所学校的试卷分析,绝大多数学校在本章都曾有过出大型算法设计题的历史。
·图:重点难点章节,名校尤爱考。
如果作为重点来考,则多出现于分析与设计题型当中,可与树一章共同构成算法设计大题的题型设计。
·查找:重点难点章节,概念较多,联系较为紧密,容易混淆。
出题时可以作为分析型题目给出,在基本概念型题目中也较为常见。
第1章绪论◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型。
数据——所有能被计算机识别、存储和处理的符号的集合。
数据元素——是数据的基本单位,具有完整确定的实际意义。
数据对象——具有相同性质的数据元素的集合,是数据的一个子集。
数据结构——是相互之间存在一种或多种特定关系的数据元素的集合,表示为:Data_Structure=(D, R)数据类型——是一个值的集合和定义在该值上的一组操作的总称。
抽象数据类型——由用户定义的一个数学模型与定义在该模型上的一组操作,它由基本的数据类型构成。
◆算法算法:是指解题方案的准确而完整的描述。
算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。
算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。
特征包括:(1)可行性;(2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性;(3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义;(4)拥有足够的情报。
算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。
指令系统:一个计算机系统能执行的所有指令的集合。
基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。
算法的控制结构:顺序结构、选择结构、循环结构。
算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。
算法复杂度:算法时间复杂度和算法空间复杂度。
算法时间复杂度是指执行算法所需要的计算工作量。
算法空间复杂度是指执行这个算法所需要的内存空间。
for ( i = 1 , i < = 10 , i++ ) x=x+c; =>O(1)for ( i = 1 , i < = n , i++ ) x=x+n; =>O(n)多嵌套一个for,则为=>O(n^2) 以此类推真题难点:i = 1,while(i < = n)i = i * 3;=>O(log3^n)i = i * 2;=>O(log2^n) 以此类推数据的逻辑结构有以下两大类:线性结构:有且仅有一个开始结点和一个终端结点,且所有结点都最多只有一个直接前驱和一个直接后继。
数据结构考研知识点总结数据结构是计算机科学中一门重要的课程,其是计算机科学的核心基础之一、在考研中,数据结构也是一个必考的科目,对于应试者来说,掌握数据结构的知识点是非常重要的。
下面是对数据结构考研知识点的总结。
1.数据结构的基本概念和分类。
数据结构是指一组数据的存储方式和相应的操作方法。
常见的数据结构包括线性结构、树形结构、图结构等。
线性结构包括数组、链表、栈、队列等;树形结构包括二叉树、堆、哈希树等;图结构包括有向图、无向图等。
2.线性结构。
线性结构是数据元素之间存在一对一的关系的数据结构。
常用的线性结构有数组、链表、栈和队列。
-数组是一种连续存储的线性结构,可以通过下标直接访问元素。
-链表是一种离散存储的线性结构,有单向链表、双向链表和循环链表等。
-栈是一种特殊的线性结构,只能在一端进行插入和删除操作,遵循后进先出(LIFO)的原则。
-队列也是一种特殊的线性结构,只能在一端进行插入操作,另一端进行删除操作,遵循先进先出(FIFO)的原则。
3.树形结构。
树形结构是一种非线性的数据结构,具有层次关系的集合。
常用的树形结构包括二叉树、AVL树、B树和哈夫曼树等。
-二叉树是一种每个节点最多有两个子节点的树形结构,包括满二叉树、完全二叉树和二叉树等。
-AVL树是一种自平衡的二叉树,通过维护平衡因子来保证树的平衡。
-B树是一种多路平衡查找树,用于大规模数据存储和文件系统等。
-哈夫曼树是一种用于数据压缩的最优二叉树。
4.图结构。
图结构是由顶点和边组成的一种数据结构。
常用的图结构包括有向图、无向图、带权图和图的遍历等。
-有向图是边有方向的图结构,边具有指向关系。
-无向图是边无方向的图结构,边没有指向关系。
-带权图是边具有权值的图结构。
-图的遍历有深度优先(DFS)和广度优先(BFS)两种常见方法。
5.排序算法。
排序算法是数据结构中重要的应用之一、常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序、快速排序和堆排序等。
考研数据结构学习笔记第一章绪论一、基本问题问答:1、什么叫数据结构?如何理解“数据结构”?如何树立数据结构的学习体系?广义上的数据结构指的是:逻辑结构和物理结构。
狭义上的数据结构专指逻辑结构,就是元素间的逻辑关系,主要类型有:集合型,线性结构,树型,图型!整个数据结构的课程就是围绕着以上几种数据类型展开的,加上基于这些结构的基本操作:插入,删除,查找,取元素,取长度等等。
另外,还有基于这些数据结构的较为复杂的算法:查找和排序。
在严老师和其他很多的数据结构教材中都把查找和排序作为了一个独立的部分,这一部分实际上主要在探讨算法,而不在是结构本身了。
算法的概念将在后面提到。
2、数据的物理结构和逻辑结构定义数据结构,当计算机程序运行时,程序就按照定义给这些数据分配了空间。
而数据定义,是在定义其逻辑结构。
以链表为列,在实际定义时,一个个的结点,由于其指针域可以指向另一个结点,那么依靠这种指向关系,就可在逻辑上建立起一条链状结构!但是,在实际的程序执行时,是不会有这样的一条链的,而是通过在一个结点空间的某个空间内填入了下一个结点的地址!这样的每个有数据和地址的结点,才是其物理结构。
3、算法的概念、分析,算法时间复杂度的含义及分析算法就是解决问题的方法或策略。
一个算法好与坏的评价标准是:正确,可读,健壮,效率高,空间省!设计算法时,应该按照严教材上关于类C(或类P)语言的描述来作,格式为:status fun_name{//算法说明for{ .... };//典型功能及复杂语句后加注释}//fun_name注意写好注释!不求多,但求精!时间复杂度:分析算法效率的重要工具。
主要是靠推算语句执行次频度而得来的。
时间复杂度考查的是“某数量级”的概念,即:T(n)=O(f(n))中,存在正的常数C和n0,使得当n>=n0时,0<=T(N)<=C*F(N)当空间复杂度为O(1)时,称算法为就地工作(原地工作)。
数据结构高分笔记
数据结构是计算机科学中非常重要的一个领域,其目的是使计算机能够高效地处理数据。
数据结构包括数据的存储结构和数据之间的关系,其中数据的存储结构是指数据在计算机中的表现形式,而数据之间的关系则是指数据之间的关联和相互作用。
在数据结构中,常见的数据结构包括线性表、栈、队列、树、图等等。
其中,线性表是一种常见的数据结构,它的特点是支持常见的操作,如插入、删除、查找等等。
栈和队列是线性表的特殊形式,它们支持一些特殊的操作,如入栈、出栈、前驱、后继等等。
树和图则是更加复杂的数据结构,它们可以用来表示各种类型的数据,如层次结构、图形等等。
数据结构的学习需要扎实的数学基础和敏锐的逻辑思考能力。
在学习数据结构的过程中,不仅要掌握数据结构和算法的基本概念和原理,还需要熟练掌握一些经典的算法和数据结构,如二叉树、排序算法、哈希表等等。
同时,还需要不断地实践和探索,通过不断地练习和实践,加深对数据结构和算法的理解。
数据结构是计算机科学中非常重要的一个领域,对于从事计算机科学和软件开发等领域的学生和从业者来说,掌握数据结构和算法是非常重要的。
通过不断地学习和实践,才能够更好地理解和应用数据结构和算法,提高编程效率和代码质量。
数据结构考研笔记整理(全)一、第二章线性表●考纲内容●一、线性表的基本概念●线性表是具有相同数据结构类型的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、什么叫数据结构?如何理解“数据结构”?如何树立数据结构的学习体系?广义上的数据结构指的是:逻辑结构和物理结构。
狭义上的数据结构专指逻辑结构,就是元素间的逻辑关系,主要类型有:集合型,线性结构,树型,图型!整个数据结构的课程就是围绕着以上几种数据类型展开的,加上基于这些结构的基本操作:插入,删除,查找,取元素,取长度等等。
另外,还有基于这些数据结构的较为复杂的算法:查找和排序。
在严老师和其他很多的数据结构教材中都把查找和排序作为了一个独立的部分,这一部分实际上主要在探讨算法,而不在是结构本身了。
算法的概念将在后面提到。
2、数据的物理结构和逻辑结构定义数据结构,当计算机程序运行时,程序就按照定义给这些数据分配了空间。
而数据定义,是在定义其逻辑结构。
以链表为列,在实际定义时,一个个的结点,由于其指针域可以指向另一个结点,那么依靠这种指向关系,就可在逻辑上建立起一条链状结构!但是,在实际的程序执行时,是不会有这样的一条链的,而是通过在一个结点空间的某个空间内填入了下一个结点的地址!这样的每个有数据和地址的结点,才是其物理结构。
3、算法的概念、分析,算法时间复杂度的含义及分析算法就是解决问题的方法或策略。
一个算法好与坏的评价标准是:正确,可读,健壮,效率高,空间省!设计算法时,应该按照严教材上关于类C(或类P)语言的描述来作,格式为:status fun_name{//算法说明for{ .... };//典型功能及复杂语句后加注释}//fun_name注意写好注释!不求多,但求精!时间复杂度:分析算法效率的重要工具。
主要是靠推算语句执行次频度而得来的。
时间复杂度考查的是“某数量级”的概念,即:T(n)=O(f(n))中,存在正的常数C和n0,使得当n>=n0时,0<=T(N)<=C*F(N)当空间复杂度为O(1)时,称算法为就地工作(原地工作)。
算法时间复杂度的分析:时间复杂度的分析说到底是分析当系统规模增大时,系统所耗费时间的数量级。
数量级的定义见上。
简而言之,2n^2,6n^2,n^2是同一数量级,因为由n^2可推出其它两个(常数相乘)。
此外,当时间复杂度的公式中出现n的多项式时,应该以高阶为准。
因为此时影响总体变化规律的是高阶项的值。
在分析时间复杂度时,应该以程序或算法中执行次数最多的语句为准,通常情况下是最内层循环的时间复杂茺,最内层语句的执行次数计算出来后,取最高的次数,然后去掉该项中的常数因子即可。
空间复杂度的度量主要是看当系统规模n增大时,系统所占用的额外空间是否也在增大,按怎么的规律增大。
如果没有增大,即额外空间始终是个常数,算法就是原地工作!4、算法设计规范1>在算法设计中,第一个牵涉到的概念是:算法说明。
它是写在过程或函数首部以下的注释内容。
虽是注释内容,却是必不可少的。
在测试中也占有相当大的作用。
此说明主要包括:算法的功能,参数表中各参数的含义及输入输出定义;算法中引用了哪些全局变量或外部定义的变量,它们的作用,入口初值,以及应该满足哪些限制条件。
如:链表是否带头结点,表中元素是否有序,如果有序是递增还是递减等等!必要时,算法说明还可用来陈述算法思想,采用的存储结构等。
递归算法的说明特别重要,读者应该力求将它写为算法的严格定义。
几个例子:2.29procedure DifferenceSqlist(VAR a;Sqlist;b,c:Sqlist);{删去增序顺序表中那些既在增序顺序表中B出现又在增序顺序表C中出现的元素}2.33procedure Sqlistlinkedlist(VAR lc,ld,loinkedList;llinkedList);{将线性表ll分割为3个循环链表lc,ld和lo,}{其中每个循环链表只含一类字符,分别为['A'..'Z']、['0'..'9']和其它字符。
}2>注释与断言在难懂的语句和关键的语句(段)之后加以注释可以大大提高程序的可读性。
注释要恰当,并非越多越好;此外,注释句的抽象程度应略高于语句(段)。
断言是注释的一种特殊写法,它是一个逻辑谓词,陈述算法执行到此点时应满足的条件,即这种形式:当、、、时,、、。
最重要的就是算法的入口断言与else分支断言。
如果算法不含有参数佥性检测的代码段,书写入口断言是最低限度的要求。
3>输入、输出三种方式:a、通过专门的输入/出语句:read,write,scanf,printf等b、通过参数表中的参数传递c、通过全局及外部变量4>错误处理三种处理方式:a、error语句实现b、通过函数返回错误代码或错误状态值c、exit语句实现提倡使用第二种方式来实现错误处理5>语句的使用与算法结构避免使用goto语句,算法结构结构应该同层次对齐,下一层向上一层缩进两格,并以适当的符号标识语句段的开始与结束:[],{ }6>基本运算未明确要求的,不得直接用教科书上的基本运算非用不可的,要将这些基本运算的代码全部写出7>几点建议a、建议以图说明算法b、建议在算法书写完毕后,用边界条件的值验证一下算法能否正确执行5、类P与类C大比拼许多朋友问我类P与类C有啥区别,哪个更好?考试的时候用哪个语言?其实,这些都是一些很基础的问题,不客气地说这是考研门外汉的问题。
类P较类C的教材版本出得早,在后期的类C版数据中省去了类P中的一些内容,比如:栈一章的递归到非递归的转化等。
但并不能因此就说类C版要差,事实上,类C的更符合当前考试和应用的发展趋势,从整体认同度而言,个人建议还是用类C好一点,原因:一,C语言本身很灵活,程序简洁,是真正的程序员用的语言,更是一个计算机研究生必须掌握的;二,C语言本身在实际项目的应用中是一种通用语言,软件公司绝大多数是要精通VC的,学好C的DS其意义更深远一些。
另外,考虑到考上后绝大多数研友都会被导师拉去作项目,而作项目时多用的也是C!三,就交流范围而言,现在计算机版里用C的人要多得多,所以,交流的机会应该要多一些,这样提高的也快些。
四,其它原因。
至于考试的时候用哪一个,应该以报考学校的要求为准,如果没有作要求的,请参照一下该校给出的历年题的标准答案是用哪种语言。
当然,一般情况下,用两种语言都行,只要算法正确,就会得分。
下面,罗列一下类C与类P的不同:---------------------------------------|类P|类 C---------------------------------------类型定义|TYPE、、、RECORD、、、END|TYPEDEF、、、{、、、}---------------------------------------常量定义|CONST|#DEFINE---------------------------------------函数定义|PROC(或FUNC)名(参数)[] |STATUS(VOID)名(参数);{}---------------------------------------语句段|[、、、]|{、、、}---------------------------------------条件语句|IF、、THEN、、ELSE|IF()、、ELSE、、---------------------------------------赋值语句|:=|=---------------------------------------比较运算|=|==---------------------------------------多分支语句|CASE变量名OF|SWITCH(表达式){(只写一种)|值1:、、、|CASE值1:、、、、;BREAK;|、、、|、、、|ELSE语句|DEFAULT:语句N+1|ENDC;|}---------------------------------------循环语句|WHILE条件DO[、、、、]|WHILE条件{、、、}|REPEAT、、、UNTIL()|DO{、、、}WHILE()|FOR(初值)TO(终值)DO[语句]|FOR(初值;条件;表达式){语句}---------------------------------------出错处理|ERROR(‘错误’)|EXIT(出错代码)---------------------------------------输入/出|READ,WRITE|SCANF,PRINTF---------------------------------------注释|{}|//---------------------------------------基本函数|MAX,MIN,ABS,EOF,EOLN,上下取整|上下取整分别为FLOOR,CEIL ---------------------------------------逻辑运算|AND,OR,NOT,CAND,COR|&&,||,!---------------------------------------注:以上不同之处在具体算法中的体现,请参照教材P版P25页和C版P24页的对应算法。
二、本章习题集中常考及已考题1.1相同1.2相同1.3相似1.4无1.5相似1.6相似1.7相似1.8相似1.9相似1.10相同1.11相似(时间复杂度的比较)1.12相似(时间复杂度的比较)1.13无1.14相似于1.101.15无三、本章例题及习题分析由于本章较为简单,此部分省略。
数据结构--序言在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。
很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。
要想成为一个专业的开发人员,至少需要以下三个条件:能够熟练地选择和设计各种数据结构和算法。
至少要能够熟练地掌握一门程序设计语言。
熟知所涉及的相关应用领域的知识。
其中,后两个条件比较容易实现,而第一个条件则需要花相当的时间和精力才能够达到,它是区分一个程序设计人员水平高低的一个重要标志,数据结构贯穿程序设计的始终,缺乏数据结构和算法的深厚功底,很难设计出高水平的具有专业水准的应用程序。
曾经有一本经典计算机专业书籍叫做《数据结构+算法=程序》,也说明了数据结构和算法的重要性。
《数据结构》是计算机科学与工程的基础研究之一,掌握该领域的知识对于我们进一步进行高效率的计算机程序开发非常重要。