//二分查找法
import numpy as np
def binary_search(a,item):
low=0
high=len(a)-1
while low<=high:
//检查中间的元素
mid=int((low+high)/2)
guess=a[mid]
//根据大小修改数字
if guess == item:
return mid
if guess > item:
high=mid-1
else:
low=mid+1
return None
a=[1,3,7,8,9]
print(binary_search(a,3))
常见操作 | 数组 | 链表 |
---|---|---|
读取 | O(1) | O(n) |
插入 | O(n) | O(1) |
删除 | O(n) | O(1) |
//选择排序,数组元素从小至大排序
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 selectionSort(arr):
newArr=[]
for i in range(len(arr)):
smallest=findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr
print (selectionSort([5,3,6,2,10]))
def greet(name):
print ("hello")
greet2(name)
print("getting ready to say bye")
bye()
、、、、、
调用greet("me")时
1.为greet()分配内存
2.为greet2()调用内存,第二个内存块位于第一个内存块之上,完成这个函数后,栈顶的内存块被弹出
3.打印print,调用bye(),再次分配内存块在greet()内存块之上
、、、、
def fact(x):
if x==1:
return 1
else:
return x*fact(x-1)
示例
#习题:编写列表的和,计数,最大值
#数字总和
def sum(list):
if list==[]:
return 0
return list[0] + sum(list[1:])
#计数总和
def count(list):
if list==[]:
return 0
return 1+count(list[1:])
#最大值
def max(list):
if len(list) == 2:
return list[0] if list[0] >list[1] else list[1]
sub_max =max(list[1:])
return list[0] if list[0] >sub_max else sub_max
算法步骤
#快速排序
def quicksort(array):
if len(array)<2:
return array
else:
pivot=array[0]
less =[i for i in array[1:] if i<=pivot]
greater =[i for i in array[1:] if i>pivot]
return quicksort(less) +[pivot]+quicksort(greater)
print (quicksort([10,5,2,3]))
引言:
散列函数:将输入映射到数字
例子:杂货店找商品的价格
散列表:包含额外逻辑的数据结构,也被称为散列映射、映射、字典和关联数组。
数组和链表可以直接映射到内存,散列表使用散列函数确定元素的存储位置。
#python的散列表为字典
book=dict()
或
book={}
#检查是否投过票
voted={}
def check_vote(name):
if voted.get(name):
print ("kick them out")
else:
voted[name]=Ture
print("let them vote")
#访问facebook页面
cache={}
def get_page(url):
if cache.get(url):
return cache[url]
else:
data=get_data_from_server(url)
cache[url]=data
return data
散列表的性能
常见操作 | 平均情况 | 最糟情况 |
---|---|---|
查找 | O(1) | O(n) |
插入 | O(1) | O(n) |
删除 | O(1) | O(n) |
#每个节点与邻近节点相连,使用散列表结构
#散列表是无序的,添加键值对的顺序是无关紧要的
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"]=[]
#实现算法
from collections import deque
def search(name):
#创建队列
search_queue=deque()
#将邻居都加入这个搜索队列中
search_queue+=graph[name]
searched=[]
while search_queue:
#只要队列不为空就取出其中的第一个人
person =search_queue.popleft()
if person not in searched:
if person_is_seller(person):
print(person+" is a mango seller")
return True
else:
search_queue+=graph[person]
searched.append(person)
return False
#判断是不是芒果经销商
def person_is_seller(name):
return name[-1]=='m'
#创建图的散列表
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:
cost=costs[node]
if cost<lowest_cost and node not in processed:
lowest_cost=cost
lowest_cost_node=node
return lowest_cost_node
node=find_lowest_cost_node(costs)
while node is not None:
cost=costs[node]
neighbors=graph[node]
for n in neighbors.keys():
new_cost=cost+neighbors[n]
if costs[n]>new_cost:
costs[n]=new_cost
parents[n]=node
processed.append(node)
node=find_lowest_cost_node(costs)
#集合覆盖问题
#创建列表,包含要覆盖的州
#传入数组,转换为集合,因为集合不能包含重复的元素
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 in stations.items(): #返回可遍历的(键, 值) 元组数组。
covered=states_needed & states#计算交集
#检查该广播台覆盖的州是否比best_covered多
if len(covered)>len(states_covered):
best_station=station
states_covered=covered
states_needed-=states_covered
final_stations.add(best_station)
print(final_stations)
1.树:二分查找需要将新的用户名插入数组重新排序,如果无需插入后排序,可以使用二叉查找树。
(1)对于其中每一个节点,左子节点的值都比它小,而右子节点的值都比它大。
(2)二叉查找树不能随机访问。
常见操作 | 数组 | 二叉查找树 |
---|---|---|
查找 | O ( log n ) O(\log n) O(logn) | O ( log n ) O(\log n) O(logn) |
插入 | O ( n ) O(n) O(n) | O ( log n ) O(\log n) O(logn) |
删除 | O ( n ) O(n) O(n) | O ( log n ) O(\log n) O(logn) |
(1)映射函数:将一个数组转换为另一个数组
arr1=[1,2,3,4,5]
#将数组元素翻倍
arr2=map(lambda x: 2*x, arr1)
(2)归并函数:将一个数组转换为一个元素
arr1=[1,2,3,4,5]
#数组元素相加
reduce(lambda x,y:x+y,arr1)