Dijkstra算法详解与应用

📚 中大厂面试算法每日推荐

今日推荐算法:Dijkstra 最短路径算法


一、算法核心概述

Dijkstra算法是图论中最经典的单源最短路径算法,在有权图(权值非负数)中求从起点到其他所有节点的最短路径。该算法采用贪心思想,不断寻找距离源点最近的未访问节点,逐步扩展最短路径树。


二、关键特性对比

特性 说明
算法类型 单源最短路径
支持负权边 ❌ 不支持
检测负权环 ❌ 无法检测
时间复杂度 O(m log n)(堆优化版)
适合场景 无负权边的稀疏图,绝大多数面试题目首选

三、算法执行三部曲

  1. 选择最近节点:从源点出发,选择距离最近且未被访问过的节点
  2. 标记访问:将该节点标记为已访问
  3. 更新距离:更新所有未访问节点到源点的距离(即更新minDist数组)

四、核心代码模板(C++堆优化版)

cpp 复制代码
// 邻接表存储图结构
vector<list<pair<int,int>>> g(n + 1);

// Dijkstra堆优化实现
priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater<pair<ll,ll>>> pq;
pq.push({0, start});  // 起点距离为0
minDist[start] = 0;

while(!pq.empty()) {
    pair<ll,ll> cur = pq.top();
    pq.pop();
    
    if(visited[cur.first]) continue;
    visited[cur.first] = true;
    
    for(Edge edge : g[cur.first]) {
        ll v = edge.to;
        ll w = edge.val;
        if(!visited[v] && minDist[cur.first] + w < minDist[v]) {
            minDist[v] = minDist[cur.first] + w;
            pq.push({minDist[v], v});
        }
    }
}

五、面试高频追问点

根据C++技术面试高频考点分析,面试官通常会从以下四个层次考察:

  1. 语法机制层:能否正确实现优先队列的自定义比较函数
  2. 底层原理层:理解堆优化为何能将复杂度从O(n²)降至O(m log n)
  3. 工程设计层:如何处理大规模图数据的内存优化
  4. 算法素养层:能否对比Dijkstra与Bellman-Ford、SPFA的适用场景差异

六、同类算法对比

算法 单源/多源 支持负权 时间复杂度 面试频率
Dijkstra 单源 ❌ O(m log n) ⭐⭐⭐⭐⭐
Bellman-Ford 单源 ✅ O(nm) ⭐⭐⭐
SPFA 单源 ✅ 平均O(m) ⭐⭐⭐
Floyd-Warshall 多源 ✅ O(n³) ⭐⭐

七、实战建议

💡 面试技巧:不会做算法题时,可以主动说思路,哪怕只是暴力解。把暴力解的复杂度说清楚,然后说"我觉得可以优化到O(n log n),方向是排序或者二分",这种候选人通常比沉默到底的人拿到的评价高出一个档位。


📅 明日预告

明天将为您推荐快速排序算法,涵盖分区策略、时间复杂度分析及面试中的优化变种。


温馨提示:算法学习重在理解原理+手写代码+变式练习。建议今天完成以下任务:

  • ✅ 理解Dijkstra的贪心思想
  • ✅ 手写一遍堆优化代码
  • ✅ 对比掌握其他三种最短路算法的适用边界

祝您面试顺利!🎯


参考来源

相关推荐
倒头就睡的小比特4 天前
算法竞赛C++常用的STL
c++·算法
默_笙4 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003964 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫4 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技4 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼4 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
只睡四小时4 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控