0024算法笔记——【贪心算法】单源最短路径问题

本文是关于Dijkstra算法的算法笔记,详细介绍了如何使用该算法解决单源最短路径问题。通过不断贪心选择扩充顶点集合,求得从源点到所有其他顶点的最短路径长度。Dijkstra算法包括初始化路径长度,选择具有最短路径的顶点,以及在添加新顶点后更新最短路径的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      1、问题描述

     给定带权有向图G =(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之和。这个问题通常称为单源最短路径问题。

    2、Dijkstra算法

     Dijkstra算法是解单源最短路径问题的贪心算法。
    其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其他顶点之间的最短路径长度。

    Dijkstra算法可描述如下,其中输入带权有向图是G=(V,E),V={1,2,…,n},顶点v是源。c是一个二维数组,c[i][j]表示边(i,j)的权。当(i,j)不属于E时,c[i][j]是一个大数。dist[i]表示当前从源到顶点i的最短特殊路径长度。Dijkstra算法中做贪心选择时

<think>好的,我现在需要帮助用户整理计算机考研中数据结构的重要知识点。根据用户提供的引用内容和之前的回答,我需要综合这些信息,确保覆盖核心考点,并且符合考研大纲的要求。 首先,用户提到的引用[1]中强调了数据结构的基本概念、存储结构、算法分析以及应用能力,尤其是选择题和算法应用题。之前的回答里已经分点列出了线性结构、树与图、排序与查找等内容,但可能需要更详细地展开每个子点,例如栈和队列的具体应用,比如括号匹配、表达式求值等。 引用[2]提到了静态链表,这是数组实现的链式存储结构,可能在选择题或填空题中出现。之前的回答中没有提到这一点,需要补充进去,特别是在线性结构部分,说明静态链表的义、实现方式以及应用场景。 另外,用户之前的回答里提到了B/B+树,但引用[1]中特别提到需要掌握存储结构和基本操作的实现,所以需要更详细地描述B树的插入分裂规则,比如3阶B树每个节点的关键字数量限制,以及分裂过程。 关于算法分析,引用[1]强调时间复杂度和空间复杂度分析,这在每个算法部分都需要具体说明,例如快速排序的平均和最坏情况,Dijkstra算法的时间复杂度等。之前的回答已经涉及了这些,但可能需要更突出地展示复杂度公式,比如用LaTeX格式明确写出。 用户需求中还提到需要重点总结,所以可能需要将知识点分优先级,比如高频考点放在前面,并给出备考建议。例如,树和图的相关算法、排序算法、查找结构(如B树、哈希表)都是重点,需要详细说明。 此外,用户可能需要例题或真题示例来辅助理解。例如,在哈夫曼树的构建中,可以举一个具体的权值例子,计算带权路径长度。或者在排序算法中,给出快速排序的分区过程示例。 需要注意引用标注,比如在提到静态链表时引用[2],在提到存储结构时引用[1]。同时,确保所有数学公式和代码块使用正确的格式,如$O(n)$,$$WPL = \sum w_i l_i$$,以及代码块使用反引号包裹。 最后,检查是否有遗漏的重要知识点,比如字符串匹配算法(KMP)、哈希表冲突解决方法等,这些也是数据结构中的常见考点,需要补充到相应部分。 总结下来,我需要重新组织数据结构部分的内容,确保涵盖所有关键点,结构清晰,重点突出,并适当加入示例和引用标注,帮助用户更好地理解和备考。</think>### 计算机考研《数据结构》核心知识点总结 根据考研大纲和真题高频考点整理,结合引用内容[^1][^2],重点覆盖以下内容: --- #### **一、基础概念与逻辑结构** 1. **数据结构三要素** - **逻辑结构**:集合、线性结构(顺序表/链表)、树形结构、图状结构 - **存储结构**:顺序存储(数组)、链式存储(链表/静态链表[^2])、索引存储、散列存储 - **数据操作**:插入、删除、查找、遍历(时间复杂度需明确标注,如链表插入$O(1)$,顺序表查找$O(n)$) 2. **算法分析** - **时间复杂度**:常见阶数$O(1)/O(n)/O(n^2)/O(n \log n)$,例如快速排序平均复杂度$O(n \log n)$,最坏$O(n^2)$ - **空间复杂度**:递归算法需注意栈空间(如二叉树遍历递归实现空间复杂度$O(h)$,h为树高) --- #### **二、线性结构重点** 1. **顺序表与链表** - **对比**:顺序表支持随机访问($O(1)$),但插入/删除需移动元素($O(n)$);链表插入/删除快($O(1)$),但查找需遍历($O(n)$) - **静态链表**:用数组模拟链式结构,节点包含`data`和`next`(指向数组索引),适合内存受限场景 2. **栈与队列** - **栈应用**:括号匹配、递归函数调用(函数调用栈)、后缀表达式求值 - **队列应用**:层次遍历二叉树、操作系统中进程调度 - **循环队列判满公式**: $$ (\text{rear} + 1) \% \text{size} == \text{front} $$ --- #### **三、树与图核心算法** 1. **二叉树** - **遍历算法**: - 非递归实现:借助栈(先序)、队列(层次遍历) - 哈夫曼树:带权路径长度$WPL = \sum (w_i \times l_i)$,构建方法(合并最小权值节点) - **平衡树**:AVL树旋转操作(LL/RR/LR/RL型) 2. **图算法** - **最短路径**: - **Dijkstra算法**:单源最短路径,贪心策略,时间复杂度$O(n^2)$ - **Floyd算法**:多源最短路径,动态规划,时间复杂度$O(n^3)$ - **最小生成树**: - **Prim算法**:从点出发,时间复杂度$O(n^2)$ - **Kruskal算法**:按权排序,时间复杂度$O(e \log e)$ --- #### **四、排序与查找高频考点** 1. **排序算法对比** | 算法 | 平均时间复杂度 | 空间复杂度 | 稳性 | |----------|----------------|------------|--------| | 快速排序 | $O(n \log n)$ | $O(\log n)$| 不稳 | | 归并排序 | $O(n \log n)$ | $O(n)$ | 稳 | | 堆排序 | $O(n \log n)$ | $O(1)$ | 不稳 | - **快速排序优化**:随机选择基准元素、三数取中法 - **稳义**:相同关键字元素排序后相对位置不变 2. **查找结构** - **B/B+树**: - B树义:m阶B树每个节点最多$m-1$个关键字,非叶节点最少$\lceil m/2 \rceil$子树 - B+树特点:叶子节点链表连接,适合范围查询 - **哈希表**: - 冲突处理:开放址法(线性探测)、链地址法 - 装填因子$\alpha = \frac{\text{元素数}}{\text{表长}}$,影响查找效率 --- #### **五、算法设计与分析** 1. **递归与分治** - 典型问题:汉诺塔、归并排序、快速排序 - **递归时间复杂度分析**:主理(如归并排序递推式$T(n) = 2T(n/2) + O(n)$,解得$T(n) = O(n \log n)$) 2. **动态规划** - 核心思想:最优子结构、重叠子问题 - 典型例题:最长公共子序列(LCS)、0-1背包问题 --- #### **真题示例与备考策略** 1. **高频真题类型** - **算法应用题**:设计算法判断二叉树是否为平衡树(需计算高度差) - **代码填空**:静态链表插入操作(修改`next`指针索引) - **计算题**:哈夫曼树WPL计算(如权值{2,3,5,7},构建后WPL=2×3 + 3×3 + 5×2 + 7×1 = 34) 2. **备考建议** - **优先级**:树与图(35%)>排序/查找(25%)>线性结构(20%)>算法设计(20%) - **刷题重点**:近5年408真题、《数据结构高分笔记》经典例题 --- ### 相关问题 1. 如何快速推导二叉树遍历的非递归实现? 2. B树和B+树在数据库索引中的应用有何区别? 3. 动态规划解决背包问题的状态转移方程如何构建? [^1]: 考研《数据结构》知识点总结 [^2]: 计算机考研——数据结构笔记
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值