算法书中算法
时间:2022-07-25
本文章向大家介绍算法书中算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法图解书中算法
二分查找
不断找出中值即可,判断所给值与中值的大小关系
def binary_search(num, target):
low = 0
high = len(num)-1
while low <= high:
mid = (low+high)//2
guess = num[mid]
if guess == target:
return mid
elif guess > target:
high = mid-1
else:
low = mid+1
return
if __name__ == '__main__':
print(binary_search([2, 3, 4, 5, 6, 7], 4))
快速排序
选择一个元素作为排序的基准值,然后将数组中小于该值的和大于该基准值的分别进行排序,不断递归该过程,最后将小于该基准值的数组、基准值、大于基准值的数组拼接为一个完整数据即可
def quick_sort(num):
if (len(num) < 2):
return num
else:
point = num[0]
small = [i for i in num[1:] if i < point]
large = [j for j in num[1:] if j > point]
return quick_sort(small)+[point]+quick_sort(large)
if __name__ == '__main__':
print(quick_sort([2, 4, 5, 3, 7]))
广度优先搜索
搜索图中是否还有某个节点
from collections import deque
graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["thom"] = []
graph["jonny"] = []
def person_is_seller(name):
return name[-1] == 'm'
def search(name):
search_queue = deque()
search_queue += graph[name]
searched = []
while search_queue:
person = search_queue.popleft()
if not person in searched:
if person_is_seller(person):
return True
else:
search_queue += graph[person]
searched.append(person)
return False
if __name__ == '__main__':
print(search("you"))
## 狄克斯特拉算法 求图的最短路径
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
# 找出开销最低的节点
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
# 在未处理的节点中找出开销最小的节点
node = find_lowest_cost_node(costs)
# 这个while循环在所有节点都被处理过后结束
while node is not None:
cost = costs[node]
neighbors = graph[node]
# 遍历当前节点的所有邻居
for n in neighbors.keys():
new_cost = cost + neighbors[n]
# 如果经当前节点前往该邻居更近
if costs[n] > new_cost:
# 就更新该邻居的开销
costs[n] = new_cost
# 同时将该邻居的父节点设置为当前节点
parents[n] = node
# 将当前节点标记为处理过
processed.append(node)
# 找出接下来要处理的节点,并循环
node = find_lowest_cost_node(costs)
最长公共子串(序列)
动态规划解决,找出公式,先划出一个二维数组,
def find_lcsubstr(str_a, str_b):
"""
最长公共子串
"""
# 构造一个全为0的矩阵
cell = [[0]*(len(str_a)+1)]*(len(str_b)+1)
# 保存最长子串长度
res = 0
# 保存最后一相同字符的索引
index = 0
for i in range(len(str_a)):
for j in range(len(str_b)):
# 当字符相等
if str_a[i] == str_b[j] :
# 对第一个字符就相等的情况进行特殊处理
if i==0 and j==0:
cell[i][j]=1
# 将上次相同的值+1
cell[i][j] = cell[i-1][j-1]+1
# 计算保存最大值
res = max(cell[i][j], res)
# 将索引+1
index = i+1
# 返回长度和子串
return res, str_a[index-res:res+1]
def find_lcseque(str_a, str_b):
"""
最长公共子序列
"""
# 构造一个全为0的矩阵
cell = [[0]*(len(str_a)+1)]*(len(str_b)+1)
# 保存子序列
res = ''
for i in range(len(str_a)):
for j in range(len(str_b)):
# 当字符相等
if str_a[i] == str_b[j]:
# 对第一个字符就相等的情况进行特殊处理
if i==0 and j==0:
cell[i][j]=1
# 将上次相同的值+1
cell[i][j] = cell[i-1][j-1] + 1
# 将字符串累加
res = res+str_a[i]
else:
# 对当前位置左边或者上面的最大值进行更新
cell[i][j] = max(cell[i-1][j], cell[i][j-1])
return res
if __name__ == '__main__':
print(find_lcsubstr('vish', 'vishw'))
print(find_lcseque('abdfg','abcdfg'))
- [译]Laravel 5.0 之自定义错误页面
- 使用Google的Quickdraw创建MNIST样式数据集!
- CentOS 7 开启 BBR 加速
- 开源项目Minio:提供非结构化数据储存服务
- [译]Laravel 5.0 之事件自动生成
- [译]Laravel 5.0 之 Eloquent 属性转换
- [译]Laravel 5.0 之事件及处理程序
- 自相关与偏自相关的简单介绍
- [译]Laravel 5.0 之命令及处理程序
- Deep Photo Styletransfer的一种纯Tensorflow实现,教你如何转换图片风格
- 如何提前体验 Laravel 5.5
- Laravel 4 小技巧两则
- [译]Laravel 5.0 之 ValidatesWhenResolved
- Python机器学习的练习七:K-Means聚类和主成分分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浙大版《C语言程序设计(第3版)》题目集 练习4-3 求给定精度的简单交错序列部分和
- Linux 如何手动释放Swap、Buffer和Cache
- 浙大版《C语言程序设计(第3版)》题目集 练习4-6 猜数字游戏
- 浙大版《C语言程序设计(第3版)》题目集 练习4-7 求e的近似值
- TypeScript高级类型备忘录(附示例)
- 浙大版《C语言程序设计(第3版)》题目集 练习4-10 找出最小值
- 牛逼!力挺一款实用的 Linux 资源监视工具
- 浙大版《C语言程序设计(第3版)》题目集 练习4-11 统计素数并求和
- 浙大版《C语言程序设计(第3版)》题目集 习题4-1 求奇数和
- Kotlin 使用DSL构建语法结构 看这一篇就够了~
- 浙大版《C语言程序设计(第3版)》题目集 习题4-2 求幂级数展开的部分和
- 2020 年 9 月编程语言排行榜
- 浙大版《C语言程序设计(第3版)》题目集 习题4-3 求分数序列前N项和
- 浙大版《C语言程序设计(第3版)》题目集 习题4-4 特殊a串数列求和
- 一个可能让你的页面渲染速度提升数倍的CSS属性