最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python如何自定義鄰接表圖類

 更新時間:2022年12月16日 17:02:35   作者:夜空下的凝視  
這篇文章主要介紹了Python如何自定義鄰接表圖類問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Python自定義鄰接表圖類

圖抽象數(shù)據(jù)類型(ADT)的術(shù)語

頂點(Vertex):也稱節(jié)點(node),是圖的基礎(chǔ)部分。具有名稱標(biāo)識“key”。頂點也可以有附加信息項“playload”。

邊(Edge):也稱弧(arc),也是圖的基礎(chǔ)組成部分。如果一條邊連接兩個頂點,則表示兩者具有聯(lián)系。邊可以是單向的,也可以是雙向的。如果圖中的邊都是單向的,則稱這個圖是“有向圖(directed graph/digraph)”。

權(quán)重(Weight):為了表達從一個頂點到另一個頂點的“代價”,可以給邊賦權(quán)。

路徑(Path):圖中的路徑,是由邊依次連接起來的頂點序列。無權(quán)路徑的長度為邊的數(shù)量。帶權(quán)路徑的長度為所有邊的權(quán)重之和。

圈(Cycle):有向圖里的圈是首尾頂點相同的路徑。沒有圈的圖稱為“無圈圖(acyclic graph)”,沒有圈的有向圖稱為“有向無圈圖(directed acyclic graph 或 DAG)”。

實現(xiàn)圖的兩個著名方法:鄰接矩陣(adjacency matrix)和鄰接表(adjacency list)。

鄰接矩陣和鄰接表的優(yōu)缺點

二維矩陣中,每行和每列都代表圖中的頂點。如果頂點v到頂點w之間有邊相連,則將值儲存在矩陣的v行、w列。每一格的值代表了從頂點v到頂點w邊的權(quán)重。

鄰接矩陣的優(yōu)點:是簡單,然而,大部分的矩陣是空的,這種情況則稱矩陣是“稀疏”的。矩陣并不是一個儲存稀疏數(shù)據(jù)的有效途徑。

實現(xiàn)稀疏圖的更高效方法是使用鄰接表(adjacency list)。

在這個實現(xiàn)方法中,包含一個含有所有頂點的主列表(master list),主列表中的每個頂點,再關(guān)聯(lián)一個與自身有邊連接的所有頂點的列表。

在實現(xiàn)頂點類的方法中使用字典而不是列表,字典中的鍵(key)對應(yīng)頂點,值(value)則保存頂點連接邊的權(quán)重。

鄰接表的優(yōu)點:是能高效地表示一個稀疏圖。鄰接表還能很容易的找到某個頂點與其他頂點的所有連接。

自定義頂點類

class Vertex(object):
	# 初始化頂點
	def __init__(self, key):
		self.id = key 							#初始化頂點的鍵
		self.connectedTo = {}					#初始化頂點的值

	# 添加鄰居頂點,參數(shù)nbr是鄰居頂點的鍵,默認(rèn)權(quán)重為0	
	def addNeighbor(self, nbr, weight=0):
		self.connectedTo[nbr] = weight

	def __str__(self):
		return str(self.id) + ' connectedTo: ' + str([x.id for x in self.connectedTo])

	# 獲取該頂點所有鄰居頂點的鍵
	def getConnections(self):
		return self.connectedTo.keys()

	# 獲取頂點的鍵
	def getId(self):
		return self.id

	# 獲取到某鄰居頂點的權(quán)重
	def getWeight(self, nbr):
		return self.connectedTo[nbr]

# 自定義圖類
class Graph(object):
	# 初始化圖
	def __init__(self):
		self.vertList = {}						#初始化鄰接表
		self.numVertices = 0 					#初始化頂點數(shù)

	# 添加頂點
	def addVertex(self, key):
		newVertex = Vertex(key)					#創(chuàng)建頂點
		self.vertList[key] = newVertex 			#將新頂點添加到鄰接表中
		self.numVertices = self.numVertices + 1 #鄰接表中頂點數(shù)+1
		return newVertex

	# 獲取頂點
	def getVertex(self, n):
		if n in self.vertList:					#若待查詢頂點在鄰接表中,則
			return self.vertList[n] 			#返回該頂點
		else:
			return None

	# 使之可用in方法
	def __contains__(self, n):
		return n in self.vertList

	# 添加邊,參數(shù)f為起始頂點的鍵,t為目標(biāo)頂點的鍵,cost為權(quán)重
	def addEdge(self, f, t, cost=0):
		if f not in self.vertList:				#起始頂點不在鄰接表中,則
			self.addVertex(f) 					#添加起始頂點
		if t not in self.vertList:				#目標(biāo)頂點不在鄰接表中,則
			self.addVertex(t)					#添加目標(biāo)頂點
		self.vertList[f].addNeighbor(self.vertList[t], cost)#在鄰接表中添加起始點的目標(biāo)點及權(quán)重

	# 獲取鄰接表中所有頂點的鍵
	def getVertices(self):
		return self.vertList.keys()

	# 迭代顯示鄰接表的每個頂點的鄰居節(jié)點
	def __iter__(self):
		return iter(self.vertList.values())


g = Graph() 									#實例化圖類
for i in range(6): 
	g.addVertex(i) 								#給鄰接表添加節(jié)點
print(g.vertList)								#打印鄰接表
g.addEdge(0, 1, 5) 								#給鄰接表添加邊及權(quán)重
g.addEdge(0, 5, 2) 
g.addEdge(1, 2, 4) 
g.addEdge(2, 3, 9) 
g.addEdge(3, 4, 7) 
g.addEdge(3, 5, 3) 
g.addEdge(4, 0, 1) 
g.addEdge(5, 4, 8) 
g.addEdge(5, 2, 1) 
for v in g: 									#循環(huán)每個頂點
	for w in v.getConnections(): 				#循環(huán)每個頂點的所有鄰居節(jié)點
		print("(%s, %s)" % (v.getId(), w.getId())) #打印頂點和其鄰居節(jié)點的鍵

結(jié)果為:

{0: <__main__.Vertex object at 0x00000000021BF828>, 1: <__main__.Vertex object at 0x00000000021BF860>, 2: <__main__.Vertex object at 0x00000000021BF898>, 3: <__main__.Vertex object at 0x00000000021BF8D0>, 4: <__main__.Vertex object at 0x00000000021BF908>, 5: <__main__.Vertex object at 0x00000000021BF940>}
(0, 1)
(0, 5)
(1, 2)
(2, 3)
(3, 4)
(3, 5)
(4, 0)
(5, 4)
(5, 2)

python圖的鄰接表表示

我就廢話不多說了,上代碼

"""圖的鄰接表表示"""
 
class GraphNode(object):
    """節(jié)點類"""
    def __init__(self,_elem=None):
        self._elem = _elem # 數(shù)據(jù)域
        self._next = None # 指針域
 
 
class Graph(object):
    """圖類"""
    def __init__(self):
        """初始化一個序列"""
        self._graph = []
 
    def createPeak(self,newNode):
        """創(chuàng)建一個圖頂點"""
        self._graph.append(newNode)
        return self._graph
 
    def createSide(self):
        """創(chuàng)建圖的邊"""
        for node in self._graph:
            graphNode = node
            print(f"請輸入{graphNode._elem}的鄰接點,以-1結(jié)束")
            while True:
                _graphNode = GraphNode() # 初始化每個節(jié)點的鄰接點
                end = input("請輸入: ")
                if end == '-1':
                    self.printGraph()
                    break
                else:
                    """臨時列表圖中的節(jié)點值,用來后續(xù)判斷"""
                    temp = []
                    for item in self._graph:
                        temp.append(item._elem)
                    if end not in temp:
                        """輸入的鄰接節(jié)點不在頂點中"""
                        print("輸入的節(jié)點不屬于圖中的頂點,重新輸入")
                        continue
                    elif end == graphNode._elem:
                        """輸入的頂點就是當(dāng)前頂點"""
                        print("輸入的是當(dāng)前節(jié)點,重新輸入")
                        continue
                    else:
                        # 新建節(jié)點
                        _graphNode._elem = end
                        # 指針向后移
                        _graphNode._next = graphNode._next
                        graphNode._next = _graphNode
                        graphNode = graphNode._next
 
    def printGraph(self):
        """遍歷當(dāng)前節(jié)點列表"""
        for node in self._graph:
            print(f"頂點{node._elem}的鄰接鏈表: ",end='')
            while node != None:
                if node._next != None:
                    print(f'{node._elem}-->',end='')
                else:
                    print(f'{node._elem}', end='')
                node = node._next
            print() # 換節(jié)點,換行
 
 
if __name__ == '__main__':
    count = int(input('請輸入頂點個數(shù): '))
    s = Graph()
    # 創(chuàng)建節(jié)點
    peakNodeStr = input('請輸入頂點: ')
    peakNodes = peakNodeStr.split(' ')
    # 將輸入的節(jié)點實例化之后添加到圖的鏈表中
    for peakNode in peakNodes:
        peak = GraphNode(peakNode)
        s.createPeak(peak)
 
    print('圖中的節(jié)點:',end='')
    for peak in s._graph:
        print(peak._elem,end=' ')
    print()
 
    # 創(chuàng)建邊
    s.createSide()

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 記一次Django響應(yīng)超慢的解決過程

    記一次Django響應(yīng)超慢的解決過程

    這篇文章主要介紹了記一次Django響應(yīng)超慢的解決過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • python連接sql server亂碼的解決方法

    python連接sql server亂碼的解決方法

    為解決python連接sql server是出現(xiàn)的亂碼,需要在連接sql server 時指定字符集utf8(client charset = UTF-8),python環(huán)境制定了字符集變量(#coding=utf-8 )
    2013-01-01
  • python實現(xiàn)進度條的多種實現(xiàn)

    python實現(xiàn)進度條的多種實現(xiàn)

    這篇文章主要介紹了python實現(xiàn)進度條的多種實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python中文分詞+詞頻統(tǒng)計的實現(xiàn)步驟

    python中文分詞+詞頻統(tǒng)計的實現(xiàn)步驟

    詞頻統(tǒng)計就是輸入一段句子或者一篇文章,然后統(tǒng)計句子中每個單詞出現(xiàn)的次數(shù),下面這篇文章主要給大家介紹了關(guān)于python中文分詞+詞頻統(tǒng)計的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • PyTorch一小時掌握之基本操作篇

    PyTorch一小時掌握之基本操作篇

    這篇文章主要介紹了PyTorch一小時掌握之基本操作篇,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • python爬蟲之生活常識解答機器人

    python爬蟲之生活常識解答機器人

    這篇文章主要介紹了python爬蟲之生活常識解答機器人,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Python中的Numpy入門教程

    Python中的Numpy入門教程

    這篇文章主要介紹了Python中的Numpy入門教程,著重講解了矩陣中的數(shù)組操作,需要的朋友可以參考下
    2014-04-04
  • Python使用sftp實現(xiàn)上傳和下載功能(實例代碼)

    Python使用sftp實現(xiàn)上傳和下載功能(實例代碼)

    在Python中可以使用paramiko模塊中的sftp登陸遠程主機,實現(xiàn)上傳和下載功能。接下來通過本文給大家介紹Python使用sftp實現(xiàn)上傳和下載功能,需要的朋友參考下
    2017-03-03
  • Python?Asyncio中Coroutines,Tasks,Future可等待對象的關(guān)系及作用

    Python?Asyncio中Coroutines,Tasks,Future可等待對象的關(guān)系及作用

    這篇文章主要介紹了Python?Asyncio中Coroutines,Tasks,Future可等待對象的關(guān)系及作用,文章圍繞主題展開詳細的內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-06-06
  • Python使用captcha制作驗證碼的實現(xiàn)示例

    Python使用captcha制作驗證碼的實現(xiàn)示例

    本文主要介紹了Python使用captcha制作驗證碼的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評論

西昌市| 来凤县| 高安市| 青浦区| 合江县| 通化县| 安阳县| 泰州市| 清远市| 岚皋县| 屏山县| 云梦县| 英德市| 潍坊市| 米林县| 务川| 西贡区| 彩票| 大渡口区| 盖州市| 柘城县| 汉源县| 开封县| 海林市| 凭祥市| 徐汇区| 合江县| 石林| 修文县| 马鞍山市| 会昌县| 太白县| 准格尔旗| 铜川市| 湟源县| 汕头市| 永春县| 黄冈市| 隆尧县| 获嘉县| 郎溪县|