还剩58页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
数据结构与算法设计欢迎来到数据结构课程!本课程将带领您探索计算机科学中最核心的概念之一——数据结构我们将系统学习如何组织、管理和处理数据,以及如何设计高效的算法来解决复杂问题在接下来的学习中,我们将从基础概念开始,逐步深入到各种复杂的数据结构和算法,包括线性结构、树形结构、图形结构以及各种查找和排序技术这些知识将是您未来软件开发和算法设计的坚实基础准备好开始这段激动人心的学习旅程了吗?让我们一起探索数据的奥秘!课程目标和学习成果掌握核心概念深入理解数据结构的基本原理和设计思想,能够分析不同数据结构的特点和适用场景实现基础算法能够独立实现各种经典数据结构和算法,并能根据实际问题选择合适的数据结构分析算法效率掌握算法分析方法,能够准确评估算法的时间复杂度和空间复杂度,优化算法性能解决实际问题培养算法思维,能够将数据结构和算法知识应用于解决实际编程和工程问题数据结构的基本概念什么是数据结构?逻辑结构与物理结构数据结构是计算机存储、组织数据的方式数据结构是指相互之逻辑结构是指数据对象中数据元素之间的相互关系,包括集合间存在一种或多种特定关系的数据元素的集合结构、线性结构、树形结构和图形结构简单来说,数据结构就是关系加数据元素,它研究的是数据的逻物理结构是指数据的逻辑结构在计算机中的存储形式,主要有辑结构和物理结构以及它们之间的相互关系顺序存储、链式存储、索引存储和散列存储算法与时间复杂度什么是算法时间复杂度算法是解决特定问题的一系列操时间复杂度用于衡量算法执行时作步骤好的算法应具备正确性、间与输入规模之间的关系,通常可行性、健壮性、高效性和易用用大O表示法表示常见的时间复性杂度有O
1、Olog n、On、On log n、On²、O2ⁿ等渐进分析渐进分析关注算法在输入规模趋于无穷大时的增长率,忽略常数因子和低阶项,只关注主导增长的项空间复杂度分析空间复杂度的概念用于衡量算法在执行过程中临时占用存储空间大小与问题规模的关系常见的空间复杂度包括O
1、On、On²等,分别代表常数级、线性级和平方级空间消耗时空权衡在实际应用中,需要在时间复杂度和空间复杂度之间找到平衡点线性表概述定义特点1线性表是具有相同数据类型的n个元素的有限序列,特点是除了首尾元素,其他元素都有一个直接前驱和直接后继基本操作2线性表的基本操作包括初始化、销毁、插入元素、删除元素、查找元素、修改元素、获取长度等存储方式3线性表主要有两种存储方式顺序存储结构(顺序表)和链式存储结构(链表)应用场景4线性表广泛应用于各种程序设计中,如学生信息管理、订单处理系统等场景顺序表的实现顺序表定义顺序表是在内存中用一组地址连续的存储单元依次存储线性表的各元素,使得线性表中逻辑相邻的元素在物理位置上也相邻实现方式通常使用数组实现,可分为静态分配(固定大小)和动态分配(可扩展)两种方式随机访问特性顺序表支持随机访问,可以在O1时间内访问任意位置的元素,这是其最大的优势操作效率分析插入和删除操作需要移动大量元素,时间复杂度为On;而查找和修改的时间复杂度则为O1链表的基本概念定义特点节点结构链表是一种线性表,它的特点是用一组物每个节点包含数据域和指针域,指针域用理位置任意的存储单元来存储数据元素于指向下一个节点灵活性动态分配插入和删除操作不需要移动大量元素,只链表的存储空间是动态分配的,不需要预需修改指针即可先分配大量空间单链表的操作插入操作删除操作查找操作在单链表中插入节点只需删除节点同样只需调整指单链表的查找必须从头节调整指针,时间复杂度为针,但要先找到目标节点点开始逐个遍历,直到找O1但需要先找到插入及其前驱节点使用单链到目标节点或到达链表末位置,所以总体时间复杂表时,通常需要保存前驱尾,时间复杂度为On度为On节点的信息遍历操作遍历单链表需要从头节点开始,沿着指针逐个访问每个节点,直到到达链表末尾,时间复杂度为On双向链表和循环链表双向链表循环链表双向链表中的每个节点包含两个指针一个指向前驱节点,一个循环链表是一种特殊的链表,其最后一个节点的指针指向头节点,指向后继节点这种结构使得可以从任意节点出发,方便地访问形成一个环循环链表可以是单向的,也可以是双向的其前驱和后继•没有表头和表尾的概念•查找效率与单链表相同•从任意节点出发可访问全部节点•插入删除操作更灵活•适合处理环形数据结构•占用更多的存储空间栈的概念和应用栈的特性与操作后进先出LIFO的数据结构,主要操作有push入栈和pop出栈典型应用场景函数调用、表达式求值、括号匹配、中缀转后缀表达式实现方式可通过顺序存储数组或链式存储链表实现栈的价值简化问题处理,提供回溯能力栈的顺序存储实现存储结构顺序栈通常使用一维数组来实现,同时使用一个变量top指示栈顶位置当top为-1时表示空栈,当top等于数组最大下标时表示栈满入栈操作入栈操作是指将新元素放入栈顶首先判断栈是否已满,若未满则将top加1,再将新元素存入top所指的位置时间复杂度为O1出栈操作出栈操作是指取出栈顶元素首先判断栈是否为空,若非空则取出top位置的元素,然后将top减1时间复杂度同样为O1顺序栈的特点顺序栈实现简单,操作高效,但存在存储空间不能动态调整的缺点,可能导致栈满溢出或空间浪费的问题栈的链式存储实现1存储结构链栈通常采用单链表实现,规定所有操作都在链表头部进行,链表的头部即为栈顶2入栈过程相当于在单链表头部插入节点,时间复杂度为O13出栈过程相当于删除单链表的首节点,时间复杂度同样为O14优缺点优点是不存在栈满的问题,空间可动态分配;缺点是需要额外的指针空间队列的概念和应用队列的特性基本操作先进先出FIFO的线性数据结构,只允许在主要操作有enqueue入队和dequeue出队,一端队尾添加元素,在另一端队首删除元分别在队尾添加元素和从队首移除元素素实现方式应用场景可通过顺序存储数组或链式存储链表实现,广度优先搜索、缓冲区管理、资源共享、消还有特殊的循环队列和双端队列息队列、打印任务排队、事件处理队列的顺序存储实现存储结构普通队列问题循环队列解决方案判空判满条件顺序队列通常使用一维数组实现,简单实现的顺序队列会出现假循环队列将数组首尾相连,形成循环队列中判空条件为并使用两个指针front和rear分别溢出问题随着元素不断入队逻辑上的环形结构,当rear到达front==rear,判满条件可以是指示队首和队尾位置出队,队首指针不断后移,前部数组末尾时,下一个位置绕回到rear+1%maxSize==front或使空间无法重复利用数组开头用额外计数变量队列的链式存储实现出队操作入队操作出队操作是删除队首节点,即删除链表的第链式队列结构链式队列的入队操作是在队尾添加新节点,一个节点先判断队列是否为空,若非空则链式队列通常使用带头指针和尾指针的单链即在链表尾部插入节点先创建新节点,将保存队首节点指针,将头指针指向第二个节表实现,头指针指向队首节点,尾指针指向新节点的指针域置为NULL,再将原队尾节点,释放原队首节点空间,若出队后队列为队尾节点这种结构不存在存储空间限制,点的指针指向新节点,最后更新尾指针指向空,需将尾指针也置为NULL可以根据需要动态分配内存新节点串的基本概念串的定义基本概念串(String)是由零个或多个字符组成的有限序列一般记为空串长度为零的串,表示为S=a₁a₂...a,其中S是串名,单引号括起来的是串值,n是串ₙ子串串中任意个连续字符组成的子序列的长度主串包含子串的串串是一种特殊的线性表,其数据元素仅由一个字符组成串与线性表的不同之处在于,线性表强调的是元素的个体性,而串强调串的位置字符在串中的序号,从0或1开始计数(不同编程语言的是元素的整体性有不同约定)串的比较两个串比较大小时,按照对应位置字符的编码值逐一比较串的存储结构顺序存储链式存储使用一组地址连续的存储单元采用链表方式存储串可以是存储串值的字符序列可分为每个节点存储一个字符,也可静态分配和动态分配两种方式以是每个节点存储多个字符静态存储容易出现溢出或空间(块链串)链式存储不易产浪费,而动态分配则更加灵活生溢出,但存储密度低,操作复杂块链存储将多个字符放在一个节点中,既提高了存储密度,又保持了链式存储的灵活性每个节点可以存放固定数量的字符,最后一个节点可能未被填满串的模式匹配算法朴素匹配算法(BF算法)最简单直观的匹配算法,采用穷举法,从主串的第一个字符开始,依次与模式串的字符进行比较时间复杂度为Om*n,其中m和n分别是主串和模式串的长度KMP算法一种改进的字符串匹配算法,充分利用已匹配的信息,避免重复匹配通过构建部分匹配表(next数组),实现主串指针不回溯时间复杂度降至Om+nBoyer-Moore算法一种高效的字符串搜索算法,采用从右向左匹配的方式利用坏字符规则和好后缀规则,实现跳跃式匹配在实际应用中,尤其是对于较长的字符串,效率通常优于KMP算法Sunday算法基于Boyer-Moore思想的一种改进算法,计算更简单它关注的是主串中参与匹配的最末位字符的下一位字符,根据该字符决定模式串的位移实际应用中常常表现出色数组的概念和存储数组的定义与特点多维数组的存储数组是由n个相同类型的数据元素组成的有限序列,是一种最基本多维数组在内存中实际上是以线性方式存储的,常见的存储方式的数据结构其特点是支持随机访问,可以在O1时间内访问任有行优先和列优先两种意位置的元素•行优先按行顺序存储,先存第一行,再存第二行,依此类推数组中的元素在逻辑上、物理上都是相邻的,这使得数组能够高效地进行遍历操作,但在插入和删除操作上效率较低,因为需要•列优先按列顺序存储,先存第一列,再存第二列,依此类推移动大量元素在C/C++等语言中通常采用行优先存储,而在Fortran等语言中则采用列优先存储特殊矩阵的压缩存储对称矩阵三角矩阵带状矩阵稀疏矩阵对称矩阵中a[i][j]=a[j][i],上下三角矩阵的下上带状矩阵的非零元素集稀疏矩阵中非零元素远只需存储主对角线及其三角区域元素全为同一中在主对角线周围的带少于零元素,可采用三上或下三角区域的元常数,只需存储非常数状区域内,只需存储该元组表、十字链表等结素,可将存储空间减少区域的元素和那个常数带状区域内的元素构存储,只记录非零元约一半值素的信息树的基本概念基本术语树的特点节点、根、父节点、子节点、兄弟节点、叶节点、节点的度、树树是一种非线性结构,每个节点的度、层次、深度、高度等可以有多个后继,但只有一个前树的定义驱(除根节点外)树是n个节点的有限集合,有一树的应用个特殊的节点称为根节点,其余节点可分为m个互不相交的子集,文件系统、组织结构、语法分析、每个子集又是一棵树决策支持、数据库索引等4二叉树的性质特殊二叉树满二叉树、完全二叉树、平衡二叉树等特殊形式数学性质节点数与叶节点数、深度与节点数的关系结构特点每个节点最多有两个子节点左子节点和右子节点基本定义二叉树是每个节点最多有两个子树的树结构二叉树的遍历前序遍历遍历顺序根节点→左子树→右子树先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树常用于创建树的拷贝或评估表达式中序遍历遍历顺序左子树→根节点→右子树先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树对于二叉搜索树,中序遍历可以得到有序的键值序列后序遍历遍历顺序左子树→右子树→根节点先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点常用于释放树的节点空间或求解表达式的值层序遍历按照从上到下、从左到右的顺序访问树的节点通常使用队列实现,先将根节点入队,然后出队一个节点,访问该节点,并将其左右子节点入队,如此循环直到队列为空二叉树的存储结构顺序存储使用一维数组存储二叉树,适用于完全二叉树节点位置与数组下标有对应关系若节点的下标为i,则其左子节点下标为2i,右子节点下标为2i+1,父节点下标为i/2(整除)链式存储使用带有指针域的节点结构,每个节点包含数据域、左子节点指针和右子节点指针这是最常用的存储方式,适合各种形态的二叉树,能够充分利用空间线索存储利用二叉树中的空指针域来存储节点的前驱和后继信息,形成线索二叉树这种结构便于直接找到某个节点的前驱和后继,提高遍历效率带父指针的存储在链式存储的基础上,每个节点增加一个指向父节点的指针这种结构便于从任一节点向上回溯到根节点,但增加了存储开销线索二叉树线索二叉树的概念线索化的类型线索二叉树是一种特殊的二叉树,它利用二叉树中的空指针域来根据线索化的遍历方式不同,线索二叉树可分为存储节点在某种遍历方式下的前驱和后继信息•前序线索二叉树按前序遍历顺序建立线索在普通二叉树中,n个节点有2n个指针域,其中只有n-1个指针被•中序线索二叉树按中序遍历顺序建立线索用来连接节点,剩余的n+1个指针域为空线索二叉树就是利用这•后序线索二叉树按后序遍历顺序建立线索些空指针域来存储额外的信息其中中序线索二叉树最为常用,因为它能够方便地实现按中序遍历顺序的非递归遍历,且无需使用栈树和森林树的表示法树可以使用双亲表示法、孩子表示法、孩子兄弟表示法等多种方式表示树与二叉树的转换任何一棵树都可以通过左孩子右兄弟表示法转换为二叉树森林与二叉树的转换森林是m棵互不相交的树的集合,可以将各棵树的根节点连接起来转换为二叉树树和森林的遍历树的先根遍历对应转换后二叉树的前序遍历,后根遍历对应中序遍历哈夫曼树及其应用带权路径长度问题哈夫曼树源于解决带权路径长度最小的问题,即WPL(Weighted PathLength)最小的二叉树每个叶节点都有一个权重,节点的带权路径长度是从根到该节点的路径长度与节点权重的乘积哈夫曼树的构造构造步骤先将所有节点视为仅有一个节点的二叉树,每次选择两个权值最小的树合并,新树的根节点权值为两子树根节点权值之和,重复此过程直到只剩一棵树哈夫曼编码根据哈夫曼树可以生成最优前缀码,用于数据压缩编码方法是从根到叶节点的路径上,左分支记为0,右分支记为1,路径上的编码序列即为该叶节点的哈夫曼编码应用领域4哈夫曼编码广泛应用于数据压缩,如文本压缩、图像压缩(JPEG)、视频压缩(MPEG)等还应用于网络传输中的数据编码,以提高传输效率和降低带宽消耗二叉搜索树基本性质查找操作插入操作二叉搜索树(BST)是一种特殊的从根节点开始,如果目标值等于插入新节点时,先执行查找过程二叉树,其中每个节点的值大于当前节点值,则查找成功;如果定位插入位置,然后在适当的位其左子树中的任意节点值,小于小于当前节点值,则在左子树中置创建新节点插入操作不会改其右子树中的任意节点值这种继续查找;如果大于当前节点值,变树的排序性质,也不需要调整排序性质使得查找、插入和删除则在右子树中继续查找平均时树的结构平均时间复杂度同样操作能够高效进行间复杂度为Olog n为Olog n删除操作删除节点时,需要考虑三种情况节点是叶节点、节点有一个子节点、节点有两个子节点最复杂的是第三种情况,通常的做法是找到该节点的中序后继或前驱来替代被删除的节点平衡二叉树(树)AVLAVL树的定义与平衡因子平衡维护操作AVL树是一种自平衡的二叉搜索树,其中任意节点的左右子树高度AVL树主要通过四种旋转操作来维护平衡差不超过1每个节点都有一个平衡因子,等于右子树高度减去左•左旋(LL旋转)适用于右子树过高的情况子树高度,平衡因子的取值只能是-
1、0或1•右旋(RR旋转)适用于左子树过高的情况当在AVL树中插入或删除节点后,可能会导致某些节点的平衡因子•先左后右旋(LR旋转)适用于左子树的右子树过高超出范围,此时需要通过旋转操作来恢复平衡•先右后左旋(RL旋转)适用于右子树的左子树过高通过这些旋转操作,AVL树能够在插入和删除操作后保持平衡,从而保证树的高度始终接近log n,使得查找、插入和删除操作的时间复杂度都保持在Olog n红黑树红黑树的性质平衡操作红黑树是一种自平衡的二叉搜索树,红黑树通过颜色变换和旋转操作来维它在每个节点上增加了一个存储位来护平衡插入新节点时,首先将其着表示节点的颜色,可以是红色或黑色为红色,然后通过一系列的颜色调整红黑树满足五个关键性质1每个节和旋转操作,使树重新满足红黑树的点是红色或黑色;2根节点是黑色;所有性质删除节点时,处理方式类3每个叶节点(NIL)是黑色;4如似,但更为复杂果一个节点是红色,则其两个子节点都是黑色;5从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点与AVL树的比较与AVL树相比,红黑树在插入和删除操作上的旋转次数更少,平均性能更优;但红黑树的平衡条件较为宽松,树的高度可能略大于AVL树,导致查找操作可能稍慢在实际应用中,红黑树因其插入删除的高效性,被广泛用于各种系统和库中树和树B B+B树概述B+树特点B树是一种多路平衡查找树,其每个节点可以拥有多个子节点B B+树是B树的一种变体,与B树的主要区别在于树的阶为m时,除根节点外的每个节点至少有m/2(向上取整)个•非叶节点只存储关键字信息,不存储数据;所有数据都存储在子节点,至多有m个子节点叶节点中B树的特点是所有叶节点都在同一层,每个节点按关键字升序排列,•所有叶节点之间用指针连接形成链表,方便顺序遍历并包含指向子节点的指针B树的高度通常较小,适合磁盘等外部•每个关键字在树中只出现一次,但可能出现在叶节点和内部节存储设备的存取方式点中B+树的这些特点使其特别适合于数据库索引和文件系统的实现它能高效支持范围查询,且在磁盘IO方面表现优异图的基本概念图的定义图的分类图G由顶点集V和边集E组成,记为G=V,E图是一种非线性数据结构,根据边的方向性,图可分为有向图和无向图;根据边是否带权,可分为带用于表示物体之间的关系,其中顶点表示物体,边表示物体之间的关系权图(网络)和无权图;还有特殊的图如完全图、连通图、生成树、二分图等图的基本术语图的应用度与顶点相关联的边的数量,在有向图中分为入度和出度;路径从一图在实际中有广泛应用,如交通网络、社交网络、电路设计、网页链接分个顶点到另一个顶点经过的边的序列;环起点和终点相同的路径;连通析、资源调度等领域都可以用图来建模和分析图任意两个顶点之间都存在路径图的存储结构邻接矩阵邻接表使用二维数组表示图中顶点之间的关系,每个顶点有一个链表,存储与其相邻的顶空间复杂度为O|V|²点,空间复杂度为O|V|+|E|邻接多重表十字链表专为无向图设计,每条边只存储一次,便专为有向图设计,同时表示出度和入度关于对边的操作系,便于查找前驱和后继图的遍历深度优先搜索DFS基本概念深度优先搜索DFS是一种图遍历算法,它沿着一条路径尽可能深入地探索,直到无法继续前进,然后回溯到前一个还有未探索路径的节点,继续探索实现方式DFS通常通过递归或栈来实现递归实现简洁直观,而栈实现则可以避免递归带来的函数调用开销两种实现方式在逻辑上是等价的应用场景DFS广泛应用于路径查找、拓扑排序、连通性分析、查找强连通分量、解决迷宫问题等场景,是图论中的基础算法之一复杂度分析使用邻接表表示的图,DFS的时间复杂度为O|V|+|E|,其中|V|是顶点数,|E|是边数;使用邻接矩阵,时间复杂度为O|V|²图的遍历广度优先搜索1BFS基本概念广度优先搜索BFS是一种图遍历算法,它从起始顶点开始,先访问所有邻接顶点,然后再从这些邻接顶点出发访问它们的邻接顶点,以此类推,直到图中所有可达顶点都被访问实现方式BFS通常使用队列数据结构实现它首先将起始顶点入队,然后循环执行以下操作从队列中取出一个顶点,访问它,并将其所有未访问的邻接顶点入队这个过程一直持续到队列为空应用场景3BFS适用于寻找最短路径(无权图)、二分图检测、连通性分析、网络爬虫、社交网络分析等场景它总是能找到从起点到目标点的最短路径(以边的数量计算)复杂度分析与DFS类似,使用邻接表表示的图,BFS的时间复杂度为O|V|+|E|;使用邻接矩阵表示的图,时间复杂度为O|V|²空间复杂度主要是队列的开销,为O|V|最小生成树算法Prim算法基本思想Prim算法是一种解决最小生成树问题的贪心算法它从一个起始顶点开始,逐步扩展生成树,每次选择一条权值最小的边,将一个新的顶点加入到生成树中,直到所有顶点都被纳入生成树算法执行步骤
1.选择任意一个顶点作为起始点,加入生成树集合S
2.初始化一个数组表示从集合S到其他各顶点的最小权值边
3.循环执行以下操作直到所有顶点都加入S找出权值最小的边及其对应的顶点,将该顶点加入S,并更新最小权值数组算法特点与复杂度Prim算法特别适用于稠密图(边较多)的情况使用邻接矩阵实现时,时间复杂度为O|V|²;使用优先队列优化后,时间复杂度可降至O|E|log|V|其空间复杂度为O|V|最小生成树算法KruskalKruskal算法是一种贪心算法,用于寻找最小生成树它的基本思想是按照边的权值从小到大的顺序选择边,只要不形成环路就将该边加入到生成树中,直到选择了n-1条边(n为顶点数)该算法通常使用并查集来检测环路,其时间复杂度主要取决于对边的排序,为O|E|log|E|,其中|E|是边的数量Kruskal算法特别适用于稀疏图(边较少)的情况与Prim算法相比,两者都能找到最小生成树,但在不同的图密度下性能表现不同最短路径算法Dijkstra1算法目标Dijkstra算法用于解决带正权图的单源最短路径问题,即从一个源点到图中所有其他顶点的最短路径2基本思想采用贪心策略,每次选择当前未确定的顶点中距离源点最近的顶点,将其纳入已确定集合3实现方法使用优先队列可以提高算法效率,降低时间复杂度至O|E|log|V|4应用限制仅适用于所有边权值为非负的图,不能处理含负权边的图最短路径算法Floyd拓扑排序拓扑排序的定义实现算法拓扑排序是对有向无环图DAG的所有顶点进行线性排序,使得对拓扑排序主要有两种实现方法于图中的每一条有向边u,v,顶点u在排序中都出现在顶点v之前•Kahn算法基于BFS,每次选择入度为0的顶点,将其移除并更新其邻接顶点的入度简单来说,拓扑排序就是将图中所有顶点排成一个线性序列,使•DFS算法利用DFS的特性,在DFS的过程中,当一个顶点搜得图中任意一条边u,v对应的顶点u和v在序列中u都出现在v之前索完成(即没有未访问的邻接顶点)时,将其加入结果集的头部需要注意的是,拓扑排序只适用于有向无环图,如果图中存在环,则无法进行拓扑排序关键路径AOE网络模型活动-边表示(Activity OnEdge)网络是一种带权有向无环图,用于表示工程中各活动之间的依赖关系顶点表示事件(活动的开始或结束),边表示活动,权值表示活动持续时间最早发生时间与最迟发生时间事件的最早发生时间ve[i]是从源点到顶点i的最长路径长度;事件的最迟发生时间vl[i]是在不延误工程完成的前提下,事件i允许发生的最迟时间活动的时间参数活动的最早开始时间e[i]等于其起点事件的最早发生时间;活动的最迟开始时间l[i]等于其终点事件的最迟发生时间减去活动持续时间关键活动与关键路径活动的时间余量d[i]=l[i]-e[i]表示活动可以推迟的时间当d[i]=0时,该活动为关键活动,关键活动构成的路径即为关键路径,它决定了整个工程的最短完成时间排序算法概述排序算法最佳时间复杂度平均时间复杂度最差时间复杂度空间复杂度稳定性冒泡排序On On²On²O1稳定选择排序On²On²On²O1不稳定插入排序On On²On²O1稳定希尔排序On log n On logn On²O1不稳定快速排序On lognOn lognOn²Olog n不稳定插入排序基本思想插入排序的工作原理类似于玩扑克牌时的整理牌方式它将数组分为已排序和未排序两部分,初始时已排序部分只有一个元素然后逐一将未排序部分的元素插入到已排序部分的适当位置,直到所有元素都被纳入已排序部分算法步骤具体实现时,通常从数组的第二个元素开始,将其与前面已排序部分的元素从后向前比较,找到合适的位置插入在比较过程中,如果当前元素小于已排序部分的某个元素,则将该已排序元素后移一位,为当前元素腾出位置这个过程一直持续,直到找到一个不大于当前元素的已排序元素,或者已比较完所有已排序元素性能分析插入排序的时间复杂度为On²,空间复杂度为O1它是一种稳定的排序算法,适用于小规模数据集或基本有序的数据当数据规模较小时,插入排序可能比一些理论上更高效的算法(如快速排序、归并排序)还要快,因为它的常数因子小、实现简单希尔排序希尔排序是插入排序的一种改进版本,也称为缩小增量排序它通过将整个数据集分割成若干个子序列,分别进行插入排序,逐步缩小增量直至为1,最终完成整个数据集的排序希尔排序的关键在于增量序列的选择常用的增量序列有希尔增量序列n/2,n/4,...,
1、Hibbard增量序列2^k-1,...,3,1和Sedgewick增量序列等不同的增量序列会导致不同的时间复杂度,但总体上希尔排序的平均时间复杂度为Onlog²n,空间复杂度为O1希尔排序是不稳定的排序算法,但在中等规模的数据排序中表现良好选择排序1基本思想2算法步骤选择排序是一种简单直观的排序算在具体实现时,外层循环控制已排法它的工作原理是首先在未排序部分的增长,每次循环将未排序序序列中找到最小(或最大)元素,部分的最小值放到已排序部分的末存放到排序序列的起始位置,然后尾;内层循环用于在未排序部分中再从剩余未排序元素中继续寻找最查找最小值算法的每一轮都会将小(或最大)元素,放到已排序序一个元素放置到其最终位置,因此列的末尾以此类推,直到所有元需要进行n-1轮比较素均排序完毕3性能分析选择排序的时间复杂度固定为On²,不论输入数据的分布如何与冒泡排序相比,选择排序的优点是交换次数少,最多进行n次交换;但它是不稳定的排序算法,因为元素的交换可能改变相等元素的相对顺序选择排序的空间复杂度为O1冒泡排序快速排序基本思想1快速排序是一种分治算法,它选择一个元素作为基准(pivot),将数组分为两部分小于基准的元素和大于基准的元素然后递归地对这两部分进行排序,最终将整个数组排序分区过程2分区是快速排序的核心步骤它从数组中选择一个基准元素,将小于基准的元素移到基准的左边,大于基准的元素移到基准的右边,基准元素最终位于其排序后的正确位置基准选择3基准元素的选择对算法性能有很大影响常见的选择方法包括选第一个元素、最后一个元素、中间元素,或三数取中法(取首、尾、中三个元素的中值)好的基准选择可以避免最坏情况性能分析4快速排序的平均时间复杂度为Onlogn,最坏情况下为On²,空间复杂度为Olog n尽管理论上有最坏情况,但通过优化基准选择,快速排序在实践中通常是效率最高的排序算法之一归并排序合并操作将两个已排序的子数组合并成一个更大的有序数组分治策略将问题分解为更小的子问题,递归解决后再合并结果算法基本思想将数组分成两半,分别排序,然后合并两个有序数组堆排序堆的概念建堆过程排序过程堆是一种特殊的完全二叉树,分为最大堆和建堆是将一个无序数组转换为堆的过程从堆排序的基本思想是首先将数组构建成最最小堆在最大堆中,每个节点的值都大于最后一个非叶节点开始,自底向上进行调整,大堆,然后每次将堆顶元素(最大值)与堆或等于其子节点的值;在最小堆中,每个节使每个子树都满足堆的性质对于长度为n的最后一个元素交换,并将堆的大小减1,点的值都小于或等于其子节点的值堆排序的数组,最后一个非叶节点的索引为n/2-1重新调整堆,使其满足堆的性质重复这个主要利用最大堆(降序排列使用最小堆)建堆的时间复杂度为On过程,直到堆的大小为1基数排序算法原理适用场景与性能基数排序是一种非比较型排序算法,它根据数字的每一位进行排基数排序特别适用于数据范围有限的整数排序,例如整数、定长序在每轮中,所有元素按照某一位的数字被分配到不同的桶中,字符串等对于浮点数和变长字符串,实现会更复杂然后再按照桶的顺序合并该过程从最低有效位(LSD)开始,一基数排序的时间复杂度为Ok*n,其中k是数字的位数,n是元素个直到最高有效位(MSD)结束数在数字位数较少且数据量大的情况下,基数排序可能比基于基数排序有两种实现方式MSD(最高位优先)和LSD(最低位优比较的排序算法(如快速排序)更高效空间复杂度为On+k,先)LSD方式更为常用,它可以利用队列来实现桶,这样在合并需要额外的空间来存储桶时不需要额外的排序步骤基数排序是稳定的排序算法,这意味着相等的元素在排序后会保持原有的相对顺序各种排序算法的比较顺序查找基本原理算法实现顺序查找,也称为线性查找,是最简单的查找算法它从数据结构的第一实现顺序查找只需要一个简单的循环,依次检查每个元素是否等于目标值个元素开始,按顺序依次比较每个元素与目标值,直到找到匹配项或遍历如果找到匹配项,返回其位置;如果遍历完整个结构仍未找到,则返回特完整个结构定值(如-1)表示查找失败性能分析适用场景顺序查找的时间复杂度为On,其中n是数据规模在最好情况下(目标顺序查找适用于数据量较小或数据结构无序的情况它不需要数据有特定元素位于首位),时间复杂度为O1;在最坏情况下(目标元素位于末位的组织形式,可以应用于任何线性数据结构,如数组、链表等尽管效率或不存在),需要检查所有元素,时间复杂度为On不高,但实现简单,无需额外空间二分查找算法原理性能与注意事项二分查找是一种高效的查找算法,它利用已排序数据的特性,每二分查找的时间复杂度为Olog n,远优于顺序查找的On这使次将查找范围缩小一半它的基本思想是将目标值与数组中间得它在处理大规模已排序数据时特别高效位置的元素比较,如果相等则查找成功;如果目标值小于中间元使用二分查找的前提条件是数据必须已按照查找关键字排序此素,则在左半部分继续查找;如果目标值大于中间元素,则在右外,数据结构必须支持随机访问(如数组),不适用于链表等顺半部分继续查找序访问的数据结构这个过程不断重复,直到找到目标值或确定目标值不存在(查找在实现时需要注意边界条件和整数溢出问题例如,计算中间位范围为空)置时,使用mid=low+high-low/2比mid=low+high/2更安全,可以避免整数溢出散列表散列函数冲突处理将关键字映射到数组下标的函数,好的散处理不同关键字映射到同一位置的策略,2列函数能均匀分布键值如开放寻址法和链地址法应用场景性能特点4数据库索引、缓存实现、集合与映射数据平均情况下查找、插入和删除操作的时间结构、符号表等复杂度接近O1哈希函数设计均匀性计算效率良好的哈希函数应该使关键字均匀分布在整个哈希表中,避免出现聚哈希函数的计算应该简单高效,不应成为系统性能的瓶颈复杂的哈集现象这要求哈希函数对数据集中的任意输入都有相等的映射概率,希函数可能提供更好的均匀性,但计算开销也更大,需要在均匀性和从而减少冲突,提高查找效率效率之间找到平衡点常用技术抗攻击性常见的哈希函数设计技术包括除法散列法(取模运算)、乘法散列在安全敏感的应用中,哈希函数还需要考虑抵抗有意的哈希碰撞攻击法、全域散列法、完美散列法等对于不同类型的数据,如整数、字密码学安全的哈希函数(如SHA系列)可以用于这类场景,但在一般符串、复合结构等,通常需要采用不同的哈希策略应用中可能过于复杂冲突解决策略链地址法开放寻址法再散列链地址法是处理哈希冲突的一种开放寻址法在发生冲突时,通过再散列是指当哈希表的装载因子常用方法,它将哈希表的每个位某种探测序列查找下一个可用位(已使用空间与总空间之比)超置实现为一个链表当多个关键置常见的探测策略包括线性探过某个阈值时,创建一个更大的字映射到同一个哈希值时,它们测(依次检查下一个位置)、二哈希表,并将所有元素重新散列被存储在该位置的链表中查找次探测(按二次函数增长步长)到新表中这可以减少冲突,但时需要遍历链表,直到找到目标和双重散列(使用第二个哈希函需要额外的时间和空间开销元素或链表末尾数计算步长)其他方法其他冲突解决方法包括建立公共溢出区、使用完美散列等每种方法都有其适用场景和权衡,选择合适的冲突解决策略需要考虑数据特性、空间效率和时间性能等因素高级数据结构跳表跳表的基本概念跳表的特点与应用跳表(Skip List)是一种随机化的数据结构,可以作为有序链表的跳表的主要优势包括替代,实现对数级别的查找时间它通过维护多层索引来加速查•实现简单,相比平衡树更易于编码和维护找过程,类似于快速的链表版本的平衡树•支持快速的插入、删除和查找操作,平均时间复杂度为Olog n跳表的每一层都是一个有序链表,最底层包含所有元素,上层则是下层的子集,形成了一种分层索引的结构这使得可以像二分•空间开销相对较小,额外空间复杂度为On查找一样,先在稀疏的上层快速缩小查找范围,再在稠密的下层•良好的局部性,适合缓存系统精确定位元素跳表广泛应用于数据库系统(如Redis的有序集合)、内存缓存和并发数据结构实现中与红黑树等平衡树相比,跳表在并发环境下的锁定粒度更细,更适合高并发场景高级数据结构树Trie基本概念1Trie树,又称前缀树或字典树,是一种树形数据结构,用于高效地存储和检索字符串数据集中的键结构特点每个节点可以有多个子节点,每条从根到叶的路径表示一个字符串,共享前缀的字符串共享对应的节点基本操作插入将字符串的每个字符依次加入到树中;查找沿着字符路径遍历树;删除移除对应路径,同时处理共享节点应用场景4自动完成功能、拼写检查、IP路由查找、单词游戏、字符串相似度计算等课程总结与展望未来发展方向分布式数据结构、并发数据结构、ML优化的数据结构高级主题图算法、高级树结构、空间数据结构、概率数据结构核心内容线性结构、树形结构、图形结构、排序与查找算法基础概念数据组织方式、算法复杂度分析、基本运算操作。
个人认证
优秀文档
获得点赞 0