日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

隨著計(jì)算機(jī)技術(shù)的不斷發(fā)展,圖論(graph theory)及其相關(guān)算法已經(jīng)成為了計(jì)算機(jī)領(lǐng)域中非常重要的一部分。而對(duì)于Python程序員來說,掌握這些底層技術(shù)不僅可以提高代碼的效率和質(zhì)量,還有助于優(yōu)化程序的性能和開發(fā)效率。

本文將介紹Python實(shí)現(xiàn)圖算法的底層技術(shù),包括圖的存儲(chǔ)方式、遍歷方式、最短路徑算法、最小生成樹算法以及拓?fù)渑判蛩惴ǎ攸c(diǎn)介紹各算法的實(shí)現(xiàn)思路和代碼示例。

一、圖的存儲(chǔ)方式

在Python中,我們可以使用鄰接矩陣或鄰接表來存儲(chǔ)圖。

1、鄰接矩陣

鄰接矩陣是一個(gè)二維矩陣,其中頂點(diǎn)的行和列分別對(duì)應(yīng)兩個(gè)頂點(diǎn)。如果兩個(gè)頂點(diǎn)之間有邊相連,則該位置值設(shè)為1或其邊權(quán)值;否則設(shè)為0。例如,下面是一個(gè)鄰接矩陣的例子:

graph = [[0, 1, 1, 0], 
         [1, 0, 1, 1], 
         [1, 1, 0, 1], 
         [0, 1, 1, 0]]

登錄后復(fù)制

這個(gè)矩陣表示一個(gè)無向圖,共有4個(gè)頂點(diǎn),其中1、2、3之間互相有連邊。

2、鄰接表

鄰接表是一個(gè)字典,其中每個(gè)鍵對(duì)應(yīng)一個(gè)頂點(diǎn),對(duì)應(yīng)的值是該頂點(diǎn)的鄰居頂點(diǎn)列表。例如:

graph = {0: [1, 2], 
         1: [0, 2, 3], 
         2: [0, 1, 3], 
         3: [1, 2]}

登錄后復(fù)制

這個(gè)字典表示同樣的無向圖,其中每個(gè)鍵值對(duì)應(yīng)一個(gè)頂點(diǎn),這個(gè)頂點(diǎn)對(duì)應(yīng)的值是這個(gè)頂點(diǎn)和其它頂點(diǎn)之間的連邊。

二、圖的遍歷方式

1、深度優(yōu)先遍歷(DFS)

深度優(yōu)先遍歷是搜索所有子樹的深度方向,也就是先訪問當(dāng)前頂點(diǎn),然后遞歸訪問它的每一個(gè)鄰居頂點(diǎn)。對(duì)于每個(gè)頂點(diǎn),我們必須記住它是否被訪問過;如果未訪問,就遞歸遍歷它的鄰居頂點(diǎn)。代碼實(shí)現(xiàn):

def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    print(start)
    for next_vertex in graph[start] - visited:
        dfs(graph, next_vertex, visited)
    return visited

登錄后復(fù)制

2、廣度優(yōu)先遍歷(BFS)

廣度優(yōu)先遍歷是搜索所有子樹的廣度方向,也就是先訪問當(dāng)前頂點(diǎn),然后訪問它的所有鄰居頂點(diǎn)。對(duì)于每個(gè)頂點(diǎn),我們必須記住它是否被訪問過;如果未訪問,就加入隊(duì)列中并標(biāo)記為已訪問,然后遞歸它的鄰居頂點(diǎn)。代碼實(shí)現(xiàn):

from collections import deque

def bfs(graph, start):
    visited, queue = set(), deque([start])
    visited.add(start)
    while queue:
        vertex = queue.popleft()
        print(vertex)
        for next_vertex in graph[vertex] - visited:
            visited.add(next_vertex)
            queue.append(next_vertex)

登錄后復(fù)制

三、圖算法

1、最短路徑算法

最短路徑算法是尋找圖中兩個(gè)頂點(diǎn)之間最短路徑的算法。其中,Dijkstra算法用于有向無環(huán)圖(DAG),Bellman-Ford算法適用于任何圖。

(1)Dijkstra算法

Dijkstra算法用于有向無環(huán)圖,并且只能處理非負(fù)權(quán)值的圖。該算法的核心是貪心策略,即假定路徑是由許多獨(dú)立的單元(節(jié)點(diǎn))組成的,對(duì)每個(gè)單元的最短路徑進(jìn)行逐一考慮,找到全局最短路。代碼實(shí)現(xiàn):

import heapq
import sys

def dijkstra(graph, start):
    visited = set()
    distance = {vertex: sys.maxsize for vertex in graph}
    distance[start] = 0
    queue = [(0, start)]
    while queue:
        dist, vertex = heapq.heappop(queue)
        if vertex not in visited:
            visited.add(vertex)
            for neighbor, weight in graph[vertex].items():
                total_distance = dist + weight
                if total_distance < distance[neighbor]:
                    distance[neighbor] = total_distance
                    heapq.heappush(queue, (total_distance, neighbor))
    return distance

登錄后復(fù)制

(2)Bellman-Ford算法

Bellman-Ford算法能夠處理任何圖,包括負(fù)權(quán)值的圖。該算法通過動(dòng)態(tài)規(guī)劃的方式來解決最短路徑問題。代碼實(shí)現(xiàn):

import sys

def bellman_ford(graph, start):
    distance = {vertex: sys.maxsize for vertex in graph}
    distance[start] = 0
    for _ in range(len(graph) - 1):
        for vertex in graph:
            for neighbor, weight in graph[vertex].items():
                total_distance = distance[vertex] + weight
                if total_distance < distance[neighbor]:
                    distance[neighbor] = total_distance
    return distance

登錄后復(fù)制

2、最小生成樹算法

最小生成樹問題是尋找無向加權(quán)圖的所有頂點(diǎn)所構(gòu)成的子圖,使得該子圖中所有邊的權(quán)值之和最小。其中,Kruskal和Prim算法都是解決該問題的經(jīng)典算法。

(1)Kruskal算法

Kruskal算法是一種貪心算法,從所有邊中選取權(quán)值最小的邊,依次尋找下一條權(quán)值最小的邊,直到頂點(diǎn)數(shù)與邊數(shù)匹配為止。代碼實(shí)現(xiàn):

def kruskal(graph):
    parent = {}
    rank = {}
    for vertex in graph:
        parent[vertex] = vertex
        rank[vertex] = 0
    minimum_spanning_tree = set()
    edges = list(graph.edges)
    edges.sort()
    for edge in edges:
        weight, vertex1, vertex2 = edge
        root1 = find(parent, vertex1)
        root2 = find(parent, vertex2)
        if root1 != root2:
            minimum_spanning_tree.add(edge)
            if rank[root1] > rank[root2]:
                parent[root2] = root1
            else:
                parent[root1] = root2
                if rank[root1] == rank[root2]:
                    rank[root2] += 1
    return minimum_spanning_tree

登錄后復(fù)制

(2)Prim算法

Prim算法開始任選一個(gè)頂點(diǎn)作為起點(diǎn),每次根據(jù)當(dāng)前生成樹與圖中其它頂點(diǎn)的距離,以及其它頂點(diǎn)與當(dāng)前生成樹的最小距離來選擇一個(gè)新的頂點(diǎn)加入到生成樹中。代碼實(shí)現(xiàn):

import heapq

def prim(graph, start):
    minimum_spanning_tree = set()
    visited = set(start)
    edges = list(graph[start].items())
    heapq.heapify(edges)
    while edges:
        weight, vertex1 = heapq.heappop(edges)
        if vertex1 not in visited:
            visited.add(vertex1)
            minimum_spanning_tree.add((weight, start, vertex1))
            for vertex2, weight in graph[vertex1].items():
                if vertex2 not in visited:
                    heapq.heappush(edges, (weight, vertex1, vertex2))
    return minimum_spanning_tree

登錄后復(fù)制

3、拓?fù)渑判蛩惴?/p>

拓?fù)渑判蛩惴ㄖ饕糜谔幚碛邢驘o環(huán)圖中的邏輯依賴關(guān)系,通常用來解決編譯依賴或任務(wù)調(diào)度問題。代碼實(shí)現(xiàn):

from collections import defaultdict

def topological_sort(graph):
    in_degree = defaultdict(int)
    for vertex1 in graph:
        for vertex2 in graph[vertex1]:
            in_degree[vertex2] += 1
    queue = [vertex for vertex in graph if in_degree[vertex] == 0]
    result = []
    while queue:
        vertex = queue.pop()
        result.append(vertex)
        for next_vertex in graph[vertex]:
            in_degree[next_vertex] -= 1
            if in_degree[next_vertex] == 0:
                queue.append(next_vertex)
    if len(result) != len(graph):
        raise ValueError("The graph contains a cycle")
    return result

登錄后復(fù)制

四、總結(jié)

本文介紹了Python實(shí)現(xiàn)圖算法的底層技術(shù),包括圖的存儲(chǔ)方式、遍歷方式、最短路徑算法、最小生成樹算法以及拓?fù)渑判蛩惴ǎㄟ^具體的代碼示例,讓讀者了解每種算法的實(shí)現(xiàn)思路和代碼實(shí)現(xiàn)細(xì)節(jié)。在實(shí)際開發(fā)過程中,讀者可以根據(jù)自己的需求選擇不同的算法,以提高程序的效率和質(zhì)量。

分享到:
標(biāo)簽:Python 圖算法 底層技術(shù)
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定