仅做学习记录,不建议参考,过几天整理
散列表
散列函数——将输入映射到数字
满足要求
- 必须是一致的。
- 应该将不同的输入映射到不同的数字。
【散列表】平均情况 | 【散列表】最糟情况 | 【数组】 | 【链表】 | |
---|---|---|---|---|
查找 | O ( 1 ) O(1) O(1) | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) | O ( n ) O(n) O(n) |
插入 | O ( 1 ) O(1) O(1) | O ( n ) O(n) O(n) | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) |
删除 | O ( 1 ) O(1) O(1) | O ( n ) O(n) O(n) | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) |
在平均情况下,散列表的查找速度与数组一样快,而插入和删除速度和链表一样快。在最糟情况下,散列表的速度很慢。因此,在使用散列表时,避开最糟情况至关重要。为此,需要避免冲突。
- 较低的填装因子
- 良好的散列函数
填装因子
散 列 表 包 含 的 元 素 数 位 置 总 数 \frac{散列表包含的元素数}{位置总数} 位置总数散列表包含的元素数
填装因子大于1,需要在散列表中添加位置,被称为调整长度
- 创建一个更长的新数组:通常将数组增长一倍
- 使用函数hash将所有的元素都插入到这个新的散列表中。
填装因子越低,发生冲突的可能性越小,散列表的性能越高。
(一旦填装因子大于0.7,就调整散列表的长度)
良好的散列函数
良好的散列函数让数组中的值呈均匀分布。
糟糕的散列函数导致大量的冲突。
图
图由节点(node)和边(edge)组成。
- 使用图来建立问题模型
- 使用广度优先搜索解决问题
实现图
散列表
graph={}
graph["you"]=["alice","bob","claire"]
graph["bob"]=["anuj","peggy"]
graph["alice"]=["peggy"]
graph["claire"]=["thom","jonny"]
graph["anuj"]=[]
graph["penny"]=[]
graph["thom"]=[]
graph["jonny"]=[]
广度优先搜索
解决问题:
- 第一类:从节点A出发,有前往节点B的路径吗?
- 第二类:从节点A出发,前往节点B的哪条路径最短?
查找最短路径
- 查找一度关系→查找二度关系→……→找到
- 按添加顺序查找——队列
队列
只支持两种操作:入队,出队
- 创建一个队列
from collections import deque
# 创建一个队列
search_queue=deque()
# 将你的邻居添加到搜索队列中
search_queue+=graph["you"]
-
判断条件
def person_is_true(name): return name[-1]=='m'
-
while search_queue: #取出第一个人 person=search_queue.popleft() if person_is_true(person): print(person+"is true!") return True else: search_queue+=graph[person] return False
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 person_is_true(name):
return name[-1]=='m'
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_true(person):
print(person+" is true!")
return True
else:
search_queue+=graph[person]
searched.append(person)
return False
search("you")