Python学习日志《python算法基础》读书笔记

《python算法教程》Day2 - 图和树的基本数据结构

2018-04-05  本文已影响36人  billyang916

今天是读《python算法教程》的第2天,读书笔记内容为用python实现图和树的基本数据结构。

图的基本数据结构有两种,分别为邻接列表和邻接矩阵。
现根据下图通过python实现邻接列表和邻接矩阵,


图.jpg

代码如下:

#图的基本数据结构及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

上一篇下一篇

猜你喜欢

热点阅读