数据结构与算法:迪杰斯特拉和prim TypeScript实现

本文介绍了迪杰斯特拉算法和Prim算法,讲解了它们在求解图中单源最短路径和最小生成树的应用。迪杰斯特拉算法通过不断更新未求出集合中顶点的最短距离,逐步找到所有节点的最短路径;Prim算法则专注于构建最小生成树,同样采用更新距离的方式。文中还提供了两种算法的TypeScript代码实现。
摘要由CSDN通过智能技术生成

迪杰斯特拉算法

迪杰斯特拉算法用于求图中的单源最短路劲,所谓单源最短路劲,是指从图中的某一个顶点出发,这个顶点到图中的其它节点的最短路劲。

迪杰斯特拉算法的主要思想如下:

  • 将图中的节点分成两个集合:一个集合表示已经求出最短路劲的顶点集合,另一个集合表示还未求出到起点最短距离的顶点集合,初始未求出集合为空。
  • 从未求出集合中选取一个距离最小的节点,并将其加入到已求出集合中
  • 更新未求出集合中顶点到起点的最短距离:核心不等式:d[i] > graph[m][i]+d[m]。d[i]表示节点i到起点的最小距离。节点i的最小距离是直接到起点的距离和从i到m在到起点二者中的较小值。
  • 重复2、3直到所有点都被加入到了已求出最小距离的集合中。

假设起点为start,用visited数组区别两个集合(也可以用两个线性表分别表示),visited[i]==true表示该节点已被加入到已计算出最小距离的集合,算法实现分成步:

  1. 初始化最小数组d,如果start、i连通,那么d[i]=graph[start][i],否则d[i]=Number.MAX_VALUE(表示不连通)
  2. 从数组d中选择一个最小值(可以用线性查找、也可以用优先队列,这里给出的代码是线性查找),将其加入到已计算集合中
  3. 更新未计算集合中的其他顶点到start的距离
  4. 重复2、3直到没有未计算出最小距离的连通节点

TypeScript代码实现如下:

export function dijkstra(graph:Array<Array<number>>, start:number):Array<number> {
   
  let visited = new Array(graph.length); // 用于判断一个节点是不是已经在已计算的集合中,如果是,返回true
  let d = new Array(graph.length); // 每一个节点到初始节点的最小距离
  // 初始化d,如果边是0表示不连通,值为无穷
  for(let i = 0;i<d.length;i++) {
   
    d[i] = graph[start][i]==0?Number.MAX_VALUE:graph[start][i];
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值