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

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

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

本文將介紹Python實現圖算法的底層技術,包括圖的存儲方式、遍歷方式、最短路徑算法、最小生成樹算法以及拓撲排序算法,重點介紹各算法的實現思路和代碼示例。

一、圖的存儲方式

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

1、鄰接矩陣

鄰接矩陣是一個二維矩陣,其中頂點的行和列分別對應兩個頂點。如果兩個頂點之間有邊相連,則該位置值設為1或其邊權值;否則設為0。例如,下面是一個鄰接矩陣的例子:

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

登錄后復制

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

2、鄰接表

鄰接表是一個字典,其中每個鍵對應一個頂點,對應的值是該頂點的鄰居頂點列表。例如:

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

登錄后復制

這個字典表示同樣的無向圖,其中每個鍵值對應一個頂點,這個頂點對應的值是這個頂點和其它頂點之間的連邊。

二、圖的遍歷方式

1、深度優先遍歷(DFS)

深度優先遍歷是搜索所有子樹的深度方向,也就是先訪問當前頂點,然后遞歸訪問它的每一個鄰居頂點。對于每個頂點,我們必須記住它是否被訪問過;如果未訪問,就遞歸遍歷它的鄰居頂點。代碼實現:

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

登錄后復制

2、廣度優先遍歷(BFS)

廣度優先遍歷是搜索所有子樹的廣度方向,也就是先訪問當前頂點,然后訪問它的所有鄰居頂點。對于每個頂點,我們必須記住它是否被訪問過;如果未訪問,就加入隊列中并標記為已訪問,然后遞歸它的鄰居頂點。代碼實現:

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)

登錄后復制

三、圖算法

1、最短路徑算法

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

(1)Dijkstra算法

Dijkstra算法用于有向無環圖,并且只能處理非負權值的圖。該算法的核心是貪心策略,即假定路徑是由許多獨立的單元(節點)組成的,對每個單元的最短路徑進行逐一考慮,找到全局最短路。代碼實現:

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

登錄后復制

(2)Bellman-Ford算法

Bellman-Ford算法能夠處理任何圖,包括負權值的圖。該算法通過動態規劃的方式來解決最短路徑問題。代碼實現:

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

登錄后復制

2、最小生成樹算法

最小生成樹問題是尋找無向加權圖的所有頂點所構成的子圖,使得該子圖中所有邊的權值之和最小。其中,Kruskal和Prim算法都是解決該問題的經典算法。

(1)Kruskal算法

Kruskal算法是一種貪心算法,從所有邊中選取權值最小的邊,依次尋找下一條權值最小的邊,直到頂點數與邊數匹配為止。代碼實現:

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

登錄后復制

(2)Prim算法

Prim算法開始任選一個頂點作為起點,每次根據當前生成樹與圖中其它頂點的距離,以及其它頂點與當前生成樹的最小距離來選擇一個新的頂點加入到生成樹中。代碼實現:

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

登錄后復制

3、拓撲排序算法

拓撲排序算法主要用于處理有向無環圖中的邏輯依賴關系,通常用來解決編譯依賴或任務調度問題。代碼實現:

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

登錄后復制

四、總結

本文介紹了Python實現圖算法的底層技術,包括圖的存儲方式、遍歷方式、最短路徑算法、最小生成樹算法以及拓撲排序算法,通過具體的代碼示例,讓讀者了解每種算法的實現思路和代碼實現細節。在實際開發過程中,讀者可以根據自己的需求選擇不同的算法,以提高程序的效率和質量。

分享到:
標簽:Python 圖算法 底層技術
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定