数据结构复习笔记
- 格式:doc
- 大小:47.50 KB
- 文档页数:12
数据结构复习资料复习提纲知识要点归纳数据结构复习资料:复习提纲知识要点归纳一、数据结构概述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.数据元素:数据的基本单位,可由若干个数据项组成,数据项是具有独立含义的最小标识单位;3.数据结构:数据之间的相互关系,即数据的组织形式;它包括:1数据的逻辑结构,从逻辑关系上描述数据,与数据存储无关,独立于计算机;2数据的存储结构,是逻辑结构用计算机语言的实现,依赖于计算机语言;3数据的运算,定义在逻辑结构上,每种逻辑结构都有一个运算集合;常用的运算:检索/插入/删除/更新/排序;4.数据的逻辑结构可以看作是从具体问题抽象出来的数学模型;数据的存储结构是逻辑结构用计算机语言的实现;5.数据类型:一个值的集合及在值上定义的一组操作的总称;分为:原子类型和结构类型;6.抽象数据类型:抽象数据的组织和与之相关的操作;优点:将数据和操作封装在一起实现了信息隐藏;7. 抽象数据类型ADT:是在概念层上描述问题;类:是在实现层上描述问题;在应用层上操作对象类的实例解决问题;8.数据的逻辑结构,简称为数据结构,有:1线性结构,若结构是非空集则仅有一个开始和终端结点,并且所有结点最多只有一个直接前趋和后继;2非线性结构,一个结点可能有多个直接前趋和后继;9.数据的存储结构有:1顺序存储,把逻辑相邻的结点存储在物理上相邻的存储单元内;2链接存储,结点间的逻辑关系由附加指针字段表示;3索引存储,存储结点信息的同时,建立附加索引表,有稠密索引和稀疏索引;4散列存储,按结点的关键字直接计算出存储地址;10.评价算法的好坏是:算法是正确的;执行算法所耗的时间;执行算法的存储空间辅助存储空间;易于理解、编码、调试;11.算法的时间复杂度Tn:是该算法的时间耗费,是求解问题规模n的函数;记为On;时间复杂度按数量级递增排列依次为:常数阶O1、对数阶Olog2n、线性阶On、线性对数阶Onlog2n、平方阶On^2、立方阶On^3、……k次方阶On^k、指数阶O2^n;13.算法的空间复杂度Sn:是该算法的空间耗费,是求解问题规模n的函数;12.算法衡量:是用时间复杂度和空间复杂度来衡量的,它们合称算法的复杂度;13. 算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关;第二章线性表1.线性表:是由nn≥0个数据元素组成的有限序列;3.顺序表:把线性表的结点按逻辑次序存放在一组地址连续的存储单元里;4.顺序表结点的存储地址计算公式:Locai=Loca1+i-1C;1≤i≤n5.顺序表上的基本运算public interface List {链表:只有一个链域的链表称单链表;在结点中存储结点值和结点的后继结点的地址,data next data是数据域,next是指针域;1建立单链表;时间复杂度为On;加头结点的优点:1链表第一个位置的操作无需特殊处理;2将空表和非空表的处理统一; 2查找运算;时间复杂度为On;public class SLNode implements Node {private Object element;private SLNode next;public SLNodeObject ele, SLNode next{= ele;= next;}public SLNode getNext{return next;}public void setNextSLNode next{= next;}public Object getData {return element;}public void setDataObject obj {element = obj;}}public class ListSLinked implements List {private SLNode head; etData==ereturn p;else p = ;return null;}etData;.getNext;size--;return obj;}etNext;size--;return true;}return false;}环链表:是一种首尾相连的链表;特点是无需增加存储量,仅对表的链接方式修改使表的处理灵活方便;8.空循环链表仅由一个自成循环的头结点表示;9.很多时候表的操作是在表的首尾位置上进行,此时头指针表示的单循环链表就显的不够方便,改用尾指针rear来表示单循环链表;用头指针表示的单循环链表查找开始结点的时间是O1,查找尾结点的时间是On;用尾指针表示的单循环链表查找开始结点和尾结点的时间都是O1;10.在结点中增加一个指针域,prior|data|next;形成的链表中有两条不同方向的链称为双链表;public class DLNode implements Node {private Object element;private DLNode pre;private DLNode next;public DLNodeObject ele, DLNode pre, DLNode next{= ele;= pre;= next;}public DLNode getNext{return next;}public void setNextDLNode next{= next;}public DLNode getPre{return pre;}public void setPreDLNode pre{= pre;}public Object getData {return element;}public void setDataObject obj {element = obj;}}public class LinkedListDLNode implements LinkedList {private int size; etPrenode;node;size++;return node;}etNextnode;node;size++;return node;}etNext;.setPre;size--;return obj;}序表和链表的比较1基于空间的考虑:顺序表的存储空间是静态分配的,链表的存储空间是动态分配的;顺序表的存储密度比链表大;因此,在线性表长度变化不大,易于事先确定时,宜采用顺序表作为存储结构;2基于时间的考虑:顺序表是随机存取结构,若线性表的操作主要是查找,很少有插入、删除操作时,宜用顺序表结构;对频繁进行插入、删除操作的线性表宜采用链表;若操作主要发生在表的首尾时采用尾指针表示的单循环链表;12.存储密度=结点数据本身所占的存储量/整个结点结构所占的存储总量存储密度:顺序表=1,链表<1;第三章栈和队列1.栈是限制仅在表的一端进行插入和删除运算的线性表又称为后进先出表LIFO表;插入、删除端称为栈顶,另一端称栈底;表中无元素称空栈;2.栈的基本运算有:1initstacks,构造一个空栈;2stackemptys,判栈空;3stackfulls,判栈满;4pushs,x,进栈;5pops,退栈;6stacktops,取栈顶元素;3.顺序栈:栈的顺序存储结构称顺序栈;4.当栈满时,做进栈运算必定产生空间溢出,称“上溢”;当栈空时,做退栈运算必定产生空间溢出,称“下溢”;上溢是一种错误应设法避免,下溢常用作程序控制转移的条件;5.在顺序栈上的基本运算:public interface Stack {栈:栈的链式存储结构称链栈;栈顶指针是链表的头指针;7.链栈上的基本运算:public class StackSLinked implements Stack {private SLNode top; 列是一种运算受限的线性表,允许删除的一端称队首,允许插入的一端称队尾;队列又称为先进先出线性表,FIFO表;9.队列的基本运算:1initqueueq,置空队;2queueemptyq,判队空;3queuefullq,判队满;4enqueueq,x,入队;5dequeueq,出队;6queuefrontq,返回队头元素;10.顺序队列:队列的顺序存储结构称顺序队列;设置front和rear指针表示队头和队尾元素在向量空间的位置;11.顺序队列中存在“假上溢”现象,由于入队和出队操作使头尾指针只增不减导致被删元素的空间无法利用,队尾指针超过向量空间的上界而不能入队;12.为克服“假上溢”现象,将向量空间想象为首尾相连的循环向量,存储在其中的队列称循环队列;i=i+1%queuesize13.循环队列的边界条件处理:由于无法用front==rear来判断队列的“空”和“满”;解决的方法有:1另设一个布尔变量以区别队列的空和满;2少用一个元素,在入队前测试rear在循环意义下加1是否等于front;3使用一个记数器记录元素总数;14.循环队列的基本运算:public interface Queue {队列:队列的链式存储结构称链队列,链队列由一个头指针和一个尾指针唯一确定;16.链队列的基本运算:public class QueueSLinked implements Queue {private SLNode front;private SLNode rear;private int size;public QueueSLinked {front = new SLNode;rear = front;size = 0;}etData;}}第四章串1.串:是由零个或多个字符组成的有限序列;包含字符的个数称串的长度;2.空串:长度为零的串称空串;空白串:由一个或多个空格组成的串称空白串;子串:串中任意个连续字符组成的子序列称该串的子串;主串:包含子串的串称主串;子串的首字符在主串中首次出现的位置定义为子串在主串中的位置;3.空串是任意串的子串;任意串是自身的子串;串常量在程序中只能引用但不能改变其值;串变量取值可以改变;4.串的基本运算1intstrlenchars;求串长;2charstrcpycharto,charfrom;串复制;3charstrcatcharto,charfrom;串联接;4intstrcmpchars1,chars2;串比较;5charstrchrchars,charc;字符定位;5.串的存储结构:1串的顺序存储:串的顺序存储结构称顺序串;按存储分配不同分为:1静态存储分配的顺序串:直接用定长的字符数组定义,以“\0”表示串值终结;definemaxstrsize256typedefcharseqstringmaxstrsize;seqstrings;不设终结符,用串长表示;Typedefstruct{Charchmaxstrsize;Intlength;}seqstring;以上方式的缺点是:串值空间大小是静态的,难以适应插入、链接等操作;2动态存储分配的顺序串:简单定义:typedefcharstring;复杂定义:typedefstruct{charch;intlength;}hstring;2串的链式存储:串的链式存储结构称链串;链串由头指针唯一确定;类型定义:typedefstructnode{chardata;structnodenext;}linkstrnode;typedeflinkstrnodelinkstring;linkstrings;将结点数据域存放的字符个数定义为结点的大小;结点大小不为1的链串类型定义:definenodesize80typedefstructnode{chardatanodesize;structnodenext;}linkstrnode;6.串运算的实现1顺序串上的子串定位运算;1子串定位运算又称串的模式匹配或串匹配;主串称目标串;子串称模式串; 2朴素的串匹配算法;时间复杂度为On^2;比较的字符总次数为n-m+1m; Intnaivestrmatchseqstringt,seqstringp{inti,j,k;intm=;intn=;fori=0;i<=n-m;i++{j=0;k=i;whilej<m&&k==j{j++;k++;}ifj==mreturni;}return–1;}2链串上的子串定位运算;时间复杂度为On^2;比较的字符总次数为n-m+1m;LinkstrnodelilnkstrmatchlinkstringT,linkstringP {linkstrnodeshift,t,p;shift=T;t=shift;p=P;whilet&&p{ift->data==p->data{t=t->next;p=p->next;}else{shift=shift->next;t=shift;p=P;}}ifp==NULLreturnshift;elsereturnNULL;}第五章多维数组和广义表1.多维数组:一般用顺序存储的方式表示数组;2.常用方式有:1行优先顺序,将数组元素按行向量排列;2列优先顺序,将数组元素按列向量排列;3.计算地址的函数:LOCAij=LOCAc1c2+i-c1d2-c2+1+j-c2d4.矩阵的压缩存储:为多个非零元素分配一个存储空间;对零元素不分配存储空间;1对称矩阵:在一个n阶的方阵A中,元素满足Aij=Aji0<=i,j<=n-1;称为对称矩阵;元素的总数为:nn+1/2;设:I=i或j中大的一个数;J=i或j中小的一个数;则:k=II+1/2+J;地址计算:LOCAij=LOCsak=LOCsa0+kd=LOCsa0+II+1/2+Jd2三角矩阵:以主对角线划分,三角矩阵有上三角和下三角;上三角的主对角线下元素均为常数c;下三角的主对角线上元素均为常数c;元素总数为:nn+1/2+1;以行优先顺序存放的Aij与SAk的关系:上三角阵:k=i2n-i+1/2+j-i;下三角阵:k=ii+1/2+j;3对角矩阵:所有的非零元素集中在以主对角线为中心的带状区域,相邻两侧元素均为零;|i-j|>k-1/2以行优先顺序存放的Aij与SAk的关系:k=2i+j;5.稀疏矩阵:当矩阵A中有非零元素S个,且S远小于元素总数时,称为稀疏矩阵;对其压缩的方法有顺序存储和链式存储;1三元组表:将表示稀疏矩阵的非零元素的三元组行号、列号、值按行或列优先的顺序排列得到的一个结点均是三元组的线性表,将该表的线性存储结构称为三元组表;其类型定义:definemaxsize10000typedefintdatatype;typedefstruct{inti,j;datatypev;}trituplenode;typedefstruct{trituplenodedatamaxsize;intm,n,t;}tritupletable;2带行表的三元组表:在按行优先存储的三元组表中加入一个行表记录每行的非零元素在三元组表中的起始位置;类型定义:definemaxrow100typedefstruct{tritulpenodedatamaxsize;introwtabmaxrow;intm,n,t;}rtritulpetable;6.广义表:是线性表的推广,广义表是n个元素的有限序列,元素可以是原子或一个广义表,记为LS;7.若元素是广义表称它为LS的子表;若广义表非空,则第一个元素称表头,其余元素称表尾;8.表的深度是指表展开后所含括号的层数;9.把与树对应的广义表称为纯表,它限制了表中成分的共享和递归;10.允许结点共享的表称为再入表;11.允许递归的表称为递归表;12.相互关系:线性表∈纯表∈再入表∈递归表;13.广义表的特殊运算:1取表头headLS;2取表尾tailLS;第六章树1.树:是n个结点的有限集T,T为空时称空树,否则满足:1有且仅有一个特定的称为根的结点;2其余结点可分为m个互不相交的子集,每个子集本身是一棵树,并称为根的子树;2.树的表示方法:1树形表示法;2嵌套集合表示法;3凹入表表示法;4广义表表示法;3.一个结点拥有的子树数称为该结点的度;一棵树的度是指树中结点最大的度数;4.度为零的结点称叶子或终端结点;度不为零的结点称分支结点或非终端结点5.根结点称开始结点,根结点外的分支结点称内部结点;6.树中某结点的子树根称该结点的孩子;该结点称为孩子的双亲;7.树中存在一个结点序列K1,K2,…Kn,使Ki为Ki+1的双亲,则称该结点序列为K1到Kn的路径或道路;8.树中结点K到Ks间存在一条路径,则称K是Ks的祖先,Ks是K的子孙;9.结点的层数从根算起,若根的层数为1,则其余结点层数是其双亲结点层数加1;双亲在同一层的结点互为堂兄弟;树中结点最大层数称为树的高度或深度;10.树中每个结点的各个子树从左到右有次序的称有序树,否则称无序树;11.森林是m棵互不相交的树的集合;12.二叉树:是n个结点的有限集,它或为空集,或由一个根结点及两棵互不相交的、分别称为该根的左子树和右子树的二叉树组成;13.二叉树不是树的特殊情况,这是两种不同的数据结构;它与无序树和度为2的有序树不同;14.二叉树的性质:1二叉树第i层上的结点数最多为2^i-1;2深度为k的二叉树至多有2^k-1个结点;3在任意二叉树中,叶子数为n0,度为2的结点数为n2,则n0=n2+1;15.满二叉树是一棵深度为k的且有2^k-1个结点的二叉树;16.完全二叉树是至多在最下两层上结点的度数可以小于2,并且最下层的结点集中在该层最左的位置的二叉树;17.具有N个结点的完全二叉树的深度为log2N取整加1;18.二叉树的存储结构1顺序存储结构:把一棵有n个结点的完全二叉树,从树根起自上而下、从左到右对所有结点编号,然后依次存储在一个向量b0~n中,b1~n存放结点,b0存放结点总数;各个结点编号间的关系:1i=1是根结点;i>1则双亲结点是i/2取整;2左孩子是2i,右孩子是2i+1;要小于n3i>n/2取整的结点是叶子;4奇数没有右兄弟,左兄弟是i-1;5偶数没有左兄弟,右兄弟是i+1;2链式存储结构结点的结构为:lchild|data|rchild;相应的类型说明:typedefchardata;typedefstructnode{datatypedata;structnodelchild,rchild;}bintnode;typedefbintnodebintree;19.在二叉树中所有类型为bintnode的结点和一个指向开始结点的bintree类型的头指针构成二叉树的链式存储结构称二叉链表;20.二叉链表由根指针唯一确定;在n个结点的二叉链表中有2n个指针域,其中n+1个为空;21.二叉树的遍历方式有:前序遍历、中序遍历、后序遍历;时间复杂度为On;22.线索二叉树:利用二叉链表中的n+1个空指针域存放指向某种遍历次序下的前趋和后继结点的指针,这种指针称线索;加线索的二叉链表称线索链表;相应二叉树称线索二叉树;23.线索链表结点结构:lchild|ltag|data|rtag|rchild;ltag=0,lchild是指向左孩子的指针;ltag=1,lchild是指向前趋的线索;rtag=0,rchild是指向右孩子的指针;rtag=1,rchild是指向后继的线索;24.查找p在指定次序下的前趋和后继结点;算法的时间复杂度为Oh;线索对查找前序前趋和后序后继帮助不大;25.遍历线索二叉树;时间复杂度为On;26.树、森林与二叉树的转换1树、森林与二叉树的转换1树与二叉树的转换:1}所有兄弟间连线;2}保留与长子的连线,去除其它连线;该二叉树的根结点的右子树必为空;2森林与二叉树的转换:1}将所有树转换成二叉树;2}将所有树根连线;2二叉树与树、森林的转换;是以上的逆过程;27.树的存储结构1双亲链表表示法:为每个结点设置一个parent指针,就可唯一表示任何一棵树;Data|parent2孩子链表表示法:为每个结点设置一个firstchild指针,指向孩子链表头指针,链表中存放孩子结点序号;Data|firstchild;3双亲孩子链表表示法:将以上方法结合;Data|parent|firstchild4孩子兄弟链表表示法:附加两个指向左孩子和右兄弟的指针;Leftmostchild|data|rightsibling28.树和森林的遍历:前序遍历一棵树等价于前序遍历对应二叉树;后序遍历等价于中序遍历对应二叉树;29.最优二叉树哈夫曼树:树的路径长度是从树根到每一结点的路径长度之和;将树中的结点赋予实数称为结点的权;30.结点的带权路径是该结点的路径长度与权的乘积;树的带权路径长度又称树的代价,是所有叶子的带权路径长度之和;31.带权路径长度最小的二叉树称最优二叉树哈夫曼树;32.具有2n-1个结点其中有n个叶子,并且没有度为1的分支结点的树称为严格二叉树;33.哈夫曼编码34.对字符集编码时,要求字符集中任一字符的编码都不是其它字符的编码前缀,这种编码称前缀码;35.字符出现频度与码长乘积之和称文件总长;字符出现概率与码长乘积之和称平均码长;36.使文件总长或平均码长最小的前缀码称最优前缀码37.利用哈夫曼树求最优前缀码,左为0,右为1;编码平均码长最小;没有叶子是其它叶子的祖先,不可能出现重复前缀;第七章图1.图:图G是由顶点集V和边集E组成,顶点集是有穷非空集,边集是有穷集;中每条边都有方向称有向图;有向边称弧;边的始点称弧尾;边的终点称弧头;G中每条边都没有方向的称无向图;3.顶点n与边数e的关系:无向图的边数e介于0~nn-1/2之间,有nn-1/2条边的称无向完全图;有向图的边数e介于0~nn-1之间,有nn-1条边的称有向完全图;4.无向图中顶点的度是关联与顶点的边数;有向图中顶点的度是入度与出度的和;所有图均满足:所有顶点的度数和的一半为边数;5.图GV,E,如V’是V的子集,E’是E的子集,且E’中关联的顶点均在V’中,则G’V’,E’是G的子图;6.在有向图中,从顶点出发都有路径到达其它顶点的图称有根图;7.在无向图中,任意两个顶点都有路径连通称连通图;极大连通子图称连通分量;8.在有向图中,任意顺序两个顶点都有路径连通称强连通图;极大连通子图称强连通分量;9.将图中每条边赋上权,则称带权图为网络;10.图的存储结构:1邻接矩阵表示法:邻接矩阵是表示顶点间相邻关系的矩阵;n个顶点就是n阶方阵;无向图是对称矩阵;有向图行是出度,列是入度;2邻接表表示法:对图中所有顶点,把与该顶点相邻接的顶点组成一个单链表,称为邻接表,adjvex|next,如要保存顶点信息加入data;对所有顶点设立头结点,vertex|firstedge,并顺序存储在一个向量中;vertex保存顶点信息,firstedge保存邻接表头指针;11.邻接矩阵表示法与邻接表表示法的比较:1邻接矩阵是唯一的,邻接表不唯一;2存储稀疏图用邻接表,存储稠密图用邻接矩阵;3求无向图顶点的度都容易,求有向图顶点的度邻接矩阵较方便;4判断是否是图中的边,邻接矩阵容易,邻接表最坏时间为On;5求边数e,邻接矩阵耗时为On^2,与e无关,邻接表的耗时为Oe+n;12.图的遍历:1图的深度优先遍历:类似与树的前序遍历;按访问顶点次序得到的序列称DFS序列;对邻接表表示的图深度遍历称DFS,时间复杂度为On+e;对邻接矩阵表示的图深度遍历称DFSM,时间复杂度为On^2;2图的广度优先遍历:类似与树的层次遍历;按访问顶点次序得到的序列称BFS序列;对邻接表表示的图广度遍历称BFS,时间复杂度为On+e;对邻接矩阵表示的图广度遍历称BFSM,时间复杂度为On^2;13.将没有回路的连通图定义为树称自由树;14.生成树:连通图G的一个子图若是一棵包含G中所有顶点的树,该子图称生成树;有DFS生成树和BFS生成树,BFS生成树的高度最小;非连通图生成的是森林;15.最小生成树:将权最小的生成树称最小生成树;是无向图的算法1普里姆算法:1确定顶点S、初始化候选边集T0~n-2;formvex|tovex|lenght2选权值最小的Ti与第1条记录交换;3从T1中将tovex取出替换以下记录的fromvex计算权;若权小则替换,否则不变;4选权值最小的Ti与第2条记录交换;5从T2中将tovex取出替换以下记录的fromvex计算权;若权小则替换,否则不变;6重复n-1次;初始化时间是On,选轻边的循环执行n-1-k次,调整轻边的循环执行n-2-k;算法的时间复杂度为On^2,适合于稠密图;2克鲁斯卡尔算法:1初始化确定顶点集和空边集;对原边集按权值递增顺序排序;2取第1条边,判断边的2个顶点是不同的树,加入空边集,否则删除;3重复e次;对边的排序时间是Oelog2e;初始化时间为On;执行时间是Olog2e;算法的时间复杂度为Oelog2e,适合于稀疏图;16.路径的开始顶点称源点,路径的最后一个顶点称终点;17.单源最短路径问题:已知有向带权图,求从某个源点出发到其余各个顶点的最短路径;18.单目标最短路径问题:将图中每条边反向,转换为单源最短路径问题;19.单顶点对间最短路径问题:以分别对不同顶点转换为单源最短路径问题;20.所有顶点对间最短路径问题:分别对图中不同顶点对转换为单源最短路径问题;21.迪杰斯特拉算法:1初始化顶点集Si,路径权集Di,前趋集Pi;2设置Ss为真,Ds为0;3选取Di最小的顶点加入顶点集;4计算非顶点集中顶点的路径权集;5重复3n-1次;算法的时间复杂度为On^2;22.拓扑排序:对一个有向无环图进行拓扑排序,是将图中所有顶点排成一个线性序列,满足弧尾在弧头之前;这样的线性序列称拓扑序列;1无前趋的顶点优先:总是选择入度为0的结点输出并删除该顶点的所有边;设置各个顶点入度时间是On+e,设置栈或队列的时间是On,算法时间复杂度为On+e;2无后继的顶点优先:总是选择出度为0的结点输出并删除该顶点的所有边;设置各个顶点出度时间是On+e,设置栈或队列的时间是On,算法时间复杂度为On+e;求得的是逆拓扑序列;第八章排序1.文件:由一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字;2.排序是将文件按关键字的递增减顺序排列;3.排序文件中有相同的关键字时,若排序后相对次序保持不变的称稳定排序,否则称不稳定排序;4.在排序过程中,文件放在内存中处理不涉及数据的内、外存交换的称内排序,反之称外排序;5.排序算法的基本操作:1比较关键字的大小;2改变指向记录的指针或移动记录本身;6.评价排序方法的标准:1执行时间;2所需辅助空间,辅助空间为O1称就地排序;另要注意算法的复杂程度;7.若关键字类型没有比较运算符,可事先定义宏或函数表示比较运算;8.插入排序1直接插入排序算法中引入监视哨R0的作用是:1保存Ri的副本;2简化边界条件,防止循环下标越界;关键字比较次数最大为n+2n-1/2;记录移动次数最大为n+4n-1/2;算法的最好时间是On;最坏时间是On^2;平均时间是On^2;是一种就地的稳定的排序;2希尔排序实现过程:是将直接插入排序的间隔变为d;d的取值要注意:1最后一次必为1;2避免d 值互为倍数;关键字比较次数最大为n^;记录移动次数最大为^;算法的平均时间是On^;是一种就地的不稳定的排序;9.交换排序1冒泡排序实现过程:从下到上相邻两个比较,按小在上原则扫描一次,确定最小值,重复n-1次;关键字比较次数最小为n-1、最大为nn-1/2;记录移动次数最小为0,最大为3nn-1/2;算法的最好时间是On;最坏时间是On^2;平均时间是On^2;是一种就地的稳定的排序;2快速排序实现过程:将第一个值作为基准,设置i,j指针交替从两头与基准比较,有交换后,交换j,i;i=j时确定基准,并以其为界限将序列分为两段;重复以上步骤;关键字比较次数最好为nlog2n+nC1、最坏为nn-1/2;算法的最好时间是Onlog2n;最坏时间是On^2;平均时间是Onlog2n;辅助空间为Olog2n;是一种不稳定排序;10.选择排序1直接选择排序实现过程:选择序列中最小的插入第一位,在剩余的序列中重复上一步,共重复n-1次;关键字比较次数为nn-1/2;记录移动次数最小为0,最大为3n-1;算法的最好时间是On^2;最坏时间是On^2;平均时间是On^2;是一种就地的不稳定的排序;2堆排序。
数据结构大纲知识点一、绪论。
1. 数据结构的基本概念。
- 数据、数据元素、数据项。
- 数据结构的定义(逻辑结构、存储结构、数据的运算)- 数据结构的三要素之间的关系。
2. 算法的基本概念。
- 算法的定义、特性(有穷性、确定性、可行性、输入、输出)- 算法的评价指标(时间复杂度、空间复杂度的计算方法)二、线性表。
1. 线性表的定义和基本操作。
- 线性表的逻辑结构特点(线性关系)- 线性表的基本操作(如初始化、插入、删除、查找等操作的定义)2. 顺序存储结构。
- 顺序表的定义(用数组实现线性表)- 顺序表的基本操作实现(插入、删除操作的时间复杂度分析)- 顺序表的优缺点。
3. 链式存储结构。
- 单链表的定义(结点结构,头指针、头结点的概念)- 单链表的基本操作实现(建立单链表、插入、删除、查找等操作的代码实现及时间复杂度分析)- 循环链表(与单链表的区别,操作特点)- 双向链表(结点结构,基本操作的实现及特点)三、栈和队列。
1. 栈。
- 栈的定义(后进先出的线性表)- 栈的基本操作(入栈、出栈、取栈顶元素等操作的定义)- 顺序栈的实现(存储结构,基本操作的代码实现)- 链栈的实现(与单链表的联系,基本操作的实现)- 栈的应用(表达式求值、函数调用栈等)2. 队列。
- 队列的定义(先进先出的线性表)- 队列的基本操作(入队、出队、取队头元素等操作的定义)- 顺序队列(存在的问题,如假溢出)- 循环队列的实现(存储结构,基本操作的代码实现,队空和队满的判断条件)- 链队列的实现(结点结构,基本操作的实现)- 队列的应用(如操作系统中的进程调度等)四、串。
1. 串的定义和基本操作。
- 串的概念(字符序列)- 串的基本操作(如连接、求子串、比较等操作的定义)2. 串的存储结构。
- 顺序存储结构(定长顺序存储和堆分配存储)- 链式存储结构(块链存储结构)3. 串的模式匹配算法。
- 简单的模式匹配算法(Brute - Force算法)的实现及时间复杂度分析。
数据结构复习笔记一、介绍数据结构是计算机科学中的重要概念,它研究的是数据的组织、存储和管理方式。
在计算机程序设计中,选择正确的数据结构可以对程序的性能和效率产生重要影响。
本文将对常见的数据结构进行复习和总结。
二、数组数组是一种线性数据结构,它由相同类型的元素组成,通过索引进行访问。
数组的优点是可以快速访问任意位置的元素,缺点是插入和删除操作的效率较低。
数组在内存中分配连续的空间,并且可以通过索引计算出元素的地址,因此访问效率较高。
三、链表链表也是一种线性数据结构,它由节点组成,每个节点包含一个元素和指向下一个节点的指针。
链表的优点是插入和删除操作的效率较高,缺点是访问任意位置的元素需要从头节点开始遍历。
链表在内存中分配离散的空间,节点通过指针连接,因此插入和删除操作的效率较高。
四、栈栈是一种先进后出(LIFO)的数据结构,它只允许在一端进行插入和删除操作。
栈的应用广泛,例如函数调用、表达式求值和括号匹配等。
栈可以使用数组或链表来实现,其中数组实现的栈称为顺序栈,链表实现的栈称为链式栈。
五、队列队列是一种先进先出(FIFO)的数据结构,它允许在一端进行插入操作,另一端进行删除操作。
队列的应用包括任务调度、消息传递和缓冲区管理等。
队列可以使用数组或链表来实现,其中数组实现的队列称为顺序队列,链表实现的队列称为链式队列。
六、树树是一种非线性的数据结构,它由节点和边组成。
树的特点是有且仅有一个根节点,每个节点可以有零或多个子节点。
树的应用广泛,例如文件系统、数据库索引和路由算法等。
常见的树结构包括二叉树、平衡树和二叉搜索树等。
七、图图是一种非线性的数据结构,它由节点和边组成。
图的特点是节点之间可以有多个连接,连接可以是有向或无向。
图的应用包括社交网络、路径规划和网络拓扑等。
常见的图算法包括深度优先搜索(DFS)和广度优先搜索(BFS)等。
八、哈希表哈希表是一种基于哈希函数的数据结构,它可以高效地插入、删除和查找元素。
数据结构考研笔记整理(全)一、第二章线性表●考纲内容●一、线性表的基本概念●线性表是具有相同数据结构类型的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.数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
(有时候也叫做属性。
)4.数据结构:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
(1)数据的逻辑结构:数据的逻辑结构是指数据元素之间存在的固有逻辑关系,常称为数据结构。
数据的逻辑结构是从数据元素之间存在的逻辑关系上描述数据与数据的存储无关,是独立于计算机的。
依据数据元素之间的关系,可以把数据的逻辑结构分成以下几种:1.集合:数据中的数据元素之间除了“同属于一个集合“的关系以外,没有其他关系。
2.线性结构:结构中的数据元素之间存在“一对一“的关系。
若结构为非空集合,则除了第一个元素之外,和最后一个元素之外,其他每个元素都只有一个直接前驱和一个直接后继。
3.树形结构:结构中的数据元素之间存在“一对多“的关系。
若数据为非空集,则除了第一个元素(根)之外,其它每个数据元素都只有一个直接前驱,以及多个或零个直接后继。
4.图状结构:结构中的数据元素存在“多对多”的关系。
若结构为非空集,折每个数据可有多个(或零个)直接后继。
(2)数据的存储结构:数据元素及其关系在计算机内的表示称为数据的存储结构。
想要计算机处理数据,就必须把数据的逻辑结构映射为数据的存储结构。
逻辑结构可以映射为以下两种存储结构:1.顺序存储结构:把逻辑上相邻的数据元素存储在物理位置也相邻的存储单元中,借助元素在存储器中的相对位置来表示数据之间的逻辑关系。
2.链式存储结构:借助指针表达数据元素之间的逻辑关系。
不要求逻辑上相邻的数据元素物理位置上也相邻。
数据结构复习重点归纳笔记[清华严蔚敏版]数据结构复习重点归纳笔记[清华严蔚敏版]数据结构复习重点归纳[适于清华严版教材]一、数据结构的章节结构及重点构成数据结构学科的章节划分基本上为:概论,线性表,栈和队列,串,多维数组和广义表,树和二叉树,图,查找,内排,外排,文件,动态存储分配。
对于绝大多数的学校而言,“外排,文件,动态存储分配”三章基本上是不考的,在大多数高校的计算机本科教学过程中,这三章也是基本上不作讲授的。
所以,大家在这三章上可以不必花费过多的精力,只要知道基本的概念即可。
但是,对于报考名校特别是该校又有在试卷中对这三章进行过考核的历史,那么这部分朋友就要留意这三章了。
按照以上我们给出的章节以及对后三章的介绍,数据结构的章节比重大致为:概论:内容很少,概念简单,分数大多只有几分,有的学校甚至不考。
线性表:基础章节,必考内容之一。
考题多数为基本概念题,名校考题中,鲜有大型算法设计题。
如果有,也是与其它章节内容相结合。
栈和队列:基础章节,容易出基本概念题,必考内容之一。
而栈常与其它章节配合考查,也常与递归等概念相联系进行考查。
串:基础章节,概念较为简单。
专门针对于此章的大型算法设计题很少,较常见的是根据KMP 进行算法分析。
多维数组及广义表:基础章节,基于数组的算法题也是常见的,分数比例波动较大,是出题的“可选单元”或“侯补单元”。
一般如果要出题,多数不会作为大题出。
数组常与“查找,排序”等章节结合来作为大题考查。
树和二叉树:重点难点章节,各校必考章节。
各校在此章出题的不同之处在于,是否在本章中出一到两道大的算法设计题。
通过对多所学校的试卷分析,绝大多数学校在本章都曾有过出大型算法设计题的历史。
图:重点难点章节,名校尤爱考。
如果作为重点来考,则多出现于分析与设计题型当中,可与树一章共同构成算法设计大题的题型设计。
查找:重点难点章节,概念较多,联系较为紧密,容易混淆。
出题时可以作为分析型题目给出,在基本概念型题目中也较为常见。
数据结构知识点归纳数据结构知识点归纳1.线性数据结构1.1 数组1.1.1 基本操作1.1.2 时间复杂度1.1.3 动态数组1.1.4 多维数组1.2 链表1.2.1 单向链表1.2.2 双向链表1.2.3 循环链表1.2.4 基本操作1.2.5 时间复杂度1.3 栈1.3.1 基本操作1.3.2 应用场景1.4 队列1.4.1 基本操作1.4.2 队列的实现方式 1.4.3 阻塞队列1.4.4 并发队列2.树形数据结构2.1 二叉树2.1.1 基本概念2.1.2 二叉树的遍历2.1.3 二叉树的构建方式 2.2 堆2.2.1 最大堆和最小堆 2.2.2 堆的实现方式2.2.3 堆的应用场景2.3 平衡二叉树2.3.1 AVL树2.3.2 红黑树2.4 B树和B+树2.4.1 基本概念2.4.2 B树的插入和删除操作2.4.3 B+树的优势和应用场景3.图形数据结构3.1 无向图和有向图3.2 图的遍历3.2.1 深度优先搜索(DFS) 3.2.2 广度优先搜索(BFS) 3.3 最短路径算法3.3.1 Dijkstra算法3.3.2 Floyd-Warshall算法 3.4 最小树算法3.4.1 Prim算法3.4.2 Kruskal算法4.散列数据结构4.1 散列表4.1.1 基本概念4.1.2 散列函数的设计与应用 4.1.3 碰撞解决方法4.2 布隆过滤器4.2.1 基本原理4.2.2 应用场景4.3 哈希算法4.3.1 基本概念4.3.2 常见的哈希算法5.高级数据结构5.1 树状数组(BIT)5.1.1 基本原理5.1.2 树状数组的应用5.2 线段树5.2.1 基本原理5.2.2 线段树的构建和查询操作5.3 Trie树5.3.1 基本概念5.3.2 Trie树的构建与查询5.4 并查集5.4.1 基本操作5.4.2 应用场景6.本文档涉及附件。
7.本文所涉及的法律名词及注释:7.1 数据结构:指在计算机科学中,用于存储和组织数据的方式和方式的方法。
数据结构知识点笔记一、数据结构的概念数据结构是计算机科学中一门重要的学科,它研究如何组织和存储数据,以便高效地访问和操作。
数据结构可以分为物理结构和逻辑结构两个层次。
物理结构指数据在计算机内存中的存储方式,而逻辑结构则指数据之间的逻辑关系。
二、常用的数据结构1. 数组(Array)数组是最基本的数据结构之一,它以连续的存储空间来保存相同类型的数据。
数组的特点是可以通过下标快速访问元素,但插入和删除操作较慢。
2. 链表(Linked List)链表是一种动态数据结构,它通过指针将一组节点串联起来。
链表的特点是插入和删除操作效率高,但访问元素需要遍历整个链表。
3. 栈(Stack)栈是一种后进先出(LIFO)的数据结构,只能在栈顶进行插入和删除操作。
栈主要用于函数调用和表达式求值等场景。
4. 队列(Queue)队列是一种先进先出(FIFO)的数据结构,只能在队列的一端进行插入操作,在另一端进行删除操作。
队列主要用于任务调度和缓冲区管理等场景。
5. 树(Tree)树是一种非线性的数据结构,由父节点和子节点组成。
树常用于组织和管理具有层级关系的数据,如文件系统和数据库索引等。
6. 图(Graph)图是一种由节点和边组成的数据结构,节点表示数据,边表示节点之间的关系。
图广泛应用于网络分析和路径搜索等领域。
三、常见的数据结构操作1. 插入(Insert)插入操作将新的数据元素加入到数据结构中的特定位置。
不同的数据结构插入操作的复杂度各不相同,需要根据具体情况选择合适的数据结构。
2. 删除(Delete)删除操作将指定的数据元素从数据结构中移除。
和插入操作一样,删除操作的复杂度也依赖于具体的数据结构。
3. 查找(Search)查找操作用于在数据结构中寻找指定值的元素。
不同的数据结构采用不同的查找算法,如线性查找、二分查找和哈希查找等。
4. 排序(Sort)排序操作将数据结构中的元素按特定规则重新排列。
排序算法可以分为比较排序和非比较排序两种类型,如冒泡排序、快速排序和归并排序等。
数据结构备考笔记
1、基本概念和术语
数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素:是数据的基本单位,在计算机程序中通常作为一个整体运行考虑和处理。
数据项:是数据的不可分割的最小单位。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
数据结构:是相互之间存在一种或多种特定数据元素的结合。
结构:数据元素相互之间的关系。
四中基本结构:
✧集合
✧线性结构数据元素之间存在一对一的关系
✧树形结构数据元素之间存在一对多的关系
✧图状结构或网状结构数据元素之间存在多对多的关系
抽象数据类型可用以下三元组表示:
ADT=(D,S,P)
其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。
算法:算法是对特定问题求解步骤的一种描述,他是指令的有限序列,其中每一条指令表示一个或多个操作。
算法的五个重要特性:
有穷性
确定性
可行性
输入
输出
算法的设计要求:
正确性
可读性
健壮性
效率与低存储量需求
渐进时间复杂度,简称时间复杂度
频度:指语句重复执行的次数。
408数据结构重点难点笔记一、线性表。
1. 顺序表。
- 重点。
- 顺序表的定义和存储结构,理解数组如何表示顺序表。
例如,在C语言中,可以用一个结构体来定义顺序表,结构体中包含一个数组和表示当前表长的变量。
- 顺序表的基本操作实现,如插入、删除、查找操作。
插入操作需要注意移动元素的顺序,平均时间复杂度为O(n);删除操作类似,也要移动元素;查找操作根据不同的查找算法(如顺序查找时间复杂度为O(n),如果表是有序的可以采用二分查找,时间复杂度为O(log n))。
- 难点。
- 顺序表的动态分配内存,涉及到内存管理的知识。
当顺序表空间不足时,如何重新分配更大的空间并将原数据正确地复制到新空间中。
例如,采用倍增策略重新分配内存时,要确保数据的完整性和操作的正确性。
- 顺序表操作中的边界条件处理。
例如,在插入操作时,插入位置的合法性检查(是否在有效范围内),以及表满时的处理;在删除操作时,删除位置不存在的情况处理等。
2. 链表。
- 重点。
- 单链表、双链表和循环链表的结构定义。
单链表每个节点包含数据域和指向下一个节点的指针域;双链表节点有两个指针域,分别指向前一个和后一个节点;循环链表的尾节点指向头节点(单循环链表)或尾节点的下一个节点指向头节点(双循环链表)。
- 链表的基本操作,如创建链表(头插法、尾插法)、插入节点、删除节点、查找节点等。
链表插入和删除操作的时间复杂度为O(1)(如果已知操作位置的指针),但查找操作时间复杂度为O(n)。
- 难点。
- 链表操作中的指针操作。
例如,在双链表中插入节点时,需要正确修改四个指针(前驱节点的后继指针、后继节点的前驱指针、新节点的前驱和后继指针),任何一个指针修改错误都可能导致链表结构破坏。
- 带环链表的相关问题,如判断链表是否带环(可以使用快慢指针法,快指针每次移动两步,慢指针每次移动一步,如果存在环,快慢指针最终会相遇),以及带环链表的环入口点查找等。
二、栈和队列。
《数据结构与算法》复习第1部分:1. 概念:数据结构,存储结构,逻辑结构注:磁盘文件管理系统是树状结构。
1.1基本概念(1)数据:指所有能够输入到计算机中并被计算机程序处理的符号的总称(图像声音都可以通过编码归于数据的范围),范围大(2)数据项:数据的不可分割的最小单元(3)数据元素:是数据的基本单位,有若干数据项组成,通常作为一个整体考虑 (4)数据对象:性质相同的数据元素的集合,是数据的一个子集。
例子:其中,A 表为成绩表,B 表为学生信息表,这两张表就是数据;单独的一张表就称为数据对象,即A 和B 表都是一个数据对象;每张表中的每一行就称为数据元素;姓名,性别,身高,科目,分数就称为数据项 1.2数据结构 定义:相互之间存在一种或多种特定关系的数据元素的集合,这种关系包括三方面的内容,即数据逻辑结构,数据存储结构,数据的操作。
2. 数据元素是组成数据的基本单位3. 算法,算法分析,算法特性,时间复杂度3.1算法:描述求解问题方法操作步骤的集合。
(不是所有的程序都是算法,要满足五个特性)3.2时间复杂度3.2.1定义:在算法分析中,一般用算法中的语句的执行次数来度量算法的时间效率,时间效率也就是时间复杂度。
3.2.2计算方法:对于问题规模为n 的某个函数f(n),算法时间复杂度记为T(n),存在一个正常数c ,使cf(n)>T(n)恒成立,则T(n)=Of(n),称Of(n)为时间复杂度。
时间复杂度的大O 表示法:保留最高次数项,令最高次数项的系数为1。
例如O(8)->O(1),O(2n^3+2n^2)->O(n^3),O(n*log2 n)第2部分1. 线性表的概念,特点,存储结构1.1.1线性表的概念:线性表是最简单,最常见,最基本的一种线性结构(数据的逻辑结构的一种),元素之间为线性关系,即除了第一个和最后一个元素之外,所有的元素都有前驱和后继元素,同一个线性表中的数据类型相同。
第一部分:数据结构基础概念1. 数据结构的介绍数据结构是计算机科学中的重要概念,它主要研究数据的存储和组织方式。
在计算机程序设计中,数据结构的选择直接影响了程序的性能和效率。
对数据结构的理解和掌握对于计算机专业的学生来说至关重要。
2. 数据的逻辑结构和物理结构数据的逻辑结构指的是数据元素之间的逻辑关系,而数据的物理结构则指的是数据在计算机中的存储方式。
掌握数据的逻辑结构和物理结构对于设计高效的程序至关重要。
3. 抽象数据类型(ADT)抽象数据类型是指一个数学模型以及定义在此模型上的一组操作。
它将数据的逻辑结构和操作封装起来,提供给用户一个抽象的数据视图,用户不需要关心数据的物理结构和具体实现方式。
常见的抽象数据类型包括栈、队列、链表、树等。
第二部分:线性表4. 线性表的概念线性表是最简单、最常用的一种数据结构,它包括线性表的定义、性质和操作。
5. 线性表的顺序存储结构线性表的顺序存储结构是将数据集中存储在一片连续的存储空间中。
这种方式的优点是存取速度快,但缺点是空间利用不灵活、插入和删除操作不方便。
6. 线性表的链式存储结构线性表的链式存储结构是通过指针将数据元素存储在一些列不连续的存储空间中。
这种方式的优点是空间利用灵活、插入和删除操作方便,但缺点是存取速度慢。
第三部分:栈和队列7. 栈的定义和特点栈是一种特殊的线性表,它只允许在表的一端进行插入和删除操作。
栈的特点是后进先出(LIFO),操作简单高效。
8. 栈的顺序存储结构和链式存储结构栈可以通过数组实现顺序存储结构,也可以通过链表实现链式存储结构。
两种方式各有优缺点,可以根据具体情况选择。
9. 队列的定义和特点队列也是一种特殊的线性表,它允许在表的一端进行插入操作,另一端进行删除操作。
队列的特点是先进先出(FIFO),常用于实现任务调度等场景。
第四部分:树和图10. 树的基本概念树是一种重要的非线性数据结构,它有树的定义、特点、操作等内容。
数据结构必考知识点归纳数据结构是计算机科学中的核心概念之一,它涉及到数据的组织、存储、管理和访问方式。
以下是数据结构必考知识点的归纳:1. 基本概念:- 数据结构的定义:数据结构是数据元素的集合,这些数据元素之间的关系,以及在这个集合上定义的操作。
- 数据类型:基本数据类型和抽象数据类型(ADT)。
2. 线性结构:- 数组:固定大小的元素集合,支持随机访问。
- 链表:由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。
- 单链表:每个节点指向下一个节点。
- 双链表:每个节点同时指向前一个和下一个节点。
- 循环链表:最后一个节点指向第一个节点或第一个节点指向最后一个节点。
3. 栈(Stack):- 后进先出(LIFO)的数据结构。
- 主要操作:push(入栈)、pop(出栈)、peek(查看栈顶元素)。
4. 队列(Queue):- 先进先出(FIFO)的数据结构。
- 主要操作:enqueue(入队)、dequeue(出队)、peek(查看队首元素)。
- 特殊类型:循环队列、优先队列。
5. 递归:- 递归函数:一个函数直接或间接地调用自身。
- 递归的三要素:递归终止条件、递归工作量、递归调用。
6. 树(Tree):- 树是节点的集合,其中有一个特定的节点称为根,其余节点称为子节点。
- 二叉树:每个节点最多有两个子节点的树。
- 二叉搜索树(BST):左子树的所有节点的值小于或等于节点的值,右子树的所有节点的值大于或等于节点的值。
7. 图(Graph):- 图是由顶点(节点)和边(连接顶点的线)组成的。
- 图的表示:邻接矩阵、邻接表。
- 图的遍历:深度优先搜索(DFS)、广度优先搜索(BFS)。
8. 排序算法:- 基本排序:选择排序、冒泡排序、插入排序。
- 效率较高的排序:快速排序、归并排序、堆排序。
9. 查找算法:- 线性查找:在数据结构中顺序查找。
- 二分查找:在有序数组中查找,时间复杂度为O(log n)。
数据结构复习笔记数据结构是计算机科学中非常重要的一门基础课程,它对于我们理解和解决各种计算问题有着至关重要的作用。
在学习和复习数据结构的过程中,我积累了不少的知识和心得,现在将其整理成这篇复习笔记,希望能对大家有所帮助。
首先,让我们来了解一下什么是数据结构。
简单来说,数据结构就是数据的组织方式和存储结构,以及在这些结构上进行的操作。
它可以帮助我们更高效地存储、管理和处理数据,提高程序的运行效率和性能。
常见的数据结构有很多种,比如数组、链表、栈、队列、树和图等。
数组是一种最简单也是最常用的数据结构。
它是一组具有相同数据类型的元素的有序集合,通过下标可以快速访问其中的元素。
但是,数组的大小在创建时就已经确定,并且插入和删除元素的操作比较复杂,因为可能需要移动大量的元素。
链表则是一种动态的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表的优点是插入和删除元素比较方便,只需要修改指针即可,但是访问特定位置的元素需要从头开始遍历,效率较低。
栈是一种特殊的线性表,它遵循“后进先出”的原则。
就像一个堆满盘子的桶,最后放进去的盘子最先被拿出来。
栈的操作主要有入栈和出栈,常用于函数调用、表达式求值等场景。
队列则是遵循“先进先出”原则的线性表。
就像排队买票一样,先排队的人先买到票。
队列的操作有入队和出队,常用于任务调度、消息传递等方面。
树是一种分层的数据结构,常见的有二叉树、二叉搜索树、AVL 树、红黑树等。
二叉树每个节点最多有两个子节点,二叉搜索树则是一种有序的二叉树,左子树的所有节点值小于根节点,右子树的所有节点值大于根节点。
AVL 树和红黑树是为了保持树的平衡,提高查找、插入和删除的效率。
图是由顶点和边组成的数据结构,可以分为有向图和无向图。
图的应用非常广泛,比如网络路由、社交网络分析、地图导航等。
在实际应用中,我们需要根据具体的问题选择合适的数据结构。
比如,如果需要频繁地在头部和尾部进行插入和删除操作,队列可能是一个好的选择;如果需要快速查找元素,二叉搜索树或哈希表可能更合适。
数据结构复习笔记在计算机科学领域中,数据结构是一门极其重要的基础课程。
它不仅是编程的基石,更是解决各种复杂问题的关键工具。
通过对数据结构的学习和掌握,我们能够更加高效地组织和处理数据,从而提高程序的性能和效率。
接下来,就让我为大家梳理一下数据结构的重要知识点。
首先,我们来谈谈线性表。
线性表是一种最简单的数据结构,它是由一组相同类型的数据元素组成的有限序列。
常见的线性表有顺序表和链表。
顺序表就像是一排紧密排列的座位,每个元素都按照顺序依次存放,查找方便但插入和删除操作比较麻烦,因为需要移动大量的元素。
而链表则像是一条由珠子串成的链子,每个珠子(节点)包含数据和指向下一个节点的指针,插入和删除操作很灵活,只需要修改指针即可,但查找就相对较慢。
栈和队列也是常见的数据结构。
栈是一种“后进先出”的结构,就像一个桶,最后放进去的东西最先被取出来。
比如我们在浏览器中后退网页的操作,就可以用栈来实现。
队列则是“先进先出”,如同排队买票,先到的先服务。
在操作系统中,打印任务的处理就常常使用队列。
接着说说树这种数据结构。
树是一种分层的数据结构,其中每个节点最多有两个子节点的称为二叉树。
二叉树又分为满二叉树、完全二叉树等。
二叉查找树是一种特殊的二叉树,左子树的所有节点值都小于根节点,右子树的所有节点值都大于根节点。
这使得查找、插入和删除操作的时间复杂度都可以达到 O(logn),效率很高。
平衡二叉树则是为了避免二叉查找树退化成链表而出现的,它能始终保持左右子树的高度差不超过 1,保证了较好的性能。
另外,图也是非常重要的数据结构。
图由顶点和边组成,可以分为有向图和无向图。
图的存储方式有邻接矩阵和邻接表等。
图的遍历算法有深度优先遍历和广度优先遍历。
在实际应用中,图常用于解决路径规划、网络优化等问题。
在学习数据结构的过程中,算法的设计和分析也是至关重要的。
时间复杂度和空间复杂度是衡量算法性能的重要指标。
常见的时间复杂度有 O(1)、O(n)、O(logn)、O(nlogn)、O(n^2) 等。
数据结构重点知识点第一章概论1. 数据是信息的载体。
2. 数据元素是数据的基本单位。
3. 一个数据元素可以由若干个数据项组成。
4. 数据结构指的是数据之间的相互关系,即数据的组织形式。
5. 数据结构一般包括以下三方面内容:数据的逻辑结构、数据的存储结构、数据的运算①数据元素之间的逻辑关系,也称数据的逻辑结构,数据的逻辑结构是从逻辑关系上描述数据,与数据的存储无关,是独立于计算机的。
②数据元素及其关系在计算机存储器内的表示,称为数据的存储结构。
数据的存储结构是逻辑结构用计算机语言的实现,它依赖于计算机语言。
③数据的运算,即对数据施加的操作。
最常用的检索、插入、删除、更新、排序等。
6. 数据的逻辑结构分类: 线性结构和非线性结构①线性结构:若结构是非空集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。
线性表是一个典型的线性结构。
栈、队列、串等都是线性结构。
②非线性结构:一个结点可能有多个直接前趋和直接后继。
数组、广义表、树和图等数据结构都是非线性结构。
7.数据的四种基本存储方法: 顺序存储方法、链接存储方法、索引存储方法、散列存储方法(1)顺序存储方法:该方法把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。
通常借助程序语言的数组描述。
(2)链接存储方法:该方法不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系由附加的指针字段表示。
通常借助于程序语言的指针类型描述。
(3)索引存储方法:该方法通常在储存结点信息的同时,还建立附加的索引表。
索引表由若干索引项组成。
若每个结点在索引表中都有一个索引项,则该索引表称之为稠密索引,稠密索引中索引项的地址指示结点所在的存储位置。
若一组结点在索引表中只对应一个索引项,则该索引表称为稀疏索引稀疏索引中索引项的地址指示一组结点的起始存储位置。
索引项的一般形式是:(关键字、地址)关键字是能唯一标识一个结点的那些数据项。
第一章绪论一、数据结构包括:逻辑结构、存储结构、运算(操作)三方面内容。
二、线性结构特点是一对一。
树特点是一对多图特点是多对多三、数据结构的四种存储结构:顺序存储、链式存储、索引存储、散列存储顺序存储结构和链式存储结构的区别?线性结构的顺序存储结构是一种随机存取的存储结构。
线性结构的链式存储是一种顺序存取的存储结构。
逻辑结构分类:集合线性树图,各自的特点。
或者分为线性结构和非线性结构。
四、算法的特征P13五、时间复杂度(1) i=1; k=0;while(i<n){ k=k+10*i;i++;}分析:i=1; //1k=0; //1while(i<n) //n{ k=k+10*i; //n-1i++; //n-1}由以上列出的各语句的频度,可得该程序段的时间消耗:T(n)=1+1+n+(n-1)+(n-1)=3n可表示为T(n)=O(n)六、数据项和数据元素的概念。
第二章线性表一、线性表有两种存储结构:顺序存储和链式存储,各自的优、缺点。
二、线性表的特点。
三、顺序表的插入、思想、时间复杂度o(n)、理解算法中每条语句的含义。
(1)插入的条件:不管是静态实现还是动态实现,插入的过程都是从最后一个元素往后挪动,腾位置。
静态是利用数组实现,动态是利用指针实现。
不管静态还是动态,在表中第i个位置插入,移动次数都是n-i+1。
四、顺序表的删除、思想、时间复杂度o(n)、理解算法中每条语句的含义。
(1)删除的条件:不管是静态实现还是动态实现,删除的过程都是从被删元素的下一位置向前挪动。
静态是利用数组实现,动态是利用指针实现。
不管静态还是动态,删除表中第i个元素,移动次数都是n-i。
五、顺序表的优缺点?为什么要引入链表?答:顺序表的优点是可以随机存取,缺点是前提必须开辟连续的存储空间且在第一位置做插入和删除操作时,数据的移动量特别大。
如果有一个作业是100k,但是内存最大的连续存储空间是99K,那么这个作业就不能采用顺序存储方式,必须采用链式存储方式。
数据结构复习笔记作者: 网络转载发布日期: 无数据就是指能够被计算机识别、存储和加工处理的信息的载体。
数据元素是数据的基本单位,有时一个数据元素可以由若干个数据项组成。
数据项是具有独立含义的最小标识单位。
如整数这个集合中,10这个数就可称是一个数据元素.又比如在一个数据库(关系式数据库)中,一个记录可称为一个数据元素,而这个元素中的某一字段就是一个数据项。
数据结构的定义虽然没有标准,但是它包括以下三方面内容:逻辑结构、存储结构、和对数据的操作。
这一段比较重要,我用自己的语言来说明一下,大家看看是不是这样。
比如一个表(数据库),我们就称它为一个数据结构,它由很多记录(数据元素)组成,每个元素又包括很多字段(数据项)组成。
那么这张表的逻辑结构是怎么样的呢? 我们分析数据结构都是从结点(其实也就是元素、记录、顶点,虽然在各种情况下所用名字不同,但说的是同一个东东)之间的关系来分析的,对于这个表中的任一个记录(结点),它只有一个直接前趋,只有一个直接后继(前趋后继就是前相邻后相邻的意思),整个表只有一个开始结点和一个终端结点,那我们知道了这些关系就能明白这个表的逻辑结构了。
而存储结构则是指用计算机语言如何表示结点之间的这种关系。
如上面的表,在计算机语言中描述为连续存放在一片内存单元中,还是随机的存放在内存中再用指针把它们链接在一起,这两种表示法就成为两种不同的存储结构。
(注意,在本课程里,我们只在高级语言的层次上讨论存储结构。
)第三个概念就是对数据的运算,比如一张表格,我们需要进行查找,增加,修改,删除记录等工作,而怎么样才能进行这样的操作呢? 这也就是数据的运算,它不仅仅是加减乘除这些算术运算了,在数据结构中,这些运算常常涉及算法问题。
弄清了以上三个问题,就可以弄清数据结构这个概念。
--------------------------------------------------------------------------------通常我们就将数据的逻辑结构简称为数据结构,数据的逻辑结构分两大类:线性结构和非线性结构(这两个很容易理解)数据的存储方法有四种:顺序存储方法、链接存储方法、索引存储方法和散列存储方法。
--------------------------------------------------------------------------------下一个是难点问题,就是算法的描述和分析,主要是算法复杂度的分析方法及其运用。
首先了解一下几个概念。
一个是时间复杂度,一个是渐近时间复杂度。
前者是某个算法的时间耗费,它是该算法所求解问题规模n的函数,而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。
当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n)简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。
此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。
但是我们总是考虑在最坏的情况下的时间复杂度。
以保证算法的运行时间不会比它更长。
常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)。
时间复杂度的分析计算请看书本上的例子,然后我们通过做练习加以领会和巩固。
数据结构习题一--------------------------------------------------------------------------------1.1 简述下列概念:数据、数据元素、数据类型、数据结构、逻辑结构、存储结构、线性结构、非线性结构。
◆数据:指能够被计算机识别、存储和加工处理的信息载体。
◆数据元素:就是数据的基本单位,在某些情况下,数据元素也称为元素、结点、顶点、记录。
数据元素有时可以由若干数据项组成。
◆数据类型:是一个值的集合以及在这些值上定义的一组操作的总称。
◆数据结构:指的是数据之间的相互关系,即数据的组织形式。
一般包括三个方面的内容:数据的逻辑结构、存储结构和数据的运算。
◆逻辑结构:指各数据元素之间的逻辑关系。
◆存储结构:就是数据的逻辑结构用计算机语言的实现。
◆线性结构:数据逻辑结构中的一类,它的特征是若结构为非空集,则该结构有且只有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。
线性表就是一个典型的线性结构。
◆非线性结构:数据逻辑结构中的另一大类,它的逻辑特征是一个结点可能有多个直接前趋和直接后继。
--------------------------------------------------------------------------------1.2 试举一个数据结构的例子、叙述其逻辑结构、存储结构、运算三个方面的内容。
◆例如有一张学生成绩表,记录了一个班的学生各门课的成绩。
按学生的姓名为一行记成的表。
这个表就是一个数据结构。
每个记录(有姓名,学号,成绩等字段)就是一个结点,对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前趋和直接后继(它的前面和后面均有且只有一个记录)。
这几个关系就确定了这个表的逻辑结构。
那么我们怎样把这个表中的数据存储到计算机里呢? 用高级语言如何表示各结点之间的关系呢? 是用一片连续的内存单元来存放这些记录(如用数组表示)还是随机存放各结点数据再用指针进行链接呢? 这就是存储结构的问题,我们都是从高级语言的层次来讨论这个问题的。
(所以各位赶快学C语言吧)。
最后,我们有了这个表(数据结构),肯定要用它,那么就是要对这张表中的记录进行查询,修改,删除等操作,对这个表可以进行哪些操作以及如何实现这些操作就是数据的运算问题了。
--------------------------------------------------------------------------------1.3 常用的存储表示方法有哪几种?常用的存储表示方法有四种:◆顺序存储方法:它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。
由此得到的存储表示称为顺序存储结构。
◆链接存储方法:它不要求逻辑上相邻的结点在物理位置上亦相邻,结点间的逻辑关系是由附加的指针字段表示的。
由此得到的存储表示称为链式存储结构。
◆索引存储方法:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。
◆散列存储方法:就是根据结点的关键字直接计算出该结点的存储地址。
--------------------------------------------------------------------------------1.4 设三个函数f,g,h分别为f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^1.5+5000nlgn 请判断下列关系是否成立:(1) f(n)=O(g(n))(2) g(n)=O(f(n))(3) h(n)=O(n^1.5)(4) h(n)=O(nlgn)◆(1)成立。
◇这里我们复习一下渐近时间复杂度的表示法T(n)=O(f(n)),这里的"O"是数学符号,它的严格定义是"若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n)=O(f(n))表示存在正的常数C和n0 ,使得当n≥n0时都满足0≤T(n)≤C·f(n)。
"用容易理解的话说就是这两个函数当整型自变量n趋向于无穷大时,两者的比值是一个不等于0的常数。
这么一来,就好计算了吧。
第(1)题中两个函数的最高次项都是n^3,因此当n→∞时,两个函数的比值是一个常数,所以这个关系式是成立的。
◆(2)成立。
◆(3)成立。
◆(4)不成立。
--------------------------------------------------------------------------------1.5 设有两个算法在同一机器上运行,其执行时间分别为100n^2和2^n,要使前者快于后者,n至少要多大?◆15◇最简单最笨的办法就是拿自然数去代呗。
假定n取为10,则前者的值是10000,后者的值是1024,小于前者,那我们就加个5,用15代入得前者为22500,后者为32768,已经比前者大但相差不多,那我们再减个1,用14代入得,前者为19600,后者为16384,又比前者小了,所以结果得出来就是n至少要是15.--------------------------------------------------------------------------------1.6 设n为正整数,利用大"O"记号,将下列程序段的执行时间表示为n的函数。
1.6 设n为正整数,利用大"O"记号,将下列程序段的执行时间表示为n的函数。
(1) i=1; k=0while(i { k=k+10*i;i++;} ◆T(n)=n-1∴T(n)=O(n)◇这个函数是按线性阶递增的(2) i=0; k=0;do{k=k+10*i; i++;}while(i ◆T(n)=n∴T(n)=O(n)◇这也是线性阶递增的(3) i=1; j=0;while(i+j<=n){if (i else i++;} ◆T(n)=n/2∴T(n)=O(n)◇虽然时间函数是n/2,但其数量级仍是按线性阶递增的。
(4)x=n; // n>1while (x>=(y+1)*(y+1))y++; ◆T(n)=n1/2∴T(n)=O(n1/2)◇最坏的情况是y=0,那么循环的次数是n1/2次,这是一个按平方根阶递增的函数。
(5) x=91; y=100;while(y>0)if(x>100){x=x-10;y--;}else x++; ◆T(n)=O(1)◇这个程序看起来有点吓人,总共循环运行了1000次,但是我们看到n没有? 没。
这段程序的运行是和n无关的,就算它再循环一万年,我们也不管他,只是一个常数阶的函数。
--------------------------------------------------------------------------------1.7 算法的时间复杂度仅与问题的规模相关吗?◆No,事实上,算法的时间复杂度不仅与问题的规模相关,还与输入实例中的元素取值等相关,但在最坏的情况下,其时间复杂度就是只与求解问题的规模相关的。