第一章、算法简介
1、二分查找
说明:二分查找是一种算法,其输入一个有序的元素列表,如果要查找的元素包含在列表中,二分查找返回其位置,否则返回null。
def binary_search(list0,n):
low=0
high=len(list0)-1
while low<=high:
mid=(low+high)//2
if n==list0[mid]:
return mid
if n<list0[mid]:
high=mid-1
else:
low=mid+1
return None
list0=[2,4,5,8,10,12,13,14,18,22,28]
n=6
print(binary_search(list0,18))
2、一些常见的大O运行时间及图表
第二章、选择排序
def find_smallest(list0):
smallest=list0[0]
index_smallest=0
for i in range(1,len(list0)):
if list0[i]<smallest:
smallest=list0[i]
index_smallest=i
return index_smallest
def selectionSort(list0):
res=[]
for i in range(len(list0)):
var=find_smallest(list0)
res.append(list0.pop(var))
return res
list0=[8,10,12,13,22,18,2,4,5,14,28]
print(selectionSort(list0))
第三章、递归
递归求和
def count(arr):
if not arr:
return 0
else:
return arr[0]+count(arr[1:])
第四章、快速排序
分治法思想:
1、找出基线条件;
2、缩小问题规模,使之符合基线条件;
快速排序步骤:
1、选择基准值;
2、将数组分成两个子数组;
3、对这两个子数组进行快速排序;
def quicksort(list0):
if len(list0)<2:
return list0
pivot=list0[0]
less=[i for i in list0[1:] if i<=pivot]
more=[i for i in list0[1:] if i>pivot]
return quicksort(less)+[pivot]+quicksort(more)
print(quicksort([4,6,1,2,9,6,7]))
第六章、广度优先算法
广度优先算法解决两个问题:
1、从节点A出发是否有前往节点B的路径;
2、从节点A出发前往节点B的哪条路径最短;
书中示例
from collections import deque
graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["thom"] = []
graph["jonny"] = []
def search(name):
search_queue=deque()
search_queue+=graph[name]
searched=[]
while search_queue:
person=search_queue.popleft()
if person not in searched:
if test(person):
return person
else:
search_queue+=graph[person]
searched.append(person)
return None
def test(person):
return person[-1]=='m'
print(search('you'))
第七章、迪杰斯特拉算法
迪杰斯特拉算法包含四个步骤:
1、找出“最便宜”的节点,即可在最短时间内到达的节点;
2、更新该节点的邻居的开销;
3、重复这个过程,直到图中每个节点都涉及到;
4、计算最终路径;
书中示例
#图
graph={}
graph["start"]={}
graph["start"]["a"] = 6
graph["start"]["b"] = 2
graph["a"] = {}
graph["a"]["fin"] = 1
graph["b"] = {}
graph["b"]["a"] = 3
graph["b"]["fin"] = 5
graph["fin"] = {}
#节点开销
infinity = float("inf")
costs = {}
costs["a"] = 6
costs["b"] = 2
costs["fin"] = infinity
#存储父节点
parents = {}
parents["a"] = "start"
parents["b"] = "start"
parents["fin"] = None
#已处理节点
processed = []
#找到未被处理的开销最小节点
def find_lowest_cost_node(costs):
lowest_cost=float("inf")
lowest_cost_node=None
for node in costs:
if node not in processed:
if costs[node]<lowest_cost:
lowest_cost=costs[node]
lowest_cost_node=node
return lowest_cost_node
#迪杰斯特拉算法
node=find_lowest_cost_node(costs)
while node:
cost=costs[node]
for k in graph[node].keys():
new_cost=cost+graph[node][k]
if new_cost<costs[k]:
costs[k]=new_cost
parents[k]=node
processed.append(node)
node=find_lowest_cost_node(costs)
print(costs)
print(parents)
第八章、贪婪算法
书中示例
states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])
stations = {}
stations["kone"] = set(["id", "nv", "ut"])
stations["ktwo"] = set(["wa", "id", "mt"])
stations["kthree"] = set(["or", "nv", "ca"])
stations["kfour"] = set(["nv", "ut"])
stations["kfive"] = set(["ca", "az"])
final_stations = set()
while states_needed:
best_station = None
states_covered = set()
for station, states_for_station in stations.items():
covered = states_needed & states_for_station
if len(covered)>len(states_covered):
best_station=station
states_covered=covered
final_stations.add(best_station)
states_needed-=states_covered
print(final_stations)