(完整版)数据结构知识点总结
- 格式:doc
- 大小:109.01 KB
- 文档页数:8
数据结构知识总结数据结构是计算机科学中最基本的概念之一,它研究了如何组织和管理数据,以便有效地使用和操作。
数据结构是计算机程序设计中的核心,对于解决实际问题具有重要的意义。
下面是我对数据结构的知识总结,希望对你有所帮助。
一、数据结构的定义和分类数据结构是指一种特定的组织形式,用于存储和操作数据的方法。
它可以分为线性结构和非线性结构。
线性结构包括数组、链表、栈和队列等,而非线性结构包括树和图等。
二、数组数组是最简单的数据结构之一,它将相同类型的元素按顺序存放在一段连续的内存空间中。
数组的特点是可以随机访问,但插入和删除元素的效率较低。
三、链表链表是一种基本的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
链表的特点是插入和删除元素的效率较高,但随机访问的效率较低。
四、栈栈是一种特殊的线性结构,它的插入和删除操作只能在栈的一端进行。
栈的特点是先进后出,即最后插入的元素最先出栈。
五、队列队列是一种特殊的线性结构,它的插入操作只能在队尾进行,删除操作只能在队首进行。
队列的特点是先进先出,即最先插入的元素最先出队。
六、树树是一种非线性的数据结构,它由节点和边组成。
节点之间的关系是层次结构,树的最上面的节点称为根节点,没有子节点的节点称为叶子节点。
七、图图是一种非线性的数据结构,它由节点和边组成。
图的节点可以具有任意的关系,可以是有向的或无向的。
图可以用于表示网络、地图等各种实际问题。
八、排序算法排序算法是对数据进行排序的一种方法。
常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序和归并排序等。
每种排序算法都有自己的特点和适用场景。
九、查找算法查找算法是在数据集中查找特定元素的一种方法。
常见的查找算法包括线性查找、二分查找和哈希查找等。
不同的查找算法对于不同的数据集有不同的效率。
十、算法复杂度分析算法复杂度分析是研究算法效率的一种方法。
通常通过时间复杂度和空间复杂度来表示算法的效率。
数据结构重点总结数据结构是计算机科学中非常重要的概念,它用于组织和存储数据,以便能够有效地操作和管理。
数据结构的选择与效率直接相关,对于编写高效的算法来说至关重要。
本文将对数据结构的重点进行总结,包括数组、链表、栈、队列、树、图和哈希表等。
首先,数组是最简单和基础的数据结构之一。
它由固定大小的元素组成,可以通过索引访问元素。
数组的读写操作速度很快,但插入和删除操作可能会很慢,因为需要移动其他元素。
其次,链表是一种动态数据结构,由节点组成。
每个节点包含数据和指向下一个节点的指针。
链表支持快速插入和删除操作,但访问节点需要依次遍历链表,效率较低。
栈是一种先进后出(LIFO)的数据结构,可以使用数组或链表实现。
栈只允许在栈顶进行插入和删除操作,常用于表达式求值、函数调用和计算机内存管理等。
队列是一种先进先出(FIFO)的数据结构,也可以使用数组或链表实现。
队列允许在队尾插入元素,在队头删除元素,常用于排队系统、任务调度和广度优先搜索等。
树是一种层次结构的数据结构,由节点和指向其他节点的边组成。
每个节点可以有多个子节点,但只有一个父节点。
树有很多变种,如二叉树、平衡二叉树和红黑树等。
树常用于文件系统、数据库索引和无线通信等领域。
图是一种非常灵活的数据结构,用于表示节点之间的关系。
图由节点和边组成,可以有多个节点和多个边。
图可以有有向边和无向边,可以是带权图或无权图。
常用的图算法有深度优先搜索和广度优先搜索等。
哈希表是一种通过计算关键字的哈希函数将数据存储在数组中的数据结构。
哈希表支持快速的插入、删除和查找操作,但可能会出现哈希冲突的情况,需要解决冲突。
哈希表常用于数据库索引、缓存和字典等。
除了上述的常用数据结构外,还有很多其他的数据结构,如堆、图的邻接矩阵和邻接表、并查集和字典树等。
不同的应用场景需要选择适合的数据结构,以达到更高的效率。
在实际应用中,数据结构的选择与算法密切相关。
常用的算法包括查找算法、排序算法和图算法等。
数据结构知识点概括第一章概论数据就是指能够被计算机识别、存储和加工处理的信息的载体..数据元素是数据的基本单位;可以由若干个数据项组成..数据项是具有独立含义的最小标识单位..数据结构的定义:·逻辑结构:从逻辑结构上描述数据;独立于计算机..·线性结构:一对一关系..·线性结构:多对多关系..·存储结构:是逻辑结构用计算机语言的实现..·顺序存储结构:如数组..·链式存储结构:如链表..·索引存储结构:·稠密索引:每个结点都有索引项..·稀疏索引:每组结点都有索引项..·散列存储结构:如散列表..·数据运算..·对数据的操作..定义在逻辑结构上;每种逻辑结构都有一个运算集合..·常用的有:检索、插入、删除、更新、排序..数据类型:是一个值的集合以及在这些值上定义的一组操作的总称..·结构类型:由用户借助于描述机制定义;是导出类型..抽象数据类型ADT:·是抽象数据的组织和与之的操作..相当于在概念层上描述问题..·优点是将数据和操作封装在一起实现了信息隐藏..程序设计的实质是对实际问题选择一种好的数据结构;设计一个好的算法..算法取决于数据结构..算法是一个良定义的计算过程;以一个或多个值输入;并以一个或多个值输出..评价算法的好坏的因素:·算法是正确的;·执行算法的时间;·执行算法的存储空间主要是辅助存储空间;·算法易于理解、编码、调试..时间复杂度:是某个算法的时间耗费;它是该算法所求解问题规模n的函数..渐近时间复杂度:是指当问题规模趋向无穷大时;该算法时间复杂度的数量级..评价一个算法的时间性能时;主要标准就是算法的渐近时间复杂度..算法中语句的频度不仅与问题规模有关;还与输入实例中各元素的取值相关..时间复杂度按数量级递增排列依次为:常数阶O1、对数阶Olog2n、线性阶On、线性对数阶Onlog2n、平方阶On^2、立方阶On^3、……k次方阶On^k、指数阶O2^n..空间复杂度:是某个算法的空间耗费;它是该算法所求解问题规模n的函数..算法的时间复杂度和空间复杂度合称算法复杂度..第二章线性表线性表是由n≥0个数据元素组成的有限序列..n=0是空表;非空表;只能有一个开始结点;有且只能有一个终端结点..线性表上定义的基本运算:·构造空表:InitlistL·求表长:ListlengthL·取结点:GetNodeL;i·查找:LocateNodeL;x·插入:InsertListL;x;i·删除:DeleteL;i顺序表是按线性表的逻辑结构次序依次存放在一组地址连续的存储单元中..在存储单元中的各元素的物理位置和逻辑结构中各结点相邻关系是一致的..地址计算:LOCai=LOCa1+i-1d;首地址为1在顺序表中实现的基本运算:·插入:平均移动结点次数为n/2;平均时间复杂度均为On..·删除:平均移动结点次数为n-1/2;平均时间复杂度均为On..线性表的链式存储结构中结点的逻辑次序和物理次序不一定相同;为了能正确表示结点间的逻辑关系;在存储每个结点值的同时;还存储了其后继结点的地址信息即指针或链..这两部分信息组成链表中的结点结构..一个单链表由头指针的名字来命名..单链表运算:·建立单链表·头插法:s->next=head;head=s;生成的顺序与输入顺序相反..平均时间复杂度均为On..·尾插法:head=rear=null;ifhead=null head=s;else r->next=s;r=s;平均时间复杂度均为On·加头结点的算法:对开始结点的操作无需特殊处理;统一了空表和非空表..·查找·按序号:与查找位置有关;平均时间复杂度均为On..·按值:与输入实例有关;平均时间复杂度均为On..·插入运算:p=GetNodeL;i-1;s->next=p->next;p->next=s;平均时间复杂度均为On·删除运算:p=GetNodeL;i-1;r=p->next;p->next=r->next;freer;平均时间复杂度均为On单循环链表是一种首尾相接的单链表;终端结点的指针域指向开始结点或头结点..链表终止条件是以指针等于头指针或尾指针..采用单循环链表在实用中多采用尾指针表示单循环链表..优点是查找头指针和尾指针的时间都是O1;不用遍历整个链表..双链表就是双向链表;就是在单链表的每个结点里再增加一个指向其直接前趋的指针域prior;形成两条不同方向的链..由头指针head惟一确定..双链表也可以头尾相链接构成双向循环链表..双链表上的插入和删除时间复杂度均为O 1..顺序表和链表的比较:·基于空间:·顺序表的存储空间是静态分配;存储密度为1;适于线性表事先确定其大小时采用..·链表的存储空间是动态分配;存储密度<1;适于线性表长度变化大时采用..·基于时间:·顺序表是随机存储结构;当线性表的操作主要是查找时;宜采用..·以插入和删除操作为主的线性表宜采用链表做存储结构..·若插入和删除主要发生在表的首尾两端;则宜采用尾指针表示的单循环链表..第三章栈和队列栈Stack是仅限制在表的一端进行插入和删除运算的线性表;称插入、删除这一端为栈顶;另一端称为栈底..表中无元素时为空栈..栈的修改是按后进先出的原则进行的;我们又称栈为LIFO表Last In First Out..通常栈有顺序栈和链栈两种存储结构..栈的基本运算有六种:·构造空栈:InitStackS·判栈空: StackEmptyS·判栈满: StackFullS·进栈: PushS;x·退栈: PopS·取栈顶元素:StackTopS在顺序栈中有“上溢”和“下溢”的现象.. ·“上溢”是栈顶指针指出栈的外面是出错状态..·“下溢”可以表示栈为空栈;因此用来作为控制转移的条件..顺序栈中的基本操作有六种:·构造空栈·判栈空·判栈满·进栈·退栈·取栈顶元素链栈则没有上溢的限制;因此进栈不要判栈满..链栈不需要在头部附加头结点;只要有链表的头指针就可以了..链栈中的基本操作有五种:·构造空栈·判栈空·进栈·退栈·取栈顶元素队列Queue是一种运算受限的线性表;插入在表的一端进行;而删除在表的另一端进行;允许删除的一端称为队头front;允许插入的一端称为队尾rear ;队列的操作原则是先进先出的;又称作FIFO表First InFirst Out .队列也有顺序存储和链式存储两种存储结构..队列的基本运算有六种:·置空队:InitQueueQ·判队空:QueueEmptyQ·判队满:QueueFullQ·入队:EnQueueQ;x·出队:DeQueueQ·取队头元素:QueueFrontQ顺序队列的“假上溢”现象:由于头尾指针不断前移;超出向量空间..这时整个向量空间及队列是空的却产生了“上溢”现象..为了克服“假上溢”现象引入循环向量的概念;是把向量空间形成一个头尾相接的环形;这时队列称循环队列..判定循环队列是空还是满;方法有三种:·一种是另设一个布尔变量来判断;·第二种是少用一个元素空间;入队时先测试rear+1%m = front 满:空;·第三种就是用一个计数器记录队列中的元素的总数..队列的链式存储结构称为链队列;一个链队列就是一个操作受限的单链表..为了便于在表尾进行插入入队的操作;在表尾增加一个尾指针;一个链队列就由一个头指针和一个尾指针唯一地确定..链队列不存在队满和上溢的问题..在链队列的出队算法中;要注意当原队中只有一个结点时;出队后要同进修改头尾指针并使队列变空..第四章串串是零个或多个字符组成的有限序列..·空串:是指长度为零的串;也就是串中不包含任何字符结点..·空白串:指串中包含一个或多个空格字符的串..·在一个串中任意个连续字符组成的子序列称为该串的子串;包含子串的串就称为主串..·子串在主串中的序号就是指子串在主串中首次出现的位置..·空串是任意串的子串;任意串是自身的子串..串分为两种:·串常量在程序中只能引用不能改变;·串变量的值可以改变..串的基本运算有:·求串长strlenchars·串复制strcpycharto;charfrom·串联接strcatcharto;charfrom·串比较charcmpchars1;chars2·字符定位strchrchars;charc串是特殊的线性表结点是字符;所以串的存储结构与线性表的存储结构类似..串的顺序存储结构简称为顺序串..顺序串又可按存储分配的不同分为:·静态存储分配:直接用定长的字符数组来定义..优点是涉及串长的操作速度快;但不适合插入、链接操作..·动态存储分配:是在定义串时不分配存储空间;需要使用时按所需串的长度分配存储单元..串的链式存储就是用单链表的方式存储串值;串的这种链式存储结构简称为链串..链串与单链表的差异只是它的结点数据域为单个字符..为了解决“存储密度”低的状况;可以让一个结点存储多个字符;即结点的大小..顺序串上子串定位的运算:又称串的“模式匹配”或“串匹配”;是在主串中查找出子串出现的位置..在串匹配中;将主串称为目标串;子串称为模式串..这是比较容易理解的;串匹配问题就是找出给定模式串P在给定目标串T中首次出现的有效位移或者是全部有效位移..最坏的情况下时间复杂度是On-m+1m;假如m与n同阶的话则它是On^2..链串上的子串定位运算位移是结点地址而不是整数第五章多维数组数组一般用顺序存储的方式表示..存储的方式有:·行优先顺序;也就是把数组逐行依次排列..PASCAL、C·列优先顺序;就是把数组逐列依次排列..FORTRAN 地址的计算方法:·按行优先顺序排列的数组:LOCaij=LOCa11+i-1n+j-1d.·按列优先顺序排列的数组:LOCaij=LOCa11+j-1n+i-1d.矩阵的压缩存储:为多个相同的非零元素分配一个存储空间;对零元素不分配空间..特殊矩阵的概念:所谓特殊矩阵是指非零元素或零元素分布有一定规律的矩阵..稀疏矩阵的概念:一个矩阵中若其非零元素的个数远远小于零元素的个数;则该矩阵称为稀疏矩阵..特殊矩阵的类型:·对称矩阵:满足aij=aji..元素总数nn+1/2.I=maxi;j;J=mini;j;LOCaij=LOCsa0+II+1/2+Jd.·三角矩阵:·上三角阵:k=i2n-i+1/2+j-i;LOCaij=LOCsa0+kd.·下三角阵:k=ii+1/2+j;LOCaij=LOCsa0+kd.·对角矩阵:k=2i+j;LOCaij=LOCsa0+kd.稀疏矩阵的压缩存储方式用三元组表把非零元素的值和它所在的行号列号做为一个结点存放在一起;用这些结点组成的一个线性表来表示..但这种压缩存储方式将失去随机存储功能..加入行表记录每行的非零元素在三元组表中的起始位置;即带行表的三元组表..第六章树树是n个结点的有限集合;非空时必须满足:只有一个称为根的结点;其余结点形成m个不相交的子集;并称根的子树..根是开始结点;结点的子树数称度;度为0的结点称叶子终端结点;度不为0的结点称分支结点非终端结点;除根外的分支结点称内部结点;有序树是子树有左;右之分的树;无序树是子树没有左;右之分的树;森林是m个互不相交的树的集合;树的四种不同表示方法:·树形表示法;·嵌套集合表示法;·凹入表示法·广义表表示法..二叉树的定义:是n≥0个结点的有限集;它是空集n=0或由一个根结点及两棵互不相交的分别称作这个根的左子树和右子树的二叉树组成..二叉树不是树的特殊情形;与度数为2的有序树不同..二叉树的4个重要性质:·二叉树上第i层上的结点数目最多为2^i-1i≥1..;·深度为k的二叉树至多有2^k-1个结点k≥1;·在任意一棵二叉树中;若终端结点的个数为n0;度为2的结点数为n2;则n0=n2+1;·具有n个结点的完全二叉树的深度为intlog2n+1.满二叉树是一棵深度为k;结点数为2^k-1的二叉树;完全二叉树是满二叉树在最下层自右向左去处部分结点;二叉树的顺序存储结构就是把二叉树的所有结点按照层次顺序存储到连续的存储单元中..存储前先将其画成完全二叉树树的存储结构多用的是链式存储..BinTNode的结构为lchild|data|rchild;把所有BinTNode类型的结点;加上一个指向根结点的BinTree型头指针就构成了二叉树的链式存储结构;称为二叉链表..它就是由根指针root唯一确定的..共有2n个指针域;n+1个空指针..根据访问结点的次序不同可得三种遍历:先序遍历前序遍历或先根遍历;中序遍历或中根遍历、后序遍历或后根遍历..时间复杂度为On..利用二叉链表中的n+1个空指针域来存放指向某种遍历次序下的前趋结点和后继结点的指针;这些附加的指针就称为“线索”;加上线索的二叉链表就称为线索链表..线索使得查找中序前趋和中序后继变得简单有效;但对于查找指定结点的前序前趋和后序后继并没有什么作用..树和森林及二叉树的转换是唯一对应的..转换方法:·树变二叉树:兄弟相连;保留长子的连线..·二叉树变树:结点的右孩子与其双亲连..·森林变二叉树:树变二叉树;各个树的根相连..树的存储结构:·有双亲链表表示法:结点data | parent;对于求指定结点的双亲或祖先十分方便;但不适于求指定结点的孩子及后代..·孩子链表表示法:为树中每个结点data | next设置一个孩子链表firstchild;并将data | firstchild存放在一个向量中..·双亲孩子链表表示法:将双亲链表和孩子链表结合..·孩子兄弟链表表示法:结点结构leftmostchild |data | rightsibing;附加两个分别指向该结点的最左孩子和右邻兄弟的指针域..树的前序遍历与相对应的二叉树的前序遍历一致;树的后序遍历与相对应的二叉树的中序遍历一致..树的带权路径长度是树中所有叶结点的带权路径长度之和..树的带权路径长度最小的二叉树就称为最优二叉树即哈夫曼树..在叶子的权值相同的二叉树中;完全二叉树的路径长度最短..哈夫曼树有n个叶结点;共有2n-1个结点;没有度为1的结点;这类树又称为严格二叉树..变长编码技术可以使频度高的字符编码短;而频度低的字符编码长;但是变长编码可能使解码产生二义性..如00、01、0001这三个码无法在解码时确定是哪一个;所以要求在字符编码时任一字符的编码都不是其他字符编码的前缀;这种码称为前缀码其实是非前缀码..哈夫曼树的应用最广泛地是在编码技术上;它能够容易地求出给定字符集及其概率分布的最优前缀码..哈夫曼编码的构造很容易;只要画好了哈夫曼树;按分支情况在左路径上写代码0;右路径上写代码1;然后从上到下到叶结点的相应路径上的代码的序列就是该结点的最优前缀码..第七章图图的逻辑结构特征就是其结点顶点的前趋和后继的个数都是没有限制的;即任意两个结点之间之间都可能相关..图GraphG=V;E;V是顶点的有穷非空集合;E是顶点偶对的有穷集..有向图Digraph:每条边有方向;无向图Undigraph:每条边没有方向..有向完全图:具有nn-1条边的有向图;无向完全图:具有nn-1/2条边的无向图;有根图:有一个顶点有路径到达其它顶点的有向图;简单路径:是经过顶点不同的路径;简单回路是开始和终端重的简单路径;网络:是带权的图..图的存储结构:·邻接矩阵表示法:用一个n阶方阵来表示图的结构是唯一的;适合稠密图..·无向图:邻接矩阵是对称的..·有向图:行是出度;列是入度..建立邻接矩阵算法的时间是On+n^2+e;其时间复杂度为On^2·邻接表表示法:用顶点表和邻接表构成不是唯一的;适合稀疏图..·顶点表结构 vertex | firstedge;指针域存放邻接表头指针..·邻接表:用头指针确定.. ·无向图称边表;·有向图又分出边表和逆邻接表;·邻接表结点结构为 adjvex | next;时间复杂度为On+e..;空间复杂度为On+e....图的遍历:·深度优先遍历:借助于邻接矩阵的列..使用栈保存已访问结点..·广度优先遍历:借助于邻接矩阵的行..使用队列保存已访问结点..生成树的定义:若从图的某个顶点出发;可以系统地访问到图中所有顶点;则遍历时经过的边和图的所有顶点构成的子图称作该图的生成树..最小生成树:图的生成树不唯一;从不同的顶点出发可得到不同的生成树;把权值最小的生成树称为最小生成树MST..构造最小生成树的算法:·Prim算法的时间复杂度为On^2与边数无关适于稠密图..·Kruskal算法的时间复杂度为Olge;主要取决于边数;较适合于稀疏图..最短路径的算法:·Dijkstra算法;时间复杂度为On^2..·类似于prim算法..拓扑排序:是将有向无环图G中所有顶点排成一个线性序列;若<u;v>∈EG;则在线性序列u在v之前;这种线性序列称为拓扑序列..拓扑排序也有两种方法:·无前趋的顶点优先;每次输出一个无前趋的结点并删去此结点及其出边;最后得到的序列即拓扑序列..·无后继的结点优先:每次输出一个无后继的结点并删去此结点及其入边;最后得到的序列是逆拓扑序列..第八章排序记录中可用某一项来标识一个记录;则称为关键字项;该数据项的值称为关键字..排序是使文件中的记录按关键字递增或递减次序排列起来..·基本操作:比较关键字大小;改变指向记录的指针或移动记录..·存储结构:顺序结构、链表结构、索引结构..经过排序后这些具有相同关键字的记录之间的相对次序保持不变;则称这种排序方法是稳定的;否则排序算法是不稳定的..排序过程中不涉及数据的内、外存交换则称之为“内部排序”内排序;反之;若存在数据的内外存交换;则称之为外排序..内部排序方法可分五类:插入排序、选择排序、交换排序、归并排序和分配排序..评价排序算法好坏的标准主要有两条:执行时间和所需的辅助空间;另外算法的复杂程序也是要考虑的一个因素..插入排序:·直接插入排序:·逐个向前插入到合适位置..·哨兵监视哨有两个作用:·作为临变量存放Ri·是在查找循环中用来监视下标变量j是否越界..·直接插入排序是就地的稳定排序..时间复杂度为On^2;比较次数为n+2n-1/2;移动次数为n+4n-1/2;·希尔排序:·等间隔的数据比较并按要求顺序排列;最后间隔为1.·希尔排序是就地的不稳定排序..时间复杂度为On^1.25;比较次数为n^1.25;移动次数为1.6n^1.25;交换排序:·冒泡排序:·自下向上确定最轻的一个..·自上向下确定最重的一个..·自下向上确定最轻的一个;后自上向下确定最重的一个..·冒泡排序是就地的稳定排序..时间复杂度为On^2;比较次数为nn-1/2;移动次数为3nn-1/2;·快速排序:·以第一个元素为参考基准;设定、动两个指针;发生交换后指针交换位置;直到指针重合..重复直到排序完成..·快速排序是非就地的不稳定排序..时间复杂度为Onlog2n;比较次数为nn-1/2;选择排序:·直接选择排序:·选择最小的放在比较区前..·直接选择排序就地的不稳定排序..时间复杂度为On^2..比较次数为nn-1/2;·堆排序·建堆:按层次将数据填入完全二叉树;从intn/2处向前逐个调整位置..·然后将树根与最后一个叶子交换值并断开与树的连接并重建堆;直到全断开..·堆排序是就地不稳定的排序;时间复杂度为Onlog2n;不适宜于记录数较少的文件..归并排序:·先两个一组排序;形成n+1/2组;再将两组并一组;直到剩下一组为止..·归并排序是非就地稳定排序;时间复杂度是Onlog2n;分配排序:·箱排序:·按关键字的取值范围确定箱子数;按关键字投入箱子;链接所有非空箱..·箱排序的平均时间复杂度是线性的On..·基数排序:·从低位到高位依次对关键字进行箱排序..·基数排序是非就稳定的排序;时间复杂度是Odn+drd..各种排序方法的比较和选择:·待排序的记录数目n;n较大的要用时间复杂度为Onlog2n的排序方法;·记录的大小规模;记录大最好用链表作为存储结构;而快速排序和堆排序在链表上难于实现;·关键字的结构及其初始状态;·对稳定性的要求;·语言工具的条件;·存储结构;·时间和辅助空间复杂度..第九章查找查找的同时对表做修改操作如插入或删除则相应的表称之为动态查找表;否则称之为静态查找表..衡量查找算法效率优劣的标准是在查找过程中对关键字需要执行的平均比较次数即平均查找长度ASL..线性表查找的方法:·顺序查找:逐个查找;ASL=n+1/2;·二分查找:取中点intn/2比较;若小就比左区间;大就比右区间..用二叉判定树表示..ASL=∑每层结点数层数/N.·分块查找..要求“分块有序”;将表分成若干块内部不一定有序;并抽取各块中的最大关键字及其位置建立有序索引表..二叉排序树BST定义是:二叉排序树是空树或者满足如下性质的二叉树:·若它的左子树非空;则左子树上所有结点的值均小于根结点的值;·若它的右子树非空;则右子树上所有结点的值均大于根结点的值;·左、右子树本身又是一棵二叉排序树..二叉排序树的插入、建立、删除的算法平均时间性能是Onlog2n..二叉排序树的删除操作可分三种情况进行处理:·P是叶子;则直接删除P;即将P的双亲parent中指向P的指针域置空即可..·P只有一个孩子child;此时只需将child和p的双亲直接连接就可删去p.·p有两个孩子;则先将p结点的中序后继结点的数据到p;删除中序后继结点..关于B-树多路平衡查找树..它适合在磁盘等直接存取设备上组织动态的查找表;是一种外查找算法..建立的方式是从下向上拱起..散列技术:将结点按其关键字的散列地址存储到散列表的过程称为散列..散列函数的选择有两条标准:简单和均匀..常见的散列函数构的造方法:·平方取中法:hash=intx^2%100·除余法:表长为m;hash=x%m·相乘取整法:hash=intmxA-intxA;A=0.618·随机数法:hash=randomx..处理冲突的方法:·开放定址法:·一般形式为hi=hkey+di%m1≤i≤m-1;开放定址法要求散列表的装填因子α≤1.·开放定址法类型:·线性探查法:address=hashx+i%m;·二次探查法:address=hashx+i^2%m;·双重散列法:address=hashx+ihashy%m;·拉链法:·是将所有关键字为同义词的结点链接在同一个单链表中..·拉链法的优点:·拉链法处理冲突简单;且无堆积现象;·链表上的结点空间是动态申请的适于无法确定表长的情况;·拉链法中α可以大于1;结点较大时其指针域可忽略;因此节省空间;·拉链法构造的散列表删除结点易实现..·拉链法也有缺点:当结点规模较小时;用拉链法中的指针域也要占用额外空间;还是开放定址法省空间..第十章排序10.1 排序的基本概念10.2 插入排序10.3 选择排序10.4 交换排序本章主要知识点:排序的基本概念和衡量排序算法优劣的标准;其中衡量标准有算法的时间复杂度、空间复杂度和稳定性直接插入排序;希尔排序直接选择排序;堆排序冒泡排序;快速排序10.1排序的基本概念1.排序是对数据元素序列建立某种有序排列的过程..2.排序的目的:便于查找..3.关键字是要排序的数据元素集合中的一个域;排序是以关键字为基准进行的..关键字分主关键字和次关键字两种..对要排序的数据元素集合来说;如果关键字满足数据元素值不同时该关键字的值也一定不同;这样的关键字称为主关键字..。
第1章绪论内容提要:◆数据结构研究的内容..针对非数值计算的程序设计问题;研究计算机的操作对象以及它们之间的关系和操作..数据结构涵盖的内容:◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型..数据——所有能被计算机识别、存储和处理的符号的集合..数据元素——是数据的基本单位;具有完整确定的实际意义..数据对象——具有相同性质的数据元素的集合;是数据的一个子集..数据结构——是相互之间存在一种或多种特定关系的数据元素的集合;表示为:Data_Structure=D; R数据类型——是一个值的集合和定义在该值上的一组操作的总称..抽象数据类型——由用户定义的一个数学模型与定义在该模型上的一组操作;它由基本的数据类型构成..◆算法的定义及五个特征..算法——是对特定问题求解步骤的一种描述;它是指令的有限序列;是一系列输入转换为输出的计算步骤..算法的基本特性:输入、输出、有穷性、确定性、可行性◆算法设计要求..①正确性、②可读性、③健壮性、④效率与低存储量需求◆算法分析..时间复杂度、空间复杂度、稳定性学习重点:◆数据结构的“三要素”:逻辑结构、物理存储结构及在这种结构上所定义的操作运算..◆用计算语句频度来估算算法的时间复杂度..第二章线性表内容提要:◆线性表的逻辑结构定义;对线性表定义的操作..线性表的定义:用数据元素的有限序列表示◆线性表的存储结构:顺序存储结构和链式存储结构..顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构..链式存储结构: 其结点在存储器中的位置是随意的;即逻辑上相邻的数据元素在物理上不一定相邻..通过指针来实现◆线性表的操作在两种存储结构中的实现..数据结构的基本运算:修改、插入、删除、查找、排序1)修改——通过数组的下标便可访问某个特定元素并修改之..核心语句:Vi=x;顺序表修改操作的时间效率是O12 插入——在线性表的第i个位置前插入一个元素实现步骤:①将第n至第i 位的元素向后移动一个位置;②将要插入的元素写到第i个位置;③表长加1..注意:事先应判断: 插入位置i 是否合法表是否已满应当符合条件:1≤i≤n+1 或i=1; n+1核心语句:for j=n; j>=i; j--aj+1=a j ;a i =x;n++;插入时的平均移动次数为:nn+1/2÷n+1=n/2≈On3 删除——删除线性表的第i个位置上的元素实现步骤:①将第i+1 至第n 位的元素向前移动一个位置;②表长减1..注意:事先需要判断;删除位置i 是否合法应当符合条件:1≤i≤n 或i=1; n核心语句:for j=i+1; j<=n; j++aj-1=aj;n--;顺序表删除一元素的时间效率为:Tn=n-1/2 ≈On顺序表插入、删除算法的平均空间复杂度为O1单链表:1用单链表结构来存放26个英文字母组成的线性表a;b;c;…;z;请写出C语言程序.. #include<stdio.h>#include<stdlib.h>typedef struct node{char data;struct node *next;}node;node *p;*q;*head; //一般需要3个指针变量int n ; // 数据元素的个数int m=sizeofnode; /*结构类型定义好之后;每个node类型的长度就固定了;m求一次即可*/void build //字母链表的生成..要一个个慢慢链入{int i;head=node*mallocm; //m=sizeofnode 前面已求出p=head;for i=1; i<26; i++ //因尾结点要特殊处理;故i≠26{p->data=i+‘a’-1; // 第一个结点值为字符ap->next=node*mallocm; //为后继结点“挖坑”p=p->next;} //让指针变量P指向后一个结点p->data=i+‘a’-1; //最后一个元素要单独处理p->next=NULL ; //单链表尾结点的指针域要置空}}void display //字母链表的输出{p=head;while p //当指针不空时循环仅限于无头结点的情况{printf"%c";p->data;p=p->next; //让指针不断“顺藤摸瓜”}}(2)单链表的修改或读取(3)思路:要修改第i个数据元素;必须从头指针起一直找到该结点的指针p;然后才能:p>data=new_value读取第i个数据元素的核心语句是:Linklist *findLinklist *head ;int i{int j=1;Linklist *p;P=head->next;Whilep=NULL&&j<i{p=p->next;j++;}return p;}3.单链表的插入链表插入的核心语句:Step 1:s->next=p->next;Step 2:p->next=s ;6.单链表的删除删除动作的核心语句要借助辅助指针变量q:q = p->next; //首先保存b的指针;靠它才能找到c;p->next=q->next; //将a、c两结点相连;淘汰b结点;freeq ;//彻底释放b结点空间7.双向链表的插入操作:设p已指向第i 元素;请在第i 元素前插入元素x:①ai-1的后继从ai 指针是p变为x指针是s :s->next = p ; p->prior->next = s ;②ai 的前驱从ai-1 指针是p->prior变为x 指针是s;s->prior = p ->prior ; p->prior = s ;8.双向链表的删除操作:设p指向第i 个元素;删除第i 个元素后继方向:ai-1的后继由ai 指针p变为ai+1指针p ->next ;p ->prior->next = p->next ;前驱方向:ai+1的前驱由ai 指针p变为ai-1 指针p -> prior ;p->next->prior = p ->prior ;◆数组的逻辑结构定义及存储数组:由一组名字相同、下标不同的变量构成N维数组的特点:n个下标;每个元素受到n个关系约束一个n维数组可以看成是由若干个n-1维数组组成的线性表..存储:事先约定按某种次序将数组元素排成一列序列;然后将这个线性序列存入存储器中..在二维数组中;我们既可以规定按行存储;也可以规定按列存储..设一般的二维数组是Ac1..d1; c2..d2;则行优先存储时的地址公式为:二维数组列优先存储的通式为:◆稀疏矩阵含特殊矩阵的存储及运算..稀疏矩阵:矩阵中非零元素的个数较少一般小于5%学习重点:◆线性表的逻辑结构;指线性表的数据元素间存在着线性关系..在顺序存储结构中;元素存储的先后位置反映出这种线性关系;而在链式存储结构中;是靠指针来反映这种关系的..◆顺序存储结构用一维数组表示;给定下标;可以存取相应元素;属于随机存取的存储结构..◆链表操作中应注意不要使链意外“断开”..因此;若在某结点前插入一个元素;或删除某元素;必须知道该元素的前驱结点的指针..◆掌握通过画出结点图来进行链表单链表、循环链表等的生成、插入、删除、遍历等操作..◆数组主要是二维在以行序/列序为主的存储中的地址计算方法..◆稀疏矩阵的三元组表存储结构..◆稀疏矩阵的十字链表存储方法..补充重点:1.每个存储结点都包含两部分:数据域和指针域链域2.在单链表中;除了首元结点外;任一结点的存储位置由其直接前驱结点的链域的值指示..3.在链表中设置头结点有什么好处头结点即在链表的首元结点之前附设的一个结点;该结点的数据域可以为空;也可存放表长度等附加信息;其作用是为了对链表进行操作时;可以对空表、非空表的情况以及对首元结点进行统一处理;编程更方便..4.如何表示空表1无头结点时;当头指针的值为空时表示空表;2有头结点时;当头结点的指针域为空时表示空表..5.链表的数据元素有两个域;不再是简单数据类型;编程时该如何表示因每个结点至少有两个分量;且数据类型通常不一致;所以要采用结构数据类型..6.sizeofx——计算变量x的长度字节数;mallocm —开辟m字节长度的地址空间;并返回这段空间的首地址;freep ——释放指针p所指变量的存储空间;即彻底删除一个变量..7.链表的运算效率分析:1查找因线性链表只能顺序存取;即在查找时要从头指针找起;查找的时间复杂度为On..2 插入和删除因线性链表不需要移动元素;只要修改指针;一般情况下时间复杂度为O1..但是;如果要在单链表中进行前插或删除操作;因为要从头查找前驱结点;所耗时间复杂度将是On..例:在n个结点的单链表中要删除已知结点*P;需找到它的前驱结点的地址;其时间复杂度为On8. 顺序存储和链式存储的区别和优缺点顺序存储时;逻辑上相邻的数据元素;其物理存放地址也相邻..顺序存储的优点是存储密度大;存储空间利用率高;缺点是插入或删除元素时不方便..链式存储时;相邻数据元素可随意存放;但所占存储空间分两部分;一部分存放结点值;另一部分存放表示结点间关系的指针..链式存储的优点是插入或删除元素时很方便;使用灵活..缺点是存储密度小;存储空间利用率低..◆顺序表适宜于做查找这样的静态操作;◆链表宜于做插入、删除这样的动态操作..◆若线性表的长度变化不大;且其主要操作是查找;则采用顺序表;◆若线性表的长度变化较大;且其主要操作是插入、删除操作;则采用链表..9. 判断:“数组的处理比其它复杂的结构要简单”;对吗答:对的..因为——①数组中各元素具有统一的类型;②数组元素的下标一般具有固定的上界和下界;即数组一旦被定义;它的维数和维界就不再改变..③数组的基本操作比较简单;除了结构的初始化和销毁之外;只有存取元素和修改元素值的操作..10.三元素组表中的每个结点对应于稀疏矩阵的一个非零元素;它包含有三个数据项;分别表示该元素的行下标、列下标和元素值..11.写出右图所示稀疏矩阵的压缩存储形式..解:介绍3种存储形式..法1:用线性表表示:1;2;12 ;1;3;9; 3;1;-3; 3;5;14;4;3;24; 5;2;18 ;6;1;15; 6;4;-7法2:用十字链表表示用途:方便稀疏矩阵的加减运算方法:每个非0元素占用5个域法3:用三元组矩阵表示:稀疏矩阵压缩存储的缺点:将失去随机存取功能代码:1.用数组V来存放26个英文字母组成的线性表a;b;c;…;z;写出在顺序结构上生成和显示该表的C语言程序..char V30;void build //字母线性表的生成;即建表操作{int i;V0='a';for i=1; i<=n-1; i++Vi=Vi-1+1;}void display //字母线性表的显示;即读表操作{int i;for i=0; i<=n-1; i++printf "%c"; vi ;printf "\n " ;}void mainvoid //主函数;字母线性表的生成和输出{n=26; // n是表长;是数据元素的个数;而不是V的实际下标build ;display ;}第三章栈和队列内容提要:◆从数据结构角度来讲;栈和队列也是线性表;其操作是线性表操作的子集;属操作受限的线性表..但从数据类型的角度看;它们是和线性表大不相同的重要抽象数据类型..◆栈的定义及操作..栈是只准在一端进行插入和删除操作的线性表;该端称为栈的顶端..插入元素到栈顶的操作;称为入栈..从栈顶删除最后一个元素的操作;称为出栈..对于向上生成的堆栈:入栈口诀:堆栈指针top “先压后加”: Stop++=an+1出栈口诀:堆栈指针top “先减后弹”: e=S--top◆栈的顺序和链式存储结构;及在这两种结构下实现栈的操作..顺序栈入栈函数PUSHstatus PushElemType e{ iftop>M{上溢}else stop++=e;}顺序栈出栈函数POPstatus Pop{ iftop=L { 下溢}else { e=s--top; returne;}}◆队列的定义及操作;队列的删除在一端队尾;而插入则在队列的另一端队头..因此在两种存储结构中;都需要队头和队尾两个指针..队列:只能在表的一端进行插入运算;在表的另一端进行删除运算的线性表..链队列结点类型定义:typedef Struct QNode{QElemType data; //元素Struct QNode *next; //指向下一结点的指针}Qnode ; * QueuePtr ;链队列类型定义:typedef struct {QueuePtr front ; //队首指针QueuePtr rear ; //队尾指针} LinkQueue;链队示意图:①空链队的特征:front=rear②链队会满吗一般不会;因为删除时有free动作..除非内存不足③入队尾部插入:rear->next=S; rear=S;出队头部删除:front->next=p->next;2.顺序队顺序队类型定义:#define QUEUE-MAXSIZE 100 //最大队列长度typedef struct {QElemType *base; //队列的基址int front; //队首指针int rear; //队尾指针}Sueue建队核心语句:q . base=QElemType *mallocsizeof QElemType* QUEUE_MAXSIZE; //分配空间顺序队示意图:循环队列:队空条件: front = rear 初始化时:front = rear队满条件:front = rear+1 % N N=maxsize队列长度即数据元素个数:L=N+rear-front% N1)初始化一个空队列Status InitQueue Sueue &q //初始化空循环队列q{q . base=QElemType *mallocsizeofQElemType* QUEUE_MAXSIZE; //分配空间if q.base exitOVERFLOW;//内存分配失败;退出程序q.front =q.rear=0; //置空队列return OK;} //InitQueue;2)入队操作Status EnQueueSueue &q; QElemType e{//向循环队列q 的队尾加入一个元素eif q.rear+1 % QUEUE_MAXSIZE = = q.frontreturn ERROR ; //队满则上溢;无法再入队q.rear = q . rear + 1 % QUEUE_MAXSIZE;q.base q.rear = e; //新元素e入队return OK;}// EnQueue;3)出队操作Status DeQueue Sueue &q; QElemType &e{//若队列不空;删除循环队列q的队头元素;//由e 返回其值;并返回OKif q.front = = q.rear return ERROR;//队列空q.front=q.front+1 % QUEUE_MAXSIZE ;e = q.base q.front ;return OK;}// DeQueue◆链队列空的条件是首尾指针相等;而循环队列满的条件的判定;则有队尾加1等于队头和设标记两种方法..补充重点:1.为什么要设计堆栈它有什么独特用途①调用函数或子程序非它莫属;②递归运算的有力工具;③用于保护现场和恢复现场;④简化了程序设计的问题..2.为什么要设计队列它有什么独特用途①离散事件的模拟模拟事件发生的先后顺序;例如CPU芯片中的指令译码队列;②操作系统中的作业调度一个CPU执行多个作业;③简化程序设计..3.什么叫“假溢出”如何解决答:在顺序队中;当尾指针已经到了数组的上界;不能再有入队操作;但其实数组中还有空位置;这就叫“假溢出”..解决假溢出的途径———采用循环队列..4.在一个循环队列中;若约定队首指针指向队首元素的前一个位置..那么;从循环队列中删除一个元素时;其操作是先移动队首位置;后取出元素..5.线性表、栈、队的异同点:相同点:逻辑结构相同;都是线性的;都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表;即受限的线性表只是对插入、删除运算加以限制..不同点:①运算规则不同:线性表为随机存取;而栈是只允许在一端进行插入和删除运算;因而是后进先出表LIFO;队列是只允许在一端进行插入、另一端进行删除运算;因而是先进先出表FIFO..②用途不同;线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事件模拟、OS作业调度和简化设计等..第四章串内容提要:◆串是数据元素为字符的线性表;串的定义及操作..串即字符串;是由零个或多个字符组成的有限序列;是数据元素为单个字符的特殊线性表..串比较:int strcmpchar *s1;char *s2;求串长:int strlenchar *s;串连接:char strcatchar *to;char *from子串T定位:char strchrchar *s;char *c;◆串的存储结构;因串是数据元素为字符的线性表;所以存在“结点大小”的问题..模式匹配算法..串有三种机内表示方法:模式匹配算法:算法目的:确定主串中所含子串第一次出现的位置定位定位问题称为串的模式匹配;典型函数为IndexS;T;posBF算法的实现—即编写IndexS; T; pos函数BF算法设计思想:将主串S的第pos个字符和模式T的第1个字符比较;若相等;继续逐个比较后续字符;若不等;从主串S的下一字符pos+1起;重新与T第一个字符比较..直到主串S的一个连续子串字符序列与模式T相等..返回值为S中与T匹配的子序列第一个字符的序号;即匹配成功..否则;匹配失败;返回值0..Int Index_BPSString S; SString T; int pos{ //返回子串T在主串S中第pos个字符之后的位置..若不存在;则函数值为0.// 其中;T非空;1≤pos≤StrLengthSi=pos; j=1;while i<=S0 && j<=T0 //如果i;j二指针在正常长度范围;{if Si = = Tj {++i; ++j; } //则继续比较后续字符else {i=i-j+2; j=1;} //若不相等;指针后退重新开始匹配}ifj>T0 return i-T0; //T子串指针j正常到尾;说明匹配成功; else return 0; //否则属于i>S0情况;i先到尾就不正常} //Index_BP补充重点:1.空串和空白串有无区别答:有区别..空串Null String是指长度为零的串;而空白串Blank String;是指包含一个或多个空白字符‘’空格键的字符串.2.“空串是任意串的子串;任意串S都是S本身的子串;除S本身外;S的其他子串称为S的真子串..”第六章树和二叉树内容提要:◆树是复杂的非线性数据结构;树;二叉树的递归定义;基本概念;术语..树:由一个或多个n≥0结点组成的有限集合T;有且仅有一个结点称为根root;当n>1时;其余的结点分为mm≥0个互不相交的有限集合T1;T2;…;Tm..每个集合本身又是棵树;被称作这个根的子树..二叉树:是nn≥0个结点的有限集合;由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成..术语:P88◆二叉树的性质;存储结构..性质1: 在二叉树的第i层上至多有2i-1个结点i>0..性质2: 深度为k的二叉树至多有2k-1个结点k>0..性质3: 对于任何一棵二叉树;若2度的结点数有n2个;则叶子数n0必定为n2+1性质4: 具有n个结点的完全二叉树的深度必为性质5: 对完全二叉树;若从上至下、从左至右编号;则编号为i 的结点;其左孩子编号必为2i;其右孩子编号为2i+1;其双亲的编号必为i/2i=1 时为根;除外..二叉树的存储结构:一、顺序存储结构按二叉树的结点“自上而下、从左至右”编号;用一组连续的存储单元存储..若是完全/满二叉树则可以做到唯一复原..不是完全二叉树:一律转为完全二叉树方法很简单;将各层空缺处统统补上“虚结点”;其内容为空..缺点:①浪费空间;②插入、删除不便二、链式存储结构用二叉链表即可方便表示..一般从根结点开始存储..优点:①不浪费空间;②插入、删除方便◆二叉树的遍历..指按照某种次序访问二叉树的所有结点;并且每个结点仅访问一次;得到一个线性序列..遍历规则———二叉树由根、左子树、右子树构成;定义为D、L、R若限定先左后右;则有三种实现方案:DLR LDR LRD先序遍历中序遍历后序遍历◆树的存储结构;树、森林的遍历及和二叉树的相互转换..回顾2:二叉树怎样还原为树要点:逆操作;把所有右孩子变为兄弟讨论1:森林如何转为二叉树法一:①各森林先各自转为二叉树;②依次连到前一个二叉树的右子树上..法二:森林直接变兄弟;再转为二叉树讨论2:二叉树如何还原为森林要点:把最右边的子树变为森林;其余右子树变为兄弟树和森林的存储方式:树有三种常用存储方式:①双亲表示法②孩子表示法③孩子—兄弟表示法问:树→二叉树的“连线—抹线—旋转”如何由计算机自动实现答:用“左孩子右兄弟”表示法来存储即可..存储的过程就是树转换为二叉树的过程树、森林的遍历:①先根遍历:访问根结点;依次先根遍历根结点的每棵子树..②后根遍历:依次后根遍历根结点的每棵子树;访问根结点..讨论:树若采用“先转换;后遍历”方式;结果是否一样1. 树的先根遍历与二叉树的先序遍历相同;2. 树的后根遍历相当于二叉树的中序遍历;3. 树没有中序遍历;因为子树无左右之分..①先序遍历若森林为空;返回;访问森林中第一棵树的根结点;先根遍历第一棵树的根结点的子树森林;先根遍历除去第一棵树之后剩余的树构成的森林..②中序遍历若森林为空;返回;中根遍历森林中第一棵树的根结点的子树森林;访问第一棵树的根结点;中根遍历除去第一棵树之后剩余的树构成的森林..◆二叉树的应用:哈夫曼树和哈夫曼编码..Huffman树:最优二叉树带权路径长度最短的树Huffman编码:不等长编码..树的带权路径长度:树中所有叶子结点的带权路径长度之和构造Huffman树的基本思想:权值大的结点用短路径;权值小的结点用长路径..构造Huffman树的步骤即Huffman算法:1 由给定的n 个权值{ w1; w2; …; wn }构成n棵二叉树的集合F = { T1; T2; …; Tn } 即森林;其中每棵二叉树Ti 中只有一个带权为wi 的根结点;其左右子树均空..2 在F 中选取两棵根结点权值最小的树做为左右子树构造一棵新的二叉树;且让新二叉树根结点的权值等于其左右子树的根结点权值之和..3 在F 中删去这两棵树;同时将新得到的二叉树加入F中..4 重复2 和3 ; 直到F 只含一棵树为止..这棵树便是Huffman树..具体操作步骤:学习重点:本章内容是本课程的重点◆二叉树性质及证明方法;并能把这种方法推广到K叉树..◆二叉树遍历;遍历是基础;由此导出许多实用的算法;如求二叉树的高度、各结点的层次数、度为0、1、2的结点数..◆由二叉树遍历的前序和中序序列或后序和中序序列可以唯一构造一棵二叉树..由前序和后序序列不能唯一确定一棵二叉树..◆完全二叉树的性质..◆树、森林和二叉树间的相互转换..◆哈夫曼树的定义、构造及求哈夫曼编码..补充:1.满二叉树和完全二叉树有什么区别答:满二叉树是叶子一个也不少的树;而完全二叉树虽然前k-1层是满的;但最底层却允许在右边缺少连续若干个结点..满二叉树是完全二叉树的一个特例..2.Huffman树有什么用最小冗余编码、信息高效传输第七章图内容提要:◆图的定义;概念、术语及基本操作..图:记为G=V; E其中:V 是G 的顶点集合;是有穷非空集;E 是G 的边集合;是有穷集..术语:见课件◆图的存储结构..1.邻接矩阵数组表示法①建立一个顶点表和一个邻接矩阵②设图A = V; E 有n 个顶点;则图的邻接矩阵是一个二维数组A.Edgenn..注:在有向图的邻接矩阵中;第i行含义:以结点vi为尾的弧即出度边;第i列含义:以结点vi为头的弧即入度边..邻接矩阵法优点:容易实现图的操作;如:求某顶点的度、判断顶点之间是否有边弧、找顶点的邻接点等等..邻接矩阵法缺点:n个顶点需要n*n个单元存储边弧;空间效率为On2..2.邻接表链式表示法①对每个顶点vi 建立一个单链表;把与vi有关联的边的信息即度或出度边链接起来;表中每个结点都设为3个域:②每个单链表还应当附设一个头结点设为2个域;存vi信息;③每个单链表的头结点另外用顺序存储结构存储..邻接表的优点:空间效率高;容易寻找顶点的邻接点;邻接表的缺点:判断两顶点间是否有边或弧;需搜索两结点对应的单链表;没有邻接矩阵方便..◆图的遍历..遍历定义:从已给的连通图中某一顶点出发;沿着一些边;访遍图中所有的顶点;且使每个顶点仅被访问一次;就叫做图的遍历;它是图的基本运算..图常用的遍历:一、深度优先搜索;二、广度优先搜索深度优先搜索遍历步骤:①访问起始点v;②若v的第1个邻接点没访问过;深度遍历此邻接点;③若当前邻接点已访问过;再找v的第2个邻接点重新遍历..基本思想:——仿树的先序遍历过程..广度优先搜索遍历步骤:①在访问了起始点v之后;依次访问v的邻接点;②然后再依次顺序访问这些点下一层中未被访问过的邻接点;③直到所有顶点都被访问过为止..◆图的应用最小生成树;最短路经最小生成树MST的性质如下:若U集是V的一个非空子集;若u0; v0是一条最小权值的边;其中u0 U;v0 V-U;则:u0; v0必在最小生成树上..求MST最常用的是以下两种:Kruskal克鲁斯卡尔算法、Prim普里姆算法Kruskal算法特点:将边归并;适于求稀疏网的最小生成树..Prime算法特点: 将顶点归并;与边数无关;适于稠密网..在带权有向图中A点源点到达B点终点的多条路径中;寻找一条各边权值之和最小的路径;即最短路径..两种常见的最短路径问题:一、单源最短路径—用Dijkstra迪杰斯特拉算法二、所有顶点间的最短路径—用Floyd弗洛伊德算法一、单源最短路径Dijkstra算法一顶点到其余各顶点v0→j目的:设一有向图G=V; E;已知各边的权值;以某指定点v0为源点;求从v0到图的其余各点的最短路径..限定各边上的权值大于或等于0..二、所有顶点之间的最短路径可以通过调用n次Dijkstra算法来完成;还有更简单的一个算法:Floyd算法自学..学习重点:图是应用最广泛的一种数据结构;本章也是这门课程的重点..◆基本概念中;连通分量;生成树;邻接点是重点..①连通图:在无向图中; 若从顶点v1到顶点v2有路径; 则称顶点v1与v2是连通的..如果图中任意一对顶点都是连通的; 则称此图是连通图..非连通图的极大连通子图叫做连通分量..②生成树:是一个极小连通子图;它含有图中全部n个顶点;但只有n-1条边..③邻接点:若u; v 是EG 中的一条边;则称u 与v 互为邻接顶点..◆图是复杂的数据结构;也有顺序和链式两种存储结构:数组表示法重点是邻接距阵和邻接表..这两种存储结构对有向图和无向图均适用◆图的遍历是图的各种算法的基础;应熟练掌握图的深度、广度优先遍历..◆连通图的最小生成树不是唯一的;但最小生成树边上的权值之和是唯一的.. 应熟练掌握prim和kruscal算法;特别是手工分步模拟生成树的生成过程..◆从单源点到其他顶点;以及各个顶点间的最短路径问题;掌握熟练手工模拟..补充:1.问:当有向图中仅1个顶点的入度为0;其余顶点的入度均为1;此时是何形状答:是树而且是一棵有向树2.讨论:邻接表与邻接矩阵有什么异同之处1. 联系:邻接表中每个链表对应于邻接矩阵中的一行;链表中结点个数等于一行中非零元素的个数..2. 区别:对于任一确定的无向图;邻接矩阵是唯一的行列号与顶点编号一致;但邻接表不唯一链接次序与顶点编号无关..3. 用途:邻接矩阵多用于稠密图的存储而邻接表多用于稀疏图的存储3.若对连通图进行遍历;得到的是生成树若对非连通图进行遍历;得到的是生成森林..第八章查找内容提要:◆查找表是称为集合的数据结构..是元素间约束力最差的数据结构:元素间的关系是元素仅共在同一个集合中..同一类型的数据元素构成的集合◆查找表的操作:查找;插入;删除..◆静态查找表:顺序表;有序表等..针对静态查找表的查找算法主要有:顺序查找、折半查找、分块查找一、顺序查找线性查找技巧:把待查关键字key存入表头或表尾俗称“哨兵”;这样可以加快执行速度..int Search_Seq SSTable ST ; KeyType key {ST.elem0.key =key;for i=ST.length; ST.elem i .key=key; - - i ;return i;} // Search_Seq。
数据结构知识点整理第一点:数据结构的基本概念与类型数据结构是计算机科学中的一个重要分支,它研究的是如何有效地存储、组织和管理数据,以便于计算机可以高效地进行数据的读取、插入、删除等操作。
数据结构的基本概念主要包括两个方面:数据的逻辑结构与数据的物理结构。
1.1 数据的逻辑结构数据的逻辑结构主要描述数据的逻辑关系,不涉及数据的存储方式。
常见的逻辑结构有:•线性结构:如线性表、栈、队列、串等。
线性结构的特点是数据元素之间存在一对一的关系,每个数据元素只有一个直接前驱和一个直接后继。
•非线性结构:如树、图等。
非线性结构的特点是数据元素之间存在一对多或者多对多的关系。
其中,树结构是一种重要的非线性结构,它具有层次性,每个数据元素(树节点)有零个或多个子节点。
1.2 数据的物理结构数据的物理结构主要描述数据在计算机内存中的存储方式,它直接影响了计算机对数据的访问效率。
常见的物理结构有:•顺序存储结构:如数组、链表等。
顺序存储结构将数据元素按照一定的顺序存放在计算机内存中,相邻的数据元素在内存中也是相邻的。
•链式存储结构:如单链表、双向链表、循环链表等。
链式存储结构通过指针将不连续的数据元素连接起来,每个数据元素只存储数据本身以及指向下一个数据元素的指针。
1.3 数据结构的应用场景不同的数据结构适用于不同的应用场景。
例如:•线性表:适用于顺序访问数据元素的场景,如学生成绩管理系统。
•栈和队列:适用于后进先出(LIFO)或先进先出(FIFO)的场景,如表达式求值、任务调度等。
•树结构:适用于具有层次关系的数据组织,如文件系统的目录结构、HTML文档的DOM树等。
•图结构:适用于表示复杂的关系,如社交网络、交通网络等。
第二点:常见数据结构算法与应用在计算机科学中,算法是解决问题的一系列清晰指令。
结合数据结构,算法可以有效地解决实际问题。
以下是一些常见的数据结构及其相关算法与应用。
2.1 线性表的算法与应用线性表是最基本的逻辑结构。
数据结构知识点全⾯总结—精华版第1章绪论内容提要:◆数据结构研究的内容。
针对⾮数值计算的程序设计问题,研究计算机的操作对象以及它们之间的关系和操作。
数据结构涵盖的内容:◆基本概念:数据、数据元素、数据对象、数据结构、数据类型、抽象数据类型。
数据——所有能被计算机识别、存储和处理的符号的集合。
数据元素——是数据的基本单位,具有完整确定的实际意义。
数据对象——具有相同性质的数据元素的集合,是数据的⼀个⼦集。
数据结构——是相互之间存在⼀种或多种特定关系的数据元素的集合,表⽰为:Data_Structure=(D, R)数据类型——是⼀个值的集合和定义在该值上的⼀组操作的总称。
抽象数据类型——由⽤户定义的⼀个数学模型与定义在该模型上的⼀组操作,它由基本的数据类型构成。
◆算法的定义及五个特征。
算法——是对特定问题求解步骤的⼀种描述,它是指令的有限序列,是⼀系列输⼊转换为输出的计算步骤。
算法的基本特性:输⼊、输出、有穷性、确定性、可⾏性◆算法设计要求。
①正确性、②可读性、③健壮性、④效率与低存储量需求◆算法分析。
时间复杂度、空间复杂度、稳定性学习重点:◆数据结构的“三要素”:逻辑结构、物理(存储)结构及在这种结构上所定义的操作(运算)。
◆⽤计算语句频度来估算算法的时间复杂度。
内容提要:◆线性表的逻辑结构定义,对线性表定义的操作。
线性表的定义:⽤数据元素的有限序列表⽰◆线性表的存储结构:顺序存储结构和链式存储结构。
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。
链式存储结构: 其结点在存储器中的位置是随意的,即逻辑上相邻的数据元素在物理上不⼀定相邻。
通过指针来实现!◆线性表的操作在两种存储结构中的实现。
数据结构的基本运算:修改、插⼊、删除、查找、排序1)修改——通过数组的下标便可访问某个特定元素并修改之。
核⼼语句: V[i]=x;顺序表修改操作的时间效率是 O(1)2) 插⼊——在线性表的第i个位置前插⼊⼀个元素实现步骤:①将第n⾄第i 位的元素向后移动⼀个位置;②将要插⼊的元素写到第i个位置;③表长加1。
数据结构总结知识点数据结构是计算机科学领域中重要的概念之一,它涉及存储和组织数据的方法和技术。
数据结构对于程序的效率和性能至关重要,掌握数据结构的知识可以帮助开发者设计和实现高效的算法。
本文将总结数据结构的基本概念和常见的数据结构类型,帮助读者掌握数据结构的核心知识。
1. 数组(Array)数组是一种线性数据结构,它将相同类型的数据元素按一定的顺序存储在连续的内存空间中。
数组具有随机访问和快速查找的特性,但插入和删除元素的操作较慢。
数组的缺点是大小固定,插入和删除元素需要移动其他元素。
2. 链表(Linked List)链表是一种非连续的数据结构,它由节点组成,每个节点包含数据和指向下个节点的指针。
链表支持快速插入和删除元素,但查找元素的效率较低。
链表可以分为单向链表和双向链表,双向链表在节点中同时保存前向和后向指针,可以更方便地进行双向遍历。
3. 栈(Stack)栈是一种后进先出(LIFO)的数据结构,它只允许在表的一端进行插入和删除操作。
栈可以通过数组或链表实现,常见的栈操作包括入栈(push)和出栈(pop)。
栈常用于实现函数调用、表达式求值和括号匹配等应用场景。
4. 队列(Queue)队列是一种先进先出(FIFO)的数据结构,它允许在一端进行入队(enqueue)操作,在另一端进行出队(dequeue)操作。
队列可以通过数组或链表实现,常见的队列包括普通队列和优先队列。
优先队列根据优先级决定元素的出队顺序。
5. 树(Tree)树是一种非线性的数据结构,它由节点和边组成。
树的一端称为根节点,其他节点分为内部节点和叶子节点。
树的特点是每个节点可以有多个子节点,但每个节点只有一个父节点。
常见的树结构包括二叉树、二叉搜索树、平衡二叉树(AVL树、红黑树)等。
6. 图(Graph)图是一种由节点和边构成的数据结构,它可以用来表示各种实体之间的关系。
图可以分为有向图和无向图,边可以带有权重。
图的常见算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。
第一章概论数据就就是指能够被计算机识别、存储与加工处理得信息得载体。
数据元素就是数据得基本单位,可以由若干个数据项组成。
数据项就是具有独立含义得最小标识单位。
数据结构得定义:逻辑结构:从逻辑结构上描述数据,独立于计算机。
线性结构:一对一关系。
线性结构:多对多关系。
存储结构:就是逻辑结构用计算机语言得实现。
顺序存储结构:如数组。
链式存储结构:如链表。
索引存储结构:稠密索引:每个结点都有索引项。
稀疏XX:每组结点都有XX项。
散列存储结构:如散列表。
数据运算。
对数据得操作。
定义在逻辑结构上,每种逻辑结构都有一个运算集合。
常用得有:检索、插入、删除、更新、排序。
数据类型:就是一个值得集合以及在这些值上定义得一组操作得总称。
结构类型:由用户借助于描述机制定义,就是导出类型。
抽象数据类型ADT:就是抽象数据得组织与与之得操作。
相当于在概念层上描述问题。
优点就是将数据与操作封装在一起实现了信息隐藏。
程序设计得实质就是对实际问题选择一种好得数据结构,设计一个好得算法。
算法取决于数据结构。
算法就是一个良定义得计算过程,以一个或多个值输入,并以一个或多个值输出。
评价算法得好坏得因素:算法就是正确得;执行算法得时间;执行算法得存储空间(主要就是辅助存储空间);算法易于理解、编码、调试。
时间复杂度:就是某个算法得时间耗费,它就是该算法所求解问题规模得函数。
渐近时间复杂度:就是指当问题规模趋向无穷大时,该算法时间复杂度得数量级。
评价一个算法得时间性能时,主要标准就就是算法得渐近时间复杂度。
算法中语句得频度不仅与问题规模有关,还与输入实例中各元素得取值相关。
时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O (Iog2n)、线性阶O (n)、线性对数阶0(nIog2n)、平方阶0(n八2)、方阶0(n A3)、……次方阶0 5你)、指数阶0 (2A n)。
空间复杂度:就是某个算法得空间耗费,它就是该算法所求解问题规模得函数。
数据结构知识点总结数据结构是计算机科学中非常重要的一个领域,它主要研究数据的组织、存储和管理方式,以便能够高效地对数据进行操作和处理。
下面将对一些常见的数据结构知识点进行总结。
一、数组数组是一种线性的数据结构,它将相同类型的元素存储在连续的内存空间中。
数组具有以下特点:1、随机访问:可以通过索引在常数时间内访问数组中的任意元素。
2、插入和删除操作效率低:在数组中间插入或删除元素需要移动大量的元素,因此时间复杂度较高。
数组适用于需要频繁随机访问元素,并且元素数量相对固定的情况。
二、链表链表是一种非连续存储的数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。
链表分为单向链表、双向链表和循环链表。
1、单向链表:每个节点只有一个指向下一个节点的指针,只能单向遍历。
2、双向链表:节点既有指向下一个节点的指针,又有指向上一个节点的指针,可以双向遍历。
3、循环链表:尾节点的指针指向头节点,形成一个环。
链表的优点是插入和删除操作效率高,只需修改指针即可,时间复杂度为 O(1)。
但随机访问效率低,需要从头节点开始遍历才能找到指定元素。
三、栈栈是一种特殊的线性表,遵循“后进先出”(Last In First Out,LIFO)的原则。
可以用数组或链表实现。
栈的基本操作包括入栈(push)和出栈(pop)。
入栈将元素添加到栈顶,出栈从栈顶取出元素。
栈常用于函数调用、表达式求值、括号匹配等场景。
四、队列队列遵循“先进先出”(First In First Out,FIFO)的原则。
也可以用数组或链表实现。
队列的基本操作有入队(enqueue)和出队(dequeue)。
入队将元素添加到队尾,出队从队头取出元素。
队列常用于任务调度、消息传递、广度优先搜索等。
五、树树是一种非线性的数据结构,具有层次关系。
常见的树结构有二叉树、二叉搜索树、AVL 树、红黑树等。
1、二叉树:每个节点最多有两个子节点,分别称为左子节点和右子节点。
数据结构(公式及要点汇总)数据结构(公式及要点汇总)在计算机科学中,数据结构是指一种组织数据的方式。
它涉及到各种算法和操作,以及与之相关的存储结构。
数据结构对于解决实际问题非常重要,因为它可以帮助我们高效地存储和访问数据。
下面是一些常见的数据结构及其相关要点和公式的汇总:一、数组(Array)- 数组是一种线性数据结构,用于存储相同类型的元素。
- 数组的长度在创建时确定,并且在运行时不能更改。
- 元素可以通过索引访问,索引从0开始。
- 相关公式:1. 访问元素:arr[i]2. 插入元素:arr[index] = value3. 删除元素:arr[index] = null二、链表(Linked List)- 链表也是一种线性数据结构,但与数组不同,它的元素没有连续的存储空间。
- 每个元素包含数据和指向下一个元素的指针。
- 相关公式:1. 访问元素:node.value2. 插入元素:newNode.next = currentNode.next; currentNode.next = newNode3. 删除元素:prevNode.next = currentNode.next三、栈(Stack)- 栈是一种后进先出(LIFO)的数据结构。
- 只允许在栈的顶部进行插入和删除操作。
- 相关公式:1. 入栈:push(element)2. 出栈:pop()3. 取栈顶元素:top()四、队列(Queue)- 队列是一种先进先出(FIFO)的数据结构。
- 只允许在队列的一端插入元素(入队列),在另一端删除元素(出队列)。
- 相关公式:1. 入队列:enqueue(element)2. 出队列:dequeue()3. 取队首元素:front()五、树(Tree)- 树是一种非线性数据结构,由节点和边组成。
- 每个节点可以有零个或多个子节点。
- 相关公式:1. 遍历方式:前序遍历、中序遍历、后序遍历2. 计算节点数:countNodes(node)3. 计算树的高度:height(node)六、图(Graph)- 图是一种由节点和边组成的非线性数据结构。
数据结构(C语言版)重点知识汇总1. 线性结构数组•数组是一种线性结构,它的每个元素占据一段连续的内存空间;•数组的下标是从0开始的;•数组可以存储同类型的元素,支持随机访问和修改。
链表•链表也是一种线性结构,其元素是以节点的方式逐个存储在内存中;•节点包含元素和指向下一个节点的指针;•链表优点是可以动态增加或删除元素,缺点是访问和修改元素比较麻烦,需要遍历链表。
栈和队列•栈和队列是两种特殊的线性结构;•栈和队列都是通过数组或者链表实现的;•栈的特点是先进后出,可以用于进行函数调用、表达式求值等;•队列的特点是先进先出,可以用于模拟排队、网络数据传输等。
2. 树形结构二叉树•二叉树是一种特殊的树形结构,树中的每个节点最多有两个孩子节点;•二叉树可以是满二叉树、完全二叉树或者普通的二叉树;•遍历二叉树的方法有前序遍历、中序遍历和后序遍历。
二叉搜索树•二叉搜索树也是一种二叉树,具有以下性质:–左子树上的元素都小于根节点的元素;–右子树上的元素都大于根节点的元素;–左右子树也是二叉搜索树。
•二叉搜索树可以用于搜索、排序等算法。
平衡二叉树•平衡二叉树是一种强制性要求左右子树高度差不超过1的二叉树;•平衡二叉树可以在保持搜索树特性的同时,提高搜索效率。
堆•堆也是一种树形结构,常用于实现优先队列;•堆分为最大堆和最小堆,最大堆的根节点最大,最小堆的根节点最小;•堆的插入和删除操作能够始终保证堆的性质。
3. 图形结构图的基本概念•图由节点和边两个基本元素组成;•节点也被称为顶点,边连接两个顶点;•图分为有向图和无向图,有向图中的边是有方向性的;•图还有一些特殊的概念,如权重、连通性、环等。
图的存储结构•图的存储结构有邻接矩阵、邻接表和十字链表三种常见的形式;•邻接矩阵利用二维数组来表示节点之间的关系;•邻接表利用链表来存储节点和其邻居节点的关系;•十字链表进一步扩展了邻接表的概念,可以处理有向图和无向图的情况。
数据结构知识点总结数据结构是计算机科学中一个非常关键的概念,它涵盖了一系列组织和管理数据的方法和技巧。
在计算机科学领域中,数据结构是构建和优化算法的基础,对于解决复杂问题以及实现高效的计算和存储非常重要。
这篇文章将总结数据结构的一些关键知识点。
一、基本概念1.数据和数据元素:数据是对客观事物的符号表示,数据元素时数据的基本单位。
2.数据类型:数据类型是一组值和定义在这组值上的操作的集合。
常见的数据类型包括整型、浮点型、字符型等。
3.逻辑结构:逻辑结构描述数据元素之间的关系,包括线性结构、树形结构、图形结构等。
二、线性表1. 单链表:单链表是一种线性表的链式实现方式,每个节点包含一个数据元素和一个指向下一个节点的指针。
2. 双链表:双链表是在单链表的基础上每个节点增加一个指向上一个节点的指针。
3. 循环链表:循环链表是一种特殊的链表,尾节点的指针指向头节点,形成一个环。
4. 静态链表:静态链表使用数组来实现链表的结构,通过指针来连接数组中的元素。
三、栈和队列1. 栈是一种后进先出(LIFO)的数据结构,只能在一端进行插入和删除操作。
2. 队列是一种先进先出(FIFO)的数据结构,可以在一端插入元素,在另一端删除元素。
3. 双端队列:双端队列支持在队列的两端插入和删除操作。
4. 优先队列:优先队列中的元素按照一定的优先级进行排列,插入和删除操作都会考虑元素的优先级。
四、树和二叉树1. 树是一种非线性的数据结构,由节点和边组成,每个节点可能有零个或多个子节点。
2. 二叉树是一种特殊的树结构,每个节点最多有两个子节点。
3. 二叉搜索树:二叉搜索树的左子树的值都小于根节点的值,右子树的值都大于根节点的值。
4. 平衡二叉树:平衡二叉树是一种高度平衡的二叉搜索树,左右子树的高度差不超过1。
5. 堆:堆是一种特殊的二叉树,具有一定的顺序特性,常用来实现优先队列。
五、图1. 图是一种非线性的数据结构,由节点和边组成,用来表示多对多的关系。
第一章数据结构概述基本概念与术语1.数据:数据是用来描述现实世界的文字,字符,图像,声音,以及能够输入到计算机中并能被计算机处理的符号。
2.数据元素:数据元素是数据的基本单位,是数据这个集合中的个体,也称之为元素,结点,顶点记录。
(补充:一个数据元素可由若干个数据项组成。
数据项是数据的不可分割的最小单位。
)3.数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
(有时候也叫做属性。
)4.数据结构:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
(1)数据的逻辑结构:数据的逻辑结构是指数据元素之间存在的固有逻辑关系,常称为数据结构。
数据的逻辑结构是从数据元素之间存在的逻辑关系上描述数据与数据的存储无关,是独立于计算机的。
依据数据元素之间的关系,可以把数据的逻辑结构分成以下几种:a.集合:数据中的数据元素之间除了“同属于一个集合“的关系以外,没有其他关系。
b.线性结构:结构中的数据元素之间存在“一对一“的关系。
若结构为非空集合,则除了第一个元素之外,和最后一个元素之外,其他每个元素都只有一个直接前驱和一个直接后继。
c.树形结构:结构中的数据元素之间存在“一对多“的关系。
若数据为非空集,则除了第一个元素(根)之外,其它每个数据元素都只有一个直接前驱,以及多个或零个直接后继。
d.图状结构:结构中的数据元素存在“多对多”的关系。
若结构为非空集,折每个数据可有多个(或零个)直接后继。
(2)数据的存储结构:数据元素及其关系在计算机内的表示称为数据的存储结构。
想要计算机处理数据,就必须把数据的逻辑结构映射为数据的存储结构。
逻辑结构可以映射为以下两种存储结构:a.顺序存储结构:把逻辑上相邻的数据元素存储在物理位置也相邻的存储单元中,借助元素在存储器中的相对位置来表示数据之间的逻辑关系。
b.链式存储结构:借助指针表达数据元素之间的逻辑关系。
不要求逻辑上相邻的数据元素物理位置上也相邻。
5.时间复杂度分析:a.常量阶:算法的时间复杂度与问题规模n无关系T(n)=O(1)b.线性阶:算法的时间复杂度与问题规模n成线性关系T(n)=O(n)c.平方阶和立方阶:一般为循环的嵌套,循环体最后条件为i++时间复杂度的大小比较:O(1)< O(log 2 n)< O(n )< O(n log 2 n)< O(n2)< O(n3)< O(2 n )<O(n!)<O(n n)6.算法与程序:(1)算法的5个特性a、输入:有零个或多个输入b、输出:有一个或多个输出c、有穷性:要求序列中的指令是有限的;每条指令的执行包含有限的工作量;整个指令序列的执行在有限的时间内结束。
数据结构知识点概括第一章概论数据就是指能够被计算机识别、存储和加工处理的信息的载体。
数据元素是数据的基本单位,可以由若干个数据项组成。
数据项是具有独立含义的最小标识单位。
数据结构的定义:·逻辑结构:从逻辑结构上描述数据,独立于计算机。
·线性结构:一对一关系。
·线性结构:多对多关系。
·存储结构:是逻辑结构用计算机语言的实现。
·顺序存储结构:如数组。
·链式存储结构:如链表。
·索引存储结构:·稠密索引:每个结点都有索引项。
·稀疏索引:每组结点都有索引项。
·散列存储结构:如散列表。
·数据运算。
·对数据的操作。
定义在逻辑结构上,每种逻辑结构都有一个运算集合。
·常用的有:检索、插入、删除、更新、排序。
数据类型:是一个值的集合以及在这些值上定义的一组操作的总称。
·结构类型:由用户借助于描述机制定义,是导出类型。
抽象数据类型ADT:·是抽象数据的组织和与之的操作。
相当于在概念层上描述问题。
·优点是将数据和操作封装在一起实现了信息隐藏。
程序设计的实质是对实际问题选择一种好的数据结构,设计一个好的算法。
算法取决于数据结构。
算法是一个良定义的计算过程,以一个或多个值输入,并以一个或多个值输出。
评价算法的好坏的因素:·算法是正确的;·执行算法的时间;·执行算法的存储空间(主要是辅助存储空间);·算法易于理解、编码、调试。
时间复杂度:是某个算法的时间耗费,它是该算法所求解问题规模n的函数。
渐近时间复杂度:是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。
评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度。
算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。
时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、……k次方阶O(n^k)、指数阶O(2^n)。
空间复杂度:是某个算法的空间耗费,它是该算法所求解问题规模n的函数。
算法的时间复杂度和空间复杂度合称算法复杂度。
第二章线性表线性表是由n≥0个数据元素组成的有限序列。
n=0是空表;非空表,只能有一个开始结点,有且只能有一个终端结点。
线性表上定义的基本运算:·构造空表:Initlist(L)·求表长:Listlength(L)·取结点:GetNode(L,i)·查找:LocateNode(L,x)·插入:InsertList(L,x,i)·删除:Delete(L,i)顺序表是按线性表的逻辑结构次序依次存放在一组地址连续的存储单元中。
在存储单元中的各元素的物理位置和逻辑结构中各结点相邻关系是一致的。
地址计算:LOCa(i)=LOCa(1)+(i-1)*d;(首地址为1)在顺序表中实现的基本运算:·插入:平均移动结点次数为n/2;平均时间复杂度均为O(n)。
·删除:平均移动结点次数为(n-1)/2;平均时间复杂度均为O(n)。
线性表的链式存储结构中结点的逻辑次序和物理次序不一定相同,为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还存储了其后继结点的地址信息(即指针或链)。
这两部分信息组成链表中的结点结构。
一个单链表由头指针的名字来命名。
单链表运算:·建立单链表·头插法:s->next=head;head=s;生成的顺序与输入顺序相反。
平均时间复杂度均为O(n)。
·尾插法:head=rear=null;if(head=null)head=s;else r->next=s;r=s;平均时间复杂度均为O(n)·加头结点的算法:对开始结点的操作无需特殊处理,统一了空表和非空表。
·查找·按序号:与查找位置有关,平均时间复杂度均为O(n)。
·按值:与输入实例有关,平均时间复杂度均为O(n)。
·插入运算:p=GetNode(L,i-1);s->next=p->next;p->next=s;平均时间复杂度均为O(n)·删除运算:p=GetNode(L,i-1);r=p->next;p->next=r->next;free(r);平均时间复杂度均为O(n)单循环链表是一种首尾相接的单链表,终端结点的指针域指向开始结点或头结点。
链表终止条件是以指针等于头指针或尾指针。
采用单循环链表在实用中多采用尾指针表示单循环链表。
优点是查找头指针和尾指针的时间都是O(1),不用遍历整个链表。
双链表就是双向链表,就是在单链表的每个结点里再增加一个指向其直接前趋的指针域prior,形成两条不同方向的链。
由头指针head惟一确定。
双链表也可以头尾相链接构成双(向)循环链表。
双链表上的插入和删除时间复杂度均为O (1)。
顺序表和链表的比较:·基于空间:·顺序表的存储空间是静态分配,存储密度为1;适于线性表事先确定其大小时采用。
·链表的存储空间是动态分配,存储密度<1;适于线性表长度变化大时采用。
·基于时间:·顺序表是随机存储结构,当线性表的操作主要是查找时,宜采用。
·以插入和删除操作为主的线性表宜采用链表做存储结构。
·若插入和删除主要发生在表的首尾两端,则宜采用尾指针表示的单循环链表。
第三章栈和队列栈(Stack)是仅限制在表的一端进行插入和删除运算的线性表,称插入、删除这一端为栈顶,另一端称为栈底。
表中无元素时为空栈。
栈的修改是按后进先出的原则进行的,我们又称栈为LIFO表(Last In First Out)。
通常栈有顺序栈和链栈两种存储结构。
栈的基本运算有六种:·构造空栈:InitStack(S)·判栈空:StackEmpty(S)·判栈满:StackFull(S)·进栈:Push(S,x)·退栈:Pop(S)·取栈顶元素:StackTop(S)在顺序栈中有“上溢”和“下溢”的现象。
·“上溢”是栈顶指针指出栈的外面是出错状态。
·“下溢”可以表示栈为空栈,因此用来作为控制转移的条件。
顺序栈中的基本操作有六种:·构造空栈·判栈空·判栈满·进栈·退栈·取栈顶元素链栈则没有上溢的限制,因此进栈不要判栈满。
链栈不需要在头部附加头结点,只要有链表的头指针就可以了。
链栈中的基本操作有五种:·构造空栈·判栈空·进栈·退栈·取栈顶元素队列(Queue)是一种运算受限的线性表,插入在表的一端进行,而删除在表的另一端进行,允许删除的一端称为队头(front),允许插入的一端称为队尾(rear),队列的操作原则是先进先出的,又称作FIFO表(First InFirst Out).队列也有顺序存储和链式存储两种存储结构。
队列的基本运算有六种:·置空队:InitQueue(Q)·判队空:QueueEmpty(Q)·判队满:QueueFull(Q)·入队:EnQueue(Q,x)·出队:DeQueue(Q)·取队头元素:QueueFront(Q)顺序队列的“假上溢”现象:由于头尾指针不断前移,超出向量空间。
这时整个向量空间及队列是空的却产生了“上溢”现象。
为了克服“假上溢”现象引入循环向量的概念,是把向量空间形成一个头尾相接的环形,这时队列称循环队列。
判定循环队列是空还是满,方法有三种:·一种是另设一个布尔变量来判断;·第二种是少用一个元素空间,入队时先测试((rear+1)%m = front)?满:空;·第三种就是用一个计数器记录队列中的元素的总数。
队列的链式存储结构称为链队列,一个链队列就是一个操作受限的单链表。
为了便于在表尾进行插入(入队)的操作,在表尾增加一个尾指针,一个链队列就由一个头指针和一个尾指针唯一地确定。
链队列不存在队满和上溢的问题。
在链队列的出队算法中,要注意当原队中只有一个结点时,出队后要同进修改头尾指针并使队列变空。
第四章串串是零个或多个字符组成的有限序列。
·空串:是指长度为零的串,也就是串中不包含任何字符(结点)。
·空白串:指串中包含一个或多个空格字符的串。
·在一个串中任意个连续字符组成的子序列称为该串的子串,包含子串的串就称为主串。
·子串在主串中的序号就是指子串在主串中首次出现的位置。
·空串是任意串的子串,任意串是自身的子串。
串分为两种:·串常量在程序中只能引用不能改变;·串变量的值可以改变。
串的基本运算有:·求串长strlen(char*s)·串复制strcpy(char*to,char*from)·串联接strcat(char*to,char*from)·串比较charcmp(char*s1,char*s2)·字符定位strchr(char*s,charc)串是特殊的线性表(结点是字符),所以串的存储结构与线性表的存储结构类似。
串的顺序存储结构简称为顺序串。
顺序串又可按存储分配的不同分为:·静态存储分配:直接用定长的字符数组来定义。
优点是涉及串长的操作速度快,但不适合插入、链接操作。
·动态存储分配:是在定义串时不分配存储空间,需要使用时按所需串的长度分配存储单元。
串的链式存储就是用单链表的方式存储串值,串的这种链式存储结构简称为链串。
链串与单链表的差异只是它的结点数据域为单个字符。
为了解决“存储密度”低的状况,可以让一个结点存储多个字符,即结点的大小。
顺序串上子串定位的运算:又称串的“模式匹配”或“串匹配”,是在主串中查找出子串出现的位置。
在串匹配中,将主串称为目标(串),子串称为模式(串)。
这是比较容易理解的,串匹配问题就是找出给定模式串P在给定目标串T 中首次出现的有效位移或者是全部有效位移。
最坏的情况下时间复杂度是O((n-m+1)m),假如m与n同阶的话则它是O(n^2)。
链串上的子串定位运算位移是结点地址而不是整数第五章多维数组数组一般用顺序存储的方式表示。
存储的方式有:·行优先顺序,也就是把数组逐行依次排列。