算法图解: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 ...
随机推荐
- 【Oracle】SQL/92 执行多个表的连接
内连接 外连接 自连接 交叉连接 1.内连接 表名 INNER JOIN 表名 ON 条件 等价于: FROM 表名, 表名 WHERE 条件 SELECT p.name, pt.name, pt.p ...
- python----类,面向对象(封装、继承、多态)(属性,方法)
什么是对象? 对象是内存中专门用来存储数据的一块区域 对象中可以存放各种数据(数字.代码等) 对象由三部分组成(1,对象标识(id)2,对象类型(type)3,对象的值(value)) 面向对象编程是 ...
- python--基础1(pip,虚拟环境、python编写规范)
python简介 1.Python是一种解释型脚本语言; 2.Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读.易维护,并且被大量用户所欢迎的.用途广泛的语言; 3.pytho ...
- 力扣643.子数组最大平均数I-C语言实现
题目 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例: 输入:[1,12,-5,-6,50,3], k = 4 输出:12.75 解释:最大平均数 (12-5- ...
- 【uva 177】Paper Folding(算法效率--模拟)
P.S.模拟真の难打,我花了近乎三小时!o(≧口≦)o 模拟题真的要思路清晰!分块调试. 题意:著名的折纸问题:给你一张很大的纸,对折以后再对折,再对折--每次对折都是从右往左折,因此在折了很多次以后 ...
- poj3415 Common Substrings (后缀数组+单调队列)
Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9414 Accepted: 3123 Description A sub ...
- 【noi 2.6_90】滑雪(DP)
题意:输出最长下降路径的长度. 解法:f[i][j]表示结尾于(i,j)的最长的长度.由于无法确定4个方位已修改到最佳,所以用递归实现. 1 #include<cstdio> 2 #inc ...
- 2019牛客暑期多校训练营(第八场)B Beauty Values && C CDMA
B题题意: 题目 给你n个数,让你把这一个序列中的所有子区间的Beauty Values加起来,Beauty Values是子区间内有几个不同的数 题解: 肯定不会是暴力,所以我们就要在各元素的位置上 ...
- Educational Codeforces Round 96 (Rated for Div. 2) E. String Reversal (思维,逆序对)
题意:给你一个字符串,每次可以调换现字符串的相邻两个字符,问最少操作多少次使得这个字符串等于其反转过来的字符串. 题解:先考虑字符串中没有相同字符的情况,那么我们每次将目前字符串的最后一个字符一直调换 ...
- Codeforces Round #669 (Div. 2) C. Chocolate Bunny (交互,构造)
题意:有一个长度为\(n\)的隐藏序列,你最多可以询问\(2n\)次,每次可以询问\(i\)和\(j\)位置上\(p[i]\ mod\ p[j]\)的结果,询问的格式是\(?\ x\ y\),如果已经 ...