算法图解: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 ...
随机推荐
- Java——Character类
Java Character类 使用字符时,通常使用的是内置数据类型char. 实例: char ch = 'A'; //字符数组 char [] charArray = {'a','b','c',' ...
- JS 实现一个实时动态校验,将输入格式错误的显示为红色背景
功能描述: 源码: 功能描述: 实时动态校验,如果输入的格式错误,将弹窗提示输入格式错误并将背景展示为红色. 源码: 前台: <hy:formfield name="cxfdl&quo ...
- trunk
今天我们一起聊trunk(接vlan之后),一台switch我们用vlan就可以划分vlan(虚拟局域网),但是2台switch该怎么办呢? 实验环境搭建 switch0 : enable //切换到 ...
- Java使用反射的通用数组复制方法
Java通用数组复制方法 在Arrays工具类中,提供了一个copyOf(T[] original, int newLength)方法,用于复制任意类型的对象数组,但是由于泛型不能作用于基本类型,所以 ...
- D - D (最短路解决源点到多点,多点到源点的和(有向图))
问从1号点到各个点的距离+各个点到1号点之间的距离和的最小值 In the age of television, not many people attend theater performances ...
- hdu 6704 K-th occurrence(后缀数组+可持久化线段树)
Problem Description You are given a string S consisting of only lowercase english letters and some q ...
- Educational Codeforces Round 88 (Rated for Div. 2) A. Berland Poker(数学)
题目链接:https://codeforces.com/contest/1359/problem/A 题意 $n$ 张牌可以刚好被平分给 $k$ 个人,其中有 $m$ 张 joker,当一个人手中的 ...
- hdu 6832 A Very Easy Graph Problem 构造树+dfs
题意: 给你一个n个点m条边的图,对于第i条边,它的长度是2i,对于每一个顶点,它不是0类型,就是1类型.你需要找出来对于所有的"两个不同类型的点之间最短距离"的和 题解(参考:h ...
- Chip Factory HDU - 5536 字典树(删除节点|增加节点)
题意: t组样例,对于每一组样例第一行输入一个n,下面在输入n个数 你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 ("^&qu ...
- Linux系统SCSI磁盘扫描机制解析及命令实例
介绍Linux系统扫描SCSI磁盘有几种方式?Linux新增LUN之后,能否不重启主机就认出设备?如果安装了PowerPath,动态添加/删除LUN的命令是什么?本文总结了Linux主机对磁盘设备进行 ...