成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 圖結構與樹形數據處理的六種算法實現

開發(fā)
在Python中,圖和樹是一種非常重要的非線性數據結構。簡單來說,圖是由節(jié)點(Node)和邊(Edge)組成的集合,而樹**是圖的一種特殊形式,具有層級關系。

一、圖結構與樹形數據的基礎概念

在Python中,圖和樹是一種非常重要的非線性數據結構。簡單來說,圖是由節(jié)點(Node)和邊(Edge)組成的集合,而樹**是圖的一種特殊形式,具有層級關系。

舉個例子:假設你有一個家族譜系,每個人是一個節(jié)點,父子關系是邊,這就是一棵樹!再比如社交網絡中,人與人之間的朋友關系可以看作是一個圖。

樹的基本術語:

  • 根節(jié)點(Root):樹的起點。
  • 子節(jié)點(Child):某個節(jié)點的直接后繼。
  • 父節(jié)點(Parent):某個節(jié)點的直接前驅。
  • 葉子節(jié)點(Leaf):沒有子節(jié)點的節(jié)點。

下面用Python定義一個簡單的樹:

class TreeNode:
    def __init__(self, value):
        self.value = value  # 節(jié)點值
        self.children = []  # 子節(jié)點列表

# 創(chuàng)建樹
root = TreeNode("A")
child1 = TreeNode("B")
child2 = TreeNode("C")
root.children.append(child1)
root.children.append(child2)

# 打印樹結構
def print_tree(node, level=0):
    print("  " * level + node.value)  # 按層級打印
    for child in node.children:
        print_tree(child, level + 1)

print_tree(root)

運行結果:

A
  B
  C

是不是很簡單?接下來我們還會深入講解如何用算法處理這些結構!

二、使用Python實現深度優(yōu)先搜索(DFS)算法

1. 什么是深度優(yōu)先搜索(DFS)

深度優(yōu)先搜索(DFS)是一種遍歷圖或樹的常用算法。它從起始節(jié)點開始,沿著一條路徑盡可能深入地探索,直到無法繼續(xù)為止,然后回溯到上一個節(jié)點,重復這個過程。

舉個例子:想象你在一個迷宮里,總是選擇第一個路口一直走下去,直到走不通才返回之前的岔路口嘗試另一條路。

2. Python代碼實現DFS

我們可以用遞歸或者棧來實現DFS。下面是一個基于遞歸的簡單實現:

# 定義圖結構為字典形式
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}

# 定義DFS函數
def dfs(graph, node, visited=None):
    if visited is None:  # 初始化訪問列表
        visited = set()
    visited.add(node)  # 標記當前節(jié)點為已訪問
    print(node, end=" ")  # 打印節(jié)點
    for neighbor in graph[node]:  # 遍歷相鄰節(jié)點
        if neighbor not in visited:  # 如果相鄰節(jié)點未訪問,則遞歸調用
            dfs(graph, neighbor, visited)

# 調用DFS函數
dfs(graph, 'A')

運行結果:

A B D E F C

這段代碼展示了如何通過遞歸實現DFS,從節(jié)點'A'開始遍歷整個圖。每個節(jié)點只會被訪問一次,避免了無限循環(huán)的問題。

三、使用Python實現廣度優(yōu)先搜索(BFS)算法

1. 什么是廣度優(yōu)先搜索(BFS)

廣度優(yōu)先搜索(BFS)是一種用于圖或樹的遍歷算法,它從根節(jié)點開始,逐層訪問所有鄰居節(jié)點。比如,我們要找朋友的朋友列表,BFS就很適合!下面通過一個簡單的例子來演示。

from collections import deque

# 定義圖結構
graph = {
    "你": ["Alice", "Bob", "Claire"],
    "Alice": ["Peggy"],
    "Bob": ["Anuj", "Peggy"],
    "Claire": ["Thom", "Jonny"]
}

def bfs(name):
    search_queue = deque()  # 創(chuàng)建隊列
    search_queue += graph[name]  # 將圖中的鄰居加入隊列
    searched = []  # 記錄已檢查過的人

    while search_queue:
        person = search_queue.popleft()  # 取出第一個人
        if person not in searched:  # 如果這個人沒被檢查過
            if person_is_seller(person):  # 檢查是否是銷售員
                print(f"{person} 是芒果銷售商!")
                return True
            else:
                search_queue += graph.get(person, [])  # 不是銷售商,將這個人的朋友加入隊列
                searched.append(person)  # 標記為已檢查
    return False

def person_is_seller(name):
    return name[-1] == 'm'  # 假設名字以m結尾的是銷售商

bfs("你")  # 調用BFS函數

運行結果可能為:

Thom 是芒果銷售商!

這段代碼展示了如何用BFS查找芒果銷售商。我們使用隊列保存需要檢查的人,并逐層擴展搜索范圍,直到找到目標!

四、理解并實現Dijkstra最短路徑算法

1. Dijkstra算法的基本原理

Dijkstra算法是用來解決單源最短路徑問題的經典算法。它的核心思想是:從起點出發(fā),逐步找到離起點最近的節(jié)點,并更新其他節(jié)點的距離。假設我們有一個圖,每個邊都有權重(表示距離),目標是從起點到所有其他節(jié)點的最短路徑。

比如,想象一個城市地圖,你想知道從家到公司的最短路線。Dijkstra算法就能幫你完成!

import heapq

def dijkstra(graph, start):
    # 初始化距離字典,所有節(jié)點距離設為無窮大
    distances = {node: float('inf') for node in graph}
    distances[start] = 0  # 起點距離為0
    priority_queue = [(0, start)]  # 優(yōu)先隊列存儲(距離, 節(jié)點)

    while priority_queue:
        current_distance, current_node = heapq.heappop(priority_queue)

        # 如果當前距離大于記錄的距離,則跳過
        if current_distance > distances[current_node]:
            continue

        # 遍歷鄰居節(jié)點
        for neighbor, weight in graph[current_node].items():
            distance = current_distance + weight

            # 如果找到更短路徑,更新距離并加入隊列
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                heapq.heappush(priority_queue, (distance, neighbor))

    return distances

# 示例圖結構
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}

print(dijkstra(graph, 'A'))  # 輸出: {'A': 0, 'B': 1, 'C': 3, 'D': 4}

代碼解析:

  • graph 是一個字典,表示帶權圖。例如,'A': {'B': 1, 'C': 4} 表示從 A 到 B 的距離是 1,到 C 的距離是 4。
  • 使用優(yōu)先隊列(heapq 模塊)來確保每次處理的是當前最短路徑的節(jié)點。
  • 遍歷鄰居節(jié)點時,動態(tài)更新最短距離。

通過這段代碼,你可以輕松計算任意節(jié)點間的最短路徑!

五、使用Kruskal算法實現最小生成樹

1. Kruskal算法簡介

Kruskal算法是一種用來求解圖的最小生成樹的經典算法。它的核心思想是:按照邊的權重從小到大排序,逐步選擇不形成環(huán)路的邊,直到所有頂點都被連接起來。比如,一個城市之間的道路網絡,如何用最少的成本修建公路?這就是Kruskal算法能解決的問題!

# 示例代碼:Kruskal算法實現
class UnionFind:
    def __init__(self, n):
        self.parent = list(range(n))
    
    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]
    
    def union(self, x, y):
        rootX = self.find(x)
        rootY = self.find(y)
        if rootX != rootY:
            self.parent[rootX] = rootY

def kruskal(edges, n):
    edges.sort(key=lambda x: x[2])  # 按權重排序
    uf = UnionFind(n)
    mst = []
    for u, v, w in edges:
        if uf.find(u) != uf.find(v):  # 如果不形成環(huán)
            uf.union(u, v)
            mst.append((u, v, w))
    return mst

# 測試數據
edges = [(0, 1, 7), (0, 3, 5), (1, 2, 8), (1, 3, 9), (2, 3, 6), (3, 4, 4)]
n = 5
result = kruskal(edges, n)
print("最小生成樹的邊為:", result)

輸出結果:

最小生成樹的邊為: [(3, 4, 4), (0, 3, 5), (2, 3, 6), (0, 1, 7)]

這段代碼通過Union-Find結構來檢測環(huán)路,確保每次添加的邊都不會導致圖中出現環(huán)。最終輸出的是一組邊,它們構成了最小生成樹!是不是很神奇?

六、實現Topological排序處理有向無環(huán)圖(DAG)

1. Topological排序基礎

Topological排序是一種對有向無環(huán)圖(DAG)進行線性排序的方法,確保每個節(jié)點都在其所有依賴節(jié)點之后。比如,課程安排中,先修課必須在選修課之前完成。

from collections import defaultdict, deque

# 構建圖
graph = defaultdict(list)
edges = [(0, 1), (0, 2), (1, 3), (2, 3)]
for u, v in edges:
    graph[u].append(v)

# 計算入度
in_degree = {u: 0 for u in graph}
for u in graph:
    for v in graph[u]:
        in_degree[v] = in_degree.get(v, 0) + 1

# 拓撲排序
queue = deque([u for u in in_degree if in_degree[u] == 0])
result = []
while queue:
    node = queue.popleft()
    result.append(node)
    for neighbor in graph[node]:
        in_degree[neighbor] -= 1
        if in_degree[neighbor] == 0:
            queue.append(neighbor)

print(result)  # 輸出:[0, 1, 2, 3]

這段代碼展示了如何通過BFS實現Topological排序。我們首先計算每個節(jié)點的入度,然后將入度為0的節(jié)點加入隊列,依次處理并更新入度。最后得到的結果就是一種合法的拓撲順序!

七、實戰(zhàn)案例:社交網絡中好友關系的分析與推薦系統(tǒng)構建

1. 社交網絡中的圖結構表示

在社交網絡中,用戶和好友關系可以用圖結構來表示。每個用戶是一個節(jié)點,好友關系是邊。比如,小明和小紅是好友,就可以用一條邊連接他們。我們用Python字典來表示這個圖:

graph = {
    "小明": ["小紅", "小剛"],
    "小紅": ["小明", "小麗"],
    "小剛": ["小明"],
    "小麗": ["小紅"]
}

這段代碼展示了如何用字典存儲好友關系。

2. 使用DFS算法分析好友關系

深度優(yōu)先搜索(DFS)可以用來查找兩個用戶之間是否存在好友關系路徑。下面是一個簡單的實現:

def dfs(graph, start, goal, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    if start == goal:
        return True
    for neighbor in graph[start]:
        if neighbor not in visited:
            if dfs(graph, neighbor, goal, visited):
                return True
    return False

print(dfs(graph, "小明", "小麗"))  # 輸出: True

這段代碼通過遞歸遍歷圖,判斷“小明”和“小麗”是否有好友關系。

3. 使用BFS算法計算好友距離

廣度優(yōu)先搜索(BFS)可以幫助我們計算兩個用戶之間的最短好友關系距離。例如:

from collections import deque

def bfs(graph, start, goal):
    queue = deque([(start, 0)])
    visited = {start}
    while queue:
        node, dist = queue.popleft()
        if node == goal:
            return dist
        for neighbor in graph[node]:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append((neighbor, dist + 1))
    return -1

print(bfs(graph, "小明", "小麗"))  # 輸出: 2

這里使用隊列實現BFS,計算“小明”到“小麗”的好友距離為2。

4. 基于共同好友的推薦系統(tǒng)

我們可以根據用戶的共同好友數量來推薦新朋友。比如:

def recommend_friends(graph, user):
    friends = set(graph[user])
    candidates = {}
    for friend in friends:
        for f_of_f in graph[friend]:  # 遍歷好友的好友
            if f_of_f != user and f_of_f not in friends:
                candidates[f_of_f] = candidates.get(f_of_f, 0) + 1
    return sorted(candidates.items(), key=lambda x: x[1], reverse=True)

print(recommend_friends(graph, "小明"))  # 輸出: [('小麗', 1)]

這段代碼根據共同好友的數量推薦新朋友給“小明”。

以上就是利用圖結構和樹形數據處理算法解決社交網絡問題的簡單示例!

責任編輯:趙寧寧 來源: 手把手PythonAI編程
相關推薦

2023-11-28 15:32:30

負載均衡算法

2024-11-20 15:24:49

2025-05-19 00:02:00

數據脫敏加密算法數據庫

2024-10-09 17:22:20

Python

2021-07-29 09:00:00

Python工具機器學習

2024-01-22 08:53:00

策略任務RocketMQ

2023-08-29 13:53:00

前端攔截HashMap

2022-05-24 10:43:02

延時消息分布式MQ

2024-02-26 11:12:33

定時任務線程

2011-03-31 14:53:13

數據中心節(jié)能

2010-06-13 11:28:39

UML序列圖

2024-12-18 16:19:51

2009-12-16 14:55:44

ISDN路由故障

2023-05-10 13:58:13

服務限流系統(tǒng)

2017-06-26 10:35:58

前端JavaScript繼承方式

2023-09-06 08:00:00

ChatGPT數據分析

2023-08-15 15:44:55

React開發(fā)

2021-12-10 13:08:31

數據倉庫BI數據存儲

2023-06-01 16:45:11

React開發(fā)JavaScript

2022-01-11 18:21:11

存儲技術數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 另类a v| 国产精品特级毛片一区二区三区 | 91免费在线 | 在线午夜| 国产清纯白嫩初高生视频在线观看 | 中国美女av | 国产中文视频 | 国产亚洲精品久久久久动 | 国产亚洲一区二区三区在线观看 | 成人av电影网 | 成人超碰在线 | 国产亚洲久 | 国产日韩精品在线 | 日韩欧美久久 | 亚洲91精品 | 亚洲自拍偷拍视频 | 观看毛片| 国产精品视频免费观看 | 亚洲va欧美va人人爽午夜 | 国产精品视频一区二区三区不卡 | 日韩精品在线一区 | av网站在线看 | 视频一区在线观看 | 午夜精品久久久 | 蜜桃在线视频 | 欧洲一区二区三区 | 日本黄色影片在线观看 | 日韩影院在线观看 | 精品国产一区二区三区性色av | 一区二区视频在线 | 久久国产欧美日韩精品 | 欧美一级欧美一级在线播放 | 欧美精品一区二区三区四区 | 成人影院网站ww555久久精品 | 久久久久久久亚洲精品 | 91在线看网站 | 国产区久久 | 久久免费视频在线 | 国产亚洲一区二区三区在线观看 | 欧美成人一级 | 羞羞视频在线观看免费观看 |