算法图解: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 ...
随机推荐
- react空标签之The React Fragment
如何使用React.Fragment创建不可见的HTML标签 在研究Ant Design Pro项目中,在登录模块中,有React.Fragment的实际应用 接下来先看一个小demo,将返回值包装在 ...
- 九:SpringBoot-整合Mybatis框架,集成分页助手插件
九:SpringBoot-整合Mybatis框架,集成分页助手插件 1.Mybatis框架 1.1 mybatis特点 1.2 适用场景 2.SpringBoot整合MyBatis 2.1 核心依赖 ...
- linux系统权限管理拓展:特殊权限
文件与目录权限设置不止读.写.执行这些,还有所谓的特殊权限,由于特殊权限会拥有一些"特权": 1 2 3 4 本章内容 SUID SGID SBIT 文件扩展权限ACL 1.SUI ...
- JavaScript解构赋值
JavaScript解构赋值 JavaScript解构赋值为我们提供了很多方便,但是用法比较多,本文就来梳理一下.总体来说,主要就两种地方使用解构赋值,一种是数组的解构赋值,另一种是对象的解构赋值.以 ...
- dedecms织梦的安全问题解决办法
很多新手用户在使用织梦CMS程序过程中,难免会碰到挂马中毒现象,所以事先我们要对网站及服务器安全做好预防备份处理. 织梦作为国内第一大开源免费CMS程序,无疑是很多HACK研究的对象,在本身不安全的互 ...
- Codeforces Global Round 9 E. Inversion SwapSort
题目链接:https://codeforces.com/contest/1375/problem/E 题意 给出一个大小为 $n$ 的数组 $a$,对数组中的所有逆序对进行排序,要求按照排序后的顺序交 ...
- Educational Codeforces Round 102 (Rated for Div. 2) D. Program (思维,前缀和)
题意:给你一个只含\(+\)和\(-\)的字符串,给你一个数\(x\),\(x\)初始为\(0\),随着字符串的遍历会加一减一,现在有\(m\)个询问,每个询问给出一个区间\([l,r]\)表示将这个 ...
- POJ2429 GCD & LCM Inverse pollard_rho大整数分解
Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and t ...
- 洛谷 P2895 [USACO08FEB]Meteor Shower S (BFS)
题意:你刚开始位于坐标轴的\((0,0)\)点,一共有\(m\)颗流星砸向地面,每颗流星在\(t\)时砸到\((x,y)\)点,其四周上下左右也均有波及,你每秒可以向上下左右移动一个单位,问你是否可以 ...
- constexpr 的来龙去脉
constexpr 是什么? 关键字 constexpr (constant expression) 是在 C++11 中引入的,并且在 C++14 中进行了优化. constexpr 和 const ...