《算法图解》的一些算法笔记

这本书个人觉得它的重点还是在于广度优先搜索算法、Dijkstra算法、动态规划—(背包问题、最长公共子串、最长公共子串序列)、贪婪算法、NP问题的讲解。
按照书上的代码及自己的一些思路,把代码复现了一遍。作篇记录,方便后期自己学习的时候查阅。
在这里插入图片描述
BFS算法:

#!/user/bin/python3
# -*- coding:utf-8 -*-
#@Date      :2018/10/24  19:06
#@Author    :Syler(sylerxin@gmail.com)
from queue import Queue
graph = {}
que = Queue()
#第一层
graph["you"] = ["BOB", "CLAIRE", "ALICE"]
#第二层
graph["CLAIRE"] = ["THOM", "JONNY"]
graph["ALICE"] = ["PEGGY"]
graph["BOB"] = ["ANUJ", "PEGGY"]
#第三层
graph["THOM"] = []
graph["JONNY"] = []
graph["ANUJ"] = []
graph["PEGGY"] = []

que.put(graph["you"])
processed = []

record = []

while not que.empty():
    node = que.get()
    need_node = node[0]
    tmp_node = node[1:]
    if need_node not in processed:
        if need_node == "THOM":
            print("找到了!")
            break
        else:
            tmp_node.extend(graph[need_node])
            que.put(tmp_node)
            processed.append(need_node)

d = []
def re(ke):
    # 现在的层数是第一层:
    if ke == 'you':
        d.append(ke)
        return 1#这层的键
    else:
        #把这一次的ke添加到一个列表
        d.append(ke)
        for k,v in graph.items():
            if ke in v:
                a = k
                break
        return re(a)
#如果找到了所需要的人物,那么如何确定它的关系图,即从you到目标人物的最短度量
re("PEGGY")
d.reverse()
print(d)

在这里插入图片描述
需要的三个散列表(即哈希表)
Dijkstra算法:

#!/user/bin/python3
# -*- coding:utf-8 -*-
#@Date      :2018/10/24  20:33
#@Author    :Syler(sylerxin@gmail.com)

def find_lowest_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

graph = {}
graph["start"] = {}
graph["start"]["A"] = 6
graph["start"]["B"] = 2
graph["A"] = {}
graph["A"]["finally"] = 1
graph["B"] = {}
graph["B"]["A"] = 3
graph["B"]["finally"] = 5
graph["finally"] = {}

infinity = float("inf")
costs = {}
costs["A"] = 6
costs["B"] = 2
costs["finally"] = infinity

parents = {}
parents["A"] = "start"
parents["B"] = "start"
parents["finally"] = None

processed = []

node = find_lowest_cost_node(costs)
while node is not None:
    cost = costs[node]
    neighborhoods = graph[node]
    for n in neighborhoods.keys():
        new_cost = cost + neighborhoods[n]
        if costs[n] > new_cost:
            costs[n] = new_cost
            parents[n] = node
    processed.append(node)
    node = find_lowest_cost_node(costs)

print(processed)

暂时先记下这些笔记,后期需要的时候,不断扩充吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值