狄克斯特拉算法

寻找起点到终点的最近路
在这里插入图片描述

1、需要准备三个散列

## 节点
graph = {}
graph['start'] = {}
graph['start']['a'] = 6
graph['start']['b'] = 2
graph['a'] = {}
graph['a']['fin'] = 1
graph['b'] = {}
graph['b']['a'] = 3
graph['b']['fin'] = 5
graph['fin'] = {}

## 开销散列
infinity = float('inf')
costs = {}
costs['a'] = 6
costs['b'] = 2
costs['fin'] = infinity

## 父节点散列
parents = {}
parents['a'] = 'start'
parents['b'] = 'start'
parents['fin'] = None

2、寻找开销最小节点

## 找到开销最小节点
def find_lowet_cost_node(costs):
    lowest_cost = float('inf')
    lowest_cost_node = None
    for node in costs:
        cost = costs[node]
        if cost < lowest_cost and node not in processed:
            lowest_cost = cost
            lowest_cost_node = node
    return lowest_cost_node

3、算法简单实现

## 算法实现
processed = []
node = find_lowet_cost_node(costs)
while node is not None:
    cost = costs[node]
    neighbors = graph[node]
    for nb in neighbors.keys():
        new_cost = cost + neighbors[nb]
        if costs[nb] > new_cost: # 如果经当前节点前往该邻居更近
            costs[nb] = new_cost # 就将该最近的值赋值给开销散列中
            parents[nb] = node   # 将该邻居的父节点设置为当前节点
    processed.append(node)
    node = find_lowet_cost_node(costs)

print(costs)  # {'a': 5, 'b': 2, 'fin': 6}

因此到终点最近距离是 6 , 到A的最近距离是5 ,到B的最近距离是2。
该算法可以用在社交网络中通过最亲密的朋友线去寻找想认识的人,不过散列会非常的大

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scc_hy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值