算法图解:Python笔记代码

二分查找
选择排序
递归
快速排序
广度优先搜索
狄克斯特拉算法
贪婪算法
二分查找
def binary_search(lst,item):
low = 0
high = len(lst)-1 while low <= high:
mid = (high+low)//2
if item == lst[mid]:
return mid
if item < lst[mid]:
high = mid-1
if item > lst[mid]:
low = mid + 1
return None my_list = [1,3,5,7,9]
print(binary_search(my_list,5))
选择排序
def findsmallest(arr):
smallest = arr[0]
smallest_index = 0 for i in range(1,len(arr)):
if arr[i] < smallest:
smallest = arr[i]
smallest_index = i
return smallest_index def selection_Sort(arr):
new_arr = []
for i in range(len(arr)):
new_arr.append(arr.pop(findsmallest(arr))) # 注意pop的对象是索引
return new_arr arr = [3,1,5,2,9,1,1,0]
print(selection_Sort(arr))
递归
# 倒计时
def countdown(n):
print(n)
if n < 1:
return
countdown(n-1) # 求和
def sum_1(arr):
if arr == []:
return 0
return arr.pop(0) + sum_1(arr) def sum_2(arr):
if arr == []:
return 0
return arr[0] + sum_2(arr[1:]) arr = [1,2,3,4,5]
print(sum_1(arr)) # 阶乘
def fact(n):
if n == 1:
return 1
return n * fact(n - 1) # 计算元素个数
def count_arr(arr):
if arr == []:
return 0
return 1 + count_arr(arr[1:])
快速排序
def quick_sort(arr):
if len(arr) < 2:
return arr
else:
pivot = arr[0]
less = [i for i in arr[1:] if i <= pivot]
greater = [i for i in arr[1:] if i > pivot]
return quick_sort(less) + pivot + quick_sort(greater)
广度优先搜索
# 使用队列这种数据结构
from collections import deque # 定义图
graph = {
'you': ['alice', 'bob', 'claire'],
'bob': ['anuj', 'peggy'],
'alice': ['peggy'],
'claire': ['thom', 'jonny'],
'anuj': [],
'peggy': [],
'thom': [],
'jonny': []
} # 判断是否是芒果销售商
def person_is_seller(name):
return name[-1] == "m" # 广度优先搜索
def search(name):
# 实例化队列
search_deque = deque()
# 将某人的一度关系网加入到队列中
search_deque += graph[name]
# 初始化已检查过的人
searched = [] # 队列中存在元素时就一直搜索
while search_deque:
# 从列队中弹出第一个人,并检查
person = search_deque.popleft()
# 此人不在已检查过的列表中
if person not in searched:
# 检查是否是销售商
if person_is_seller(person):
print("%s is mango_seller" % person)
return True
else:
# 如果不是就将此人的一度关系网加入到队列中
search_deque += graph[person]
searched.append(person) return False search("you")
狄克斯特拉算法
# 创建图的散列表
graph = {
"start":{"a":6,"b":2},
"a":{"fin":1},
"b":{"a":3,"fin":5},
"fin":{}
}
# 创建开销的散列表
costs = {
"a":6,
"b":2,
"fin":float("inf")
}
# 创建存储父节点的散列表
parents = {
"a":"start",
"b":"start",
"fin": None
}
# 记录处理过的节点
processed = [] # 在未处理的节点中寻找最小开销节点
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 # 1、拿到起点的一度关系中的最小开销节点
node = find_lowest_cost_node(costs)
# 2、获取该节点的开销和邻居
while node is not None:
cost = costs[node]
neighbors = graph[node]
# 3、遍历邻居
for n in neighbors.keys():
# 计算该节点到邻居的开销+起点到该节点的开销,与起点直接到改点的开销比较
new_cost = cost + neighbors[n]
# 如果前者开销较小则更新改邻居节点的父节点,并更新起点到该邻居节点的开销
if new_cost < costs[n]:
parents[n] = node
costs[n] = new_cost
# 4、将当前节点标记为处理过
processed.append(node)
# 5、找出接下来要处理的节点并循环
node = find_lowest_cost_node(costs) print(processed)
print(costs)
print(parents)
贪婪算法
# 目标:选择尽可能少的电台覆盖尽可能多的州
# 方法:第一步,选择覆盖州最多的电台
# 方法:第二步,选择覆盖最多“未覆盖的州(上一步剩下的州)”的电台
# 方法:第三步,重复第二步,直到覆盖所有的州 # 需要覆盖的州
states_needed = set(["mt", "wa", "or", "id", "nv", "ut","ca", "az"]) # 电台清单
stations = {
"kone" : set(["id", "nv", "ut"]),
"ktwo" : set(["wa", "id", "mt"]),
"kthree" : set(["or", "nv", "ca"]),
"kfour" : set(["nv", "ut"]),
"kfive" : set(["ca", "az"])
} # 该集合存储最终选择的电台
final_stations = set() # 只要需要覆盖的州不为空就一直循环
while states_needed:
best_station = None
states_covered = set()
# 从电台清单中找出覆盖未覆盖州最多的电台
for station,states in stations.items():
covered = states_needed & states
if len(covered) > len(states_covered):
best_station = station
states_covered = covered # 每次确定一个最佳的电台就将其覆盖的州从总集合中减去
states_needed -= states_covered
# 没确定一个最佳电台就存在最终的电台集合中
final_stations.add(best_station) print(final_stations)
算法图解:Python笔记代码的更多相关文章
- <算法图解>读书笔记:第1章 算法简介
阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...
- <算法图解>读书笔记:第4章 快速排序
第4章 快速排序 4.1 分而治之 "分而治之"( Divide and conquer)方法(又称"分治术") ,是有效算法设计中普遍采用的一种技术. 所谓& ...
- Python算法——《算法图解》笔记
算法目录 二分查找 大O表示法 选择排序 递归 快速排序,分而治之(D&C) 散列表——字典 广度优先搜索——BFS Dijkstra算法 贪婪算法 二分查找 # 要求list是有序表,num ...
- <算法图解>读书笔记:第2章 选择排序
第2章 选择排序 2.1 内存的工作原理 需要将数据存储到内存时,请求计算机提供存储空间,计算机会给一个存储地址.需要存储多项数据时,有两种基本方式-数组和链表 2.2 数组和链表 2.2.1 链表 ...
- <算法图解>读书笔记:第3章 递归
第3章 递归 3.1 递归 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一 ...
- 算法图解学习笔记01:二分查找&大O表示法
二分查找 二分查找又称折半查找,其输入的必须是有序的元素列表.二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止:如果x<a[ ...
- 多元线性回归算法的python底层代码编写实现
1.对于多元线性回归算法,它对于数据集具有较好的可解释性,我们可以对比不过特征参数的输出系数的大小来判断它对数据的影响权重,进而对其中隐含的参数进行扩展和收集,提高整体训练数据的准确性. 2.多元回归 ...
- python聚类算法实战详细笔记 (python3.6+(win10、Linux))
python聚类算法实战详细笔记 (python3.6+(win10.Linux)) 一.基本概念: 1.计算TF-DIF TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库 ...
- 数据关联分析 association analysis (Aprior算法,python代码)
1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...
随机推荐
- H3C交换机端口聚合配置
1.接入交换机: interface Ten-GigabitEthernet1/0/21 port link-mode bridge port link-type trunk port trunk p ...
- 36.Samba 文件共享服务1--安装及配置参数解释
1.Samba 服务程序现在已经成为在Linux 系统与Windows系统之间共享文件的最佳选择. 1)安装: [root@localhost ~]#yum install samba Loaded ...
- 云服务器镜像问题("Couldn't resolve host 'mirrors.tencentyun.com')
云服务器镜像问题("Couldn't resolve host 'mirrors.tencentyun.com') 原因: 腾讯云服务器内网yum源的域名 mirrors.tencentyu ...
- docker(1)下载安装for mac
前言 Docker 提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D ...
- 正点原子DS100拆解全过程-硬件工程师必备
前言: 之前一篇只针对正点原子DS100手持示波器的使用介绍文章.可作为一个电子工程师,光使用不是我们的风格哈,我们还要拆开看看电路. 开拆 外壳 首先,看下图,DS100不是使用螺母进行固定的,而是 ...
- E - E(最短路解决源点到多点,多点到源点的和(有向图))
问从1号点到各个点的距离+各个点到1号点之间的距离和的最小值 详解键连接https://www.cnblogs.com/csx-zzh/p/13411588.html In the age of te ...
- CF-1451 E Bitwise Queries 异或 交互题
E - Bitwise Queries 传送门 题意 有一组序列,长度为 \(n(4\le n \le 2^{16})\),且 \(n\) 为 2 的整数次幂,序列中数值范围为 [0,n-1], 每次 ...
- Hiho1422 Harmonic Matrix Counter (高斯消元)
16年北京站A题 真的难啊.. 题意: 定义和谐矩阵 就是每个元素和上下左右的xor值=0 输出一个超大数 然后最多800个询问 求字典序第k小的和谐矩阵 x y位置上的数 题解: 首先这个超大数的范 ...
- Codeforces Round #544 (Div. 3) E. K Balanced Teams (DP)
题意:有\(n\)个人,每个人的能力值是\(a_i\),现在你想将这些人分成\(k\)组(没必要全选),但是每组中最高水平和最低水平的人的能力差值必须\(\le 5\),问最多能选多少人. 题解:想了 ...
- zoj3623 Battle Ships
Battle Ships is a new game which is similar to Star Craft. In this game, the enemy builds a defense ...