今天是读《python算法教程》的第2天,读书笔记内容为用python实现图和树的基本数据结构。
图
图的基本数据结构有两种,分别为邻接列表和邻接矩阵。
现根据下图通过python实现邻接列表和邻接矩阵,
代码如下:
#图的基本数据结构及python的实现形式
#邻接列表
#无权邻接列表
a,b,c,d,e,f=range(6)
#主容器、节点结构均为列表
ug1=[
[b,c,d,f],
[f],
[d,e,f],
[e],
[f],
[e]
]
print("在ug1中,节点a的邻接点数量为",len(ug1[a]))
print("在ug1中,节点c是邻接节点a",c in ug1[a])
#主容器为列表,节点结构为set类型
ug2=[
{b,c,d,f},
{f},
{d,e,f},
{e},
{f},
{e}
]
print("\n在ug2中,节点a的邻接点数量为",len(ug1[a]))
print("在ug2中,节点c是否邻接节点a",c in ug1[a])
#主要结构为字典,节点结构为set类型,此种结构无需定义索引
ug3={
"a":{"b","c","d","f"},
"b":{"f"},
"c":{"def"},
"d":{"e"},
"e":{"f"},
"f":{"e"}
}
print("\n在ug3中,节点a的邻接点数为",len(ug3["a"]))
print("在ug3中,节点c是否邻接节点a","c" in ug3["a"])
#加权临界列表
#主结构为列表,系节点结构为字典
wg1=[
{b:1,c:2,d:4,f:5},
{f:3},
{e:2,f:3},
{e:2},
{f:2},
{e:3}
]
print("\n在wg1中,节点a的邻接点数量为",len(wg1[a]))
print("在wg1中,节点c是否邻接节点a",c in wg1[a].keys())
print("在wg1中,节点a与节点f的边的权重为",wg1[a][f])
#邻接矩阵d
#无权邻接矩阵
uam=[
[0,1,1,1,0,1],
[0,0,0,0,0,1],
[0,0,0,1,1,1],
[0,0,0,0,1,0],
[0,0,0,0,0,1],
[0,0,0,0,1,0]
]
print("\n在uam中,节点a的邻接点数量为",sum(1 for ele in uam[a] if ele>0))
print("在uam中,节点c是否为节点a的邻接点",uam[a][c]>0)
#加权邻接矩阵,此处将没有邻接的两个节点的边的权重定义为-1
wam=[
[-1,1,2,4,-1,5],
[-1,-1,-1,-1,-1,3],
[-1,-1,-1,-1,2,3],
[-1,-1,1,-1,-1],
[-1,-1,-1,-1,-1,2],
[-1,-1,-1,-1,3,-1]
]
print("\n在wam中,节点a的邻接点数量为",sum(1 for ele in wam[a] if ele>-1))
print("s在wam中,节点c的是否为节点a的邻接点",wam[a][c]>-1)
树
树可视为图的一种特殊结构,但图也有其特殊性。
以下通过python实现树的数据结构
#树的基本数据结构及python的实现形式
#套嵌列表,每一层的节点索引按从上到下的顺序从0开始进行编号
t1=[
["e","f"],
["h","i",["l","m"]],
["k"]
]
#自定义类:多路搜索树
class tree:
def __init__(self,value,child=None,next=None):
self.value=value
self.child=child
self.next=next