二分查找

选择排序

递归

快速排序

广度优先搜索

狄克斯特拉算法

贪婪算法

二分查找

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. <算法图解>读书笔记:第1章 算法简介

    阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...

  2. <算法图解>读书笔记:第4章 快速排序

    第4章 快速排序 4.1 分而治之 "分而治之"( Divide and conquer)方法(又称"分治术") ,是有效算法设计中普遍采用的一种技术. 所谓& ...

  3. Python算法——《算法图解》笔记

    算法目录 二分查找 大O表示法 选择排序 递归 快速排序,分而治之(D&C) 散列表——字典 广度优先搜索——BFS Dijkstra算法 贪婪算法 二分查找 # 要求list是有序表,num ...

  4. <算法图解>读书笔记:第2章 选择排序

    第2章 选择排序 2.1 内存的工作原理 需要将数据存储到内存时,请求计算机提供存储空间,计算机会给一个存储地址.需要存储多项数据时,有两种基本方式-数组和链表 2.2 数组和链表 2.2.1 链表 ...

  5. <算法图解>读书笔记:第3章 递归

    第3章 递归 3.1 递归 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一 ...

  6. 算法图解学习笔记01:二分查找&大O表示法

    二分查找 二分查找又称折半查找,其输入的必须是有序的元素列表.二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止:如果x<a[ ...

  7. 多元线性回归算法的python底层代码编写实现

    1.对于多元线性回归算法,它对于数据集具有较好的可解释性,我们可以对比不过特征参数的输出系数的大小来判断它对数据的影响权重,进而对其中隐含的参数进行扩展和收集,提高整体训练数据的准确性. 2.多元回归 ...

  8. python聚类算法实战详细笔记 (python3.6+(win10、Linux))

    python聚类算法实战详细笔记 (python3.6+(win10.Linux)) 一.基本概念:     1.计算TF-DIF TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库 ...

  9. 数据关联分析 association analysis (Aprior算法,python代码)

    1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...

随机推荐

  1. SpringBoot-文件系统-Excel,PDF,XML,CSV

    SpringBoot-文件系统-Excel,PDF,XML,CSV 1.Excel文件管理 1.1 POI依赖 1.2 文件读取 1.3 文件创建 1.4 文件导出 1.5 文件导出接口 2.PDF文 ...

  2. Spring 启动脚本

    if [ $# != 3 ];then echo 'option-1: start,stop or restart.' echo 'option-2: 请传入jar路径' echo 'option-3 ...

  3. (15)Linux命令基本格式

    1.命令提示符 登录系统后,第一眼看到的内容是: [root@localhost ~]# 这就是 Linux 系统的命令提示符.那么,这个提示符的含义是什么呢? []:这是提示符的分隔符号,没有特殊含 ...

  4. 遇到的一个bug

    /// <summary> /// 检测玩家是否在机器人的球形碰撞体内,这个碰撞体是机器人的侦测范围,玩家在内部会进行视野检测和声音检测 /// </summary> priv ...

  5. 漫画 | CPU战争40年,真正的王者终于现身!

    上个世纪70年代,内存又慢又贵, 程序员得想尽一切办法节省内存. 那个时代的编译器也比较差劲 所以,70年代的程序员几乎都写得一手好汇编. 为了帮助程序员写好汇编,这个时候的CPU也有意把指令集做了增 ...

  6. 16天5面,我终于拿到了鹅厂Offer

    目录 1 - 为什么要在年底离职 1.1 惊觉:没有什么成长 1.2 投简历,敲打自己 1.3 面试它来了 1.4 提前触到目标? 2 - 我的鹅厂面试 2.1 技术一面 Java 语言相关 通用学科 ...

  7. 关于cnblogs至github上blog的搬迁

    由于同学的强烈抗议(由于网页太卡,而且还有bug),所以在今天完成了github上blog的搭建,并且有了良好的阅读环境; Leceue

  8. Codeforces1248F. Catowice City

    题意:1e6个人每人有一只猫 每个人认识自己的猫 现给出一些关系表示一个人认识某只猫 要选出一些人和一些猫 使得每个人都不认识选出来的猫 且人+猫=n 题解:答案肯定是 一个人的集合和一个猫的集合 那 ...

  9. Codeforces301D. Yaroslav and Divisors

    题意:2e5的全排列 每次询问一个区间有多少对数 满足一个数是另一个数的倍数 题解:考虑离线来做 看到有个说法说 在处理有两种约束的问题时 一般用数据结构边插入边询问的方式 这个题正是如此 我们用su ...

  10. ACM-ICPC 2018 徐州赛区网络预赛(8/11)

    ACM-ICPC 2018 徐州赛区网络预赛 A.Hard to prepare 枚举第一个选的,接下来的那个不能取前一个的取反 \(DP[i][0]\)表示选和第一个相同的 \(DP[i][1]\) ...