【華為機試】684. 冗余連接

文章目錄

  • 684. 冗余連接
    • 描述
    • 示例 1
    • 示例 2
    • 提示
    • 解題思路
      • 核心分析
      • 問題轉化
      • 算法選擇策略
        • 1. 并查集 (Union-Find) - 推薦
        • 2. 深度優先搜索 (DFS)
        • 3. 拓撲排序
      • 算法實現詳解
        • 方法一:并查集 (Union-Find)
        • 方法二:深度優先搜索 (DFS)
      • 數學證明
        • 并查集算法正確性證明
        • 時間復雜度分析
      • 執行流程圖
      • 算法可視化
      • 實際應用
      • 算法優化技巧
        • 1. 路徑壓縮優化
        • 2. 按秩合并優化
        • 3. 早期終止
      • 擴展思考
      • 相關問題
      • 測試用例設計
      • 性能對比
      • 常見錯誤
      • 總結
    • 完整題解代碼

684. 冗余連接

描述

樹可以看成是一個連通且 無環 的 無向 圖。

給定一個圖,該圖從一棵 n 個節點 (節點值 1~n) 的樹中添加一條邊后獲得。添加的邊的兩個不同頂點編號在 1 到 n 中間,且這條附加的邊不屬于樹中已存在的邊。圖的信息記錄于長度為 n 的二維數組 edges ,edges[i] = [ai, bi] 表示圖中在 ai 和 bi 之間存在一條邊。

請找出一條可以刪去的邊,刪除后可使得剩余部分是一個有著 n 個節點的樹。如果有多個答案,則返回數組 edges 中最后出現的那個。

示例 1

在這里插入圖片描述

輸入: edges = [[1,2], [1,3], [2,3]]
輸出: [2,3]

示例 2

在這里插入圖片描述

輸入: edges = [[1,2], [2,3], [3,4], [1,4], [1,5]]
輸出: [1,4]

提示

  • n == edges.length
  • 3 <= n <= 1000
  • edges[i].length == 2
  • 1 <= ai < bi <= edges.length
  • ai != bi
  • edges 中無重復元素
  • 給定的圖是連通的

解題思路

核心分析

這道題是一個經典的并查集應用問題。核心思想是找到導致圖中出現環的那條邊。

問題本質:給定一個包含n條邊的連通圖,其中n-1條邊構成一棵樹,1條邊是冗余的,需要找到這條冗余邊。

關鍵洞察

  • 樹的性質:n個節點的樹有n-1條邊,無環且連通
  • 冗余邊的特征:添加這條邊后會在圖中形成環
  • 并查集的作用:維護連通性,檢測環的形成

問題轉化

原始問題:找到一條邊,刪除后剩余圖是一棵樹

并查集轉化

  1. 初始化并查集,每個節點自成一個集合
  2. 按順序處理每條邊
  3. 如果邊的兩個端點已經在同一集合中,說明這條邊會形成環
  4. 這條邊就是需要刪除的冗余邊

數學建模

  • 節點集合:V = {1, 2, 3, …, n}
  • 邊集合:E = {e1, e2, e3, …, en}
  • 目標:找到邊ei,使得E - {ei}構成一棵樹

算法選擇策略

1. 并查集 (Union-Find) - 推薦
  • 適用場景:動態連通性問題,需要檢測環的形成
  • 優勢:時間復雜度最優,實現相對簡單
  • 劣勢:需要理解并查集的工作原理
2. 深度優先搜索 (DFS)
  • 適用場景:需要檢測環的存在
  • 優勢:思路直觀,容易理解
  • 劣勢:時間復雜度較高,實現復雜
3. 拓撲排序
  • 適用場景:有向圖的環檢測
  • 優勢:可以找到所有環
  • 劣勢:本題是無向圖,不適用

算法實現詳解

方法一:并查集 (Union-Find)

核心思想:使用并查集維護連通性,當遇到會形成環的邊時,該邊就是冗余邊

算法步驟

  1. 初始化并查集,每個節點自成一個集合
  2. 按順序遍歷每條邊
  3. 對于每條邊[u, v]:
    • 查找u和v的根節點
    • 如果根節點相同,說明u和v已經連通,這條邊會形成環
    • 如果根節點不同,合并兩個集合
  4. 返回最后一條會形成環的邊

代碼實現

func findRedundantConnection(edges [][]int) []int {n := len(edges)uf := NewUnionFind(n + 1) // 節點編號從1開始for _, edge := range edges {u, v := edge[0], edge[1]if uf.Find(u) == uf.Find(v) {// 這條邊會形成環,返回這條邊return edge}uf.Union(u, v)}return nil
}type UnionFind struct {parent []intrank   []int
}func NewUnionFind(n int) *UnionFind {parent := make([]int, n)rank := make([]int, n)for i := 0; i < n; i++ {parent[i] = irank[i] = 1}return &UnionFind{parent: parent,rank:   rank,}
}func (uf *UnionFind) Find(x int) int {if uf.parent[x] != x {uf.parent[x] = uf.Find(uf.parent[x]) // 路徑壓縮}return uf.parent[x]
}func (uf *UnionFind) Union(x, y int) {rootX := uf.Find(x)rootY := uf.Find(y)if rootX == rootY {return}// 按秩合并if uf.rank[rootX] < uf.rank[rootY] {uf.parent[rootX] = rootY} else if uf.rank[rootX] > uf.rank[rootY] {uf.parent[rootY] = rootX} else {uf.parent[rootY] = rootXuf.rank[rootX]++}
}

時間復雜度分析

  • 每條邊最多處理一次:O(n)
  • 每次Find/Union操作:O(α(n))
  • 總時間復雜度:O(n × α(n))

空間復雜度分析

  • 并查集數組:O(n)
  • 總空間復雜度:O(n)
方法二:深度優先搜索 (DFS)

核心思想:對每條邊,檢查刪除該邊后圖中是否還有環

算法步驟

  1. 構建鄰接表表示圖
  2. 從最后一條邊開始,依次嘗試刪除每條邊
  3. 對于每條被刪除的邊,使用DFS檢查剩余圖是否還有環
  4. 如果刪除某條邊后圖中無環,則該邊是冗余邊

代碼實現

func findRedundantConnectionDFS(edges [][]int) []int {n := len(edges)// 從最后一條邊開始嘗試刪除for i := n - 1; i >= 0; i-- {// 構建刪除邊i后的圖graph := make(map[int][]int)for j := 0; j < n; j++ {if j != i {u, v := edges[j][0], edges[j][1]graph[u] = append(graph[u], v)graph[v] = append(graph[v], u)}}// 檢查是否有環if !hasCycle(graph, n) {return edges[i]}}return nil
}func hasCycle(graph map[int][]int, n int) bool {visited := make([]bool, n+1)for i := 1; i <= n; i++ {if !visited[i] {if dfsHasCycle(graph, visited, i, -1) {return true}}}return false
}func dfsHasCycle(graph map[int][]int, visited []bool, node, parent int) bool {visited[node] = truefor _, neighbor := range graph[node] {if !visited[neighbor] {if dfsHasCycle(graph, visited, neighbor, node) {return true}} else if neighbor != parent {// 訪問到已訪問的節點且不是父節點,說明有環return true}}return false
}

時間復雜度:O(n2)
空間復雜度:O(n)

數學證明

并查集算法正確性證明

定理:并查集算法能正確找到冗余邊。

證明

  1. 初始化正確性

    • 初始時每個節點自成一個集合
    • 圖中沒有邊,沒有環
  2. 處理過程正確性

    • 每次處理邊[u, v]時,如果u和v已在同一集合中,說明u和v已經連通
    • 添加邊[u, v]會在u和v之間形成環
    • 因此邊[u, v]是冗余邊
  3. 結果正確性

    • 刪除冗余邊后,剩余n-1條邊
    • 由于原圖連通,刪除一條邊后仍然連通
    • 沒有環,因此剩余圖是一棵樹
時間復雜度分析

定理:并查集算法的時間復雜度為O(n × α(n))。

證明

  • 每條邊最多處理一次:O(n)
  • 每次Find/Union操作的時間復雜度:O(α(n))
  • 總時間復雜度:O(n × α(n))

執行流程圖

開始: 輸入邊數組edges
初始化并查集
遍歷每條邊 i = 0 to n-1
獲取當前邊的兩個端點 u, v
查找u和v的根節點
根節點是否相同?
這條邊會形成環
返回這條邊作為冗余邊
結束
合并u和v所在的集合
繼續處理下一條邊
是否處理完所有邊?
返回nil

算法可視化

并查集狀態變化
示例1: edges = [[1,2], [1,3], [2,3]]
初始: {1}, {2}, {3}
邊[1,2]: {1,2}, {3}
邊[1,3]: {1,2,3}
邊[2,3]: 1和2已在同一集合
處理邊[1,2]
處理邊[1,3]
處理邊[2,3] - 發現環

實際應用

  1. 網絡拓撲設計:檢測網絡中的冗余連接
  2. 電路設計:識別電路中的冗余線路
  3. 社交網絡分析:發現社交網絡中的冗余關系
  4. 數據庫設計:檢測數據庫中的冗余約束
  5. 軟件架構:識別模塊間的冗余依賴

算法優化技巧

1. 路徑壓縮優化
func (uf *UnionFind) Find(x int) int {if uf.parent[x] != x {uf.parent[x] = uf.Find(uf.parent[x]) // 路徑壓縮}return uf.parent[x]
}
2. 按秩合并優化
func (uf *UnionFind) Union(x, y int) {rootX := uf.Find(x)rootY := uf.Find(y)if rootX == rootY {return}// 按秩合并,保持樹的平衡if uf.rank[rootX] < uf.rank[rootY] {uf.parent[rootX] = rootY} else if uf.rank[rootX] > uf.rank[rootY] {uf.parent[rootY] = rootX} else {uf.parent[rootY] = rootXuf.rank[rootX]++}
}
3. 早期終止
// 如果已經找到冗余邊,可以提前終止
for _, edge := range edges {u, v := edge[0], edge[1]if uf.Find(u) == uf.Find(v) {return edge // 找到冗余邊,立即返回}uf.Union(u, v)
}

擴展思考

  1. 多條冗余邊:如果有多條冗余邊,如何找到所有冗余邊?
  2. 加權圖:如果邊有權重,如何找到權重最小的冗余邊?
  3. 有向圖:如果是有向圖,如何檢測環?
  4. 動態圖:如果圖結構動態變化,如何維護冗余邊的信息?
  5. 最小生成樹:如何利用冗余邊檢測構建最小生成樹?

相關問題

  1. 685. 冗余連接 II:有向圖中的冗余連接
  2. 547. 省份數量:連通分量的計算
  3. 200. 島嶼數量:二維網格中的連通性
  4. 684. 冗余連接:無向圖中的冗余連接
  5. 261. 以圖判樹:判斷圖是否為樹

測試用例設計

// 基礎測試用例
edges1 := [][]int{{1, 2}, {1, 3}, {2, 3}}
expected1 := []int{2, 3}edges2 := [][]int{{1, 2}, {2, 3}, {3, 4}, {1, 4}, {1, 5}}
expected2 := []int{1, 4}// 邊界測試
edges3 := [][]int{{1, 2}, {2, 3}, {3, 1}}
expected3 := []int{3, 1}// 復雜情況
edges4 := [][]int{{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}, {6, 1}}
expected4 := []int{6, 1}// 多條冗余邊的情況
edges5 := [][]int{{1, 2}, {2, 3}, {3, 4}, {4, 1}, {1, 3}}
expected5 := []int{1, 3} // 返回最后出現的冗余邊

性能對比

算法時間復雜度空間復雜度優勢劣勢
并查集O(n × α(n))O(n)最優解,實現簡單需要理解并查集
DFSO(n2)O(n)思路直觀時間復雜度高
BFSO(n2)O(n)避免遞歸實現復雜

常見錯誤

  1. 并查集初始化錯誤:忘記初始化parent數組
  2. 節點編號錯誤:節點編號從1開始,但數組索引從0開始
  3. 環檢測錯誤:沒有正確檢測環的形成
  4. 返回順序錯誤:沒有按照題目要求返回最后出現的冗余邊
  5. 邊界處理錯誤:沒有處理空數組或單個節點的情況

總結

冗余連接 是一道經典的并查集應用問題,核心在于理解環的形成機制和并查集的維護策略。

最優解法并查集算法,具有以下優勢:

  1. 時間復雜度最優:O(n × α(n))
  2. 實現簡單:核心邏輯只有幾行
  3. 空間效率高:只需要O(n)額外空間
  4. 應用廣泛:是并查集的經典模板題

這道題體現了圖論算法中的重要思想:

  • 環檢測:通過并查集檢測環的形成
  • 動態連通性:維護圖的連通性信息
  • 問題建模:將環檢測問題轉化為并查集操作

關鍵技巧

  • 使用路徑壓縮和按秩合并優化并查集性能
  • 按順序處理邊,找到第一條會形成環的邊
  • 理解樹的性質:n個節點的樹有n-1條邊,無環且連通

完整題解代碼

package mainimport ("fmt"
)// 方法一:并查集 (Union-Find) - 推薦解法
// 時間復雜度:O(n × α(n)),空間復雜度:O(n)
func findRedundantConnection(edges [][]int) []int {n := len(edges)uf := NewUnionFind(n + 1) // 節點編號從1開始for _, edge := range edges {u, v := edge[0], edge[1]if uf.Find(u) == uf.Find(v) {// 這條邊會形成環,返回這條邊return edge}uf.Union(u, v)}return nil
}// 并查集結構
type UnionFind struct {parent []intrank   []int
}// 創建新的并查集
func NewUnionFind(n int) *UnionFind {parent := make([]int, n)rank := make([]int, n)for i := 0; i < n; i++ {parent[i] = irank[i] = 1}return &UnionFind{parent: parent,rank:   rank,}
}// 查找根節點(路徑壓縮)
func (uf *UnionFind) Find(x int) int {if uf.parent[x] != x {uf.parent[x] = uf.Find(uf.parent[x]) // 路徑壓縮}return uf.parent[x]
}// 合并兩個集合(按秩合并)
func (uf *UnionFind) Union(x, y int) {rootX := uf.Find(x)rootY := uf.Find(y)if rootX == rootY {return}// 按秩合并if uf.rank[rootX] < uf.rank[rootY] {uf.parent[rootX] = rootY} else if uf.rank[rootX] > uf.rank[rootY] {uf.parent[rootY] = rootX} else {uf.parent[rootY] = rootXuf.rank[rootX]++}
}// 方法二:深度優先搜索 (DFS)
// 時間復雜度:O(n2),空間復雜度:O(n)
func findRedundantConnectionDFS(edges [][]int) []int {n := len(edges)// 從最后一條邊開始嘗試刪除for i := n - 1; i >= 0; i-- {// 構建刪除邊i后的圖graph := make(map[int][]int)for j := 0; j < n; j++ {if j != i {u, v := edges[j][0], edges[j][1]graph[u] = append(graph[u], v)graph[v] = append(graph[v], u)}}// 檢查是否有環if !hasCycle(graph, n) {return edges[i]}}return nil
}// 檢查圖中是否有環
func hasCycle(graph map[int][]int, n int) bool {visited := make([]bool, n+1)for i := 1; i <= n; i++ {if !visited[i] {if dfsHasCycle(graph, visited, i, -1) {return true}}}return false
}// DFS檢測環
func dfsHasCycle(graph map[int][]int, visited []bool, node, parent int) bool {visited[node] = truefor _, neighbor := range graph[node] {if !visited[neighbor] {if dfsHasCycle(graph, visited, neighbor, node) {return true}} else if neighbor != parent {// 訪問到已訪問的節點且不是父節點,說明有環return true}}return false
}// 方法三:優化的并查集(簡化版)
// 時間復雜度:O(n × α(n)),空間復雜度:O(n)
func findRedundantConnectionOptimized(edges [][]int) []int {n := len(edges)parent := make([]int, n+1)// 初始化并查集for i := 1; i <= n; i++ {parent[i] = i}// 查找函數(帶路徑壓縮)var find func(x int) intfind = func(x int) int {if parent[x] != x {parent[x] = find(parent[x])}return parent[x]}// 合并函數union := func(x, y int) bool {rootX := find(x)rootY := find(y)if rootX == rootY {return false // 已經在同一集合中}parent[rootX] = rootYreturn true}for _, edge := range edges {u, v := edge[0], edge[1]if !union(u, v) {// 無法合并,說明會形成環return edge}}return nil
}// 方法四:廣度優先搜索 (BFS)
// 時間復雜度:O(n2),空間復雜度:O(n)
func findRedundantConnectionBFS(edges [][]int) []int {n := len(edges)// 從最后一條邊開始嘗試刪除for i := n - 1; i >= 0; i-- {// 構建刪除邊i后的圖graph := make(map[int][]int)for j := 0; j < n; j++ {if j != i {u, v := edges[j][0], edges[j][1]graph[u] = append(graph[u], v)graph[v] = append(graph[v], u)}}// 檢查是否有環if !hasCycleBFS(graph, n) {return edges[i]}}return nil
}// BFS檢測環
func hasCycleBFS(graph map[int][]int, n int) bool {visited := make([]bool, n+1)for i := 1; i <= n; i++ {if !visited[i] {if bfsHasCycle(graph, visited, i) {return true}}}return false
}// BFS檢測環的具體實現
func bfsHasCycle(graph map[int][]int, visited []bool, start int) bool {queue := [][]int{{start, -1}} // [節點, 父節點]visited[start] = truefor len(queue) > 0 {node, parent := queue[0][0], queue[0][1]queue = queue[1:]for _, neighbor := range graph[node] {if !visited[neighbor] {visited[neighbor] = truequeue = append(queue, []int{neighbor, node})} else if neighbor != parent {// 訪問到已訪問的節點且不是父節點,說明有環return true}}}return false
}// 測試函數
func main() {// 測試用例1:示例1edges1 := [][]int{{1, 2}, {1, 3}, {2, 3}}fmt.Println("測試用例1:")fmt.Printf("輸入: %v\n", edges1)fmt.Printf("并查集結果: %v\n", findRedundantConnection(edges1))fmt.Printf("DFS結果: %v\n", findRedundantConnectionDFS(edges1))fmt.Printf("優化并查集結果: %v\n", findRedundantConnectionOptimized(edges1))fmt.Printf("BFS結果: %v\n", findRedundantConnectionBFS(edges1))fmt.Println("期望結果: [2 3]")fmt.Println()// 測試用例2:示例2edges2 := [][]int{{1, 2}, {2, 3}, {3, 4}, {1, 4}, {1, 5}}fmt.Println("測試用例2:")fmt.Printf("輸入: %v\n", edges2)fmt.Printf("并查集結果: %v\n", findRedundantConnection(edges2))fmt.Printf("DFS結果: %v\n", findRedundantConnectionDFS(edges2))fmt.Printf("優化并查集結果: %v\n", findRedundantConnectionOptimized(edges2))fmt.Printf("BFS結果: %v\n", findRedundantConnectionBFS(edges2))fmt.Println("期望結果: [1 4]")fmt.Println()// 測試用例3:邊界情況 - 三角形環edges3 := [][]int{{1, 2}, {2, 3}, {3, 1}}fmt.Println("測試用例3 (三角形環):")fmt.Printf("輸入: %v\n", edges3)fmt.Printf("并查集結果: %v\n", findRedundantConnection(edges3))fmt.Printf("DFS結果: %v\n", findRedundantConnectionDFS(edges3))fmt.Printf("優化并查集結果: %v\n", findRedundantConnectionOptimized(edges3))fmt.Printf("BFS結果: %v\n", findRedundantConnectionBFS(edges3))fmt.Println("期望結果: [3 1]")fmt.Println()// 測試用例4:復雜情況 - 大環edges4 := [][]int{{1, 2}, {2, 3}, {3, 4}, {4, 5}, {5, 6}, {6, 1}}fmt.Println("測試用例4 (大環):")fmt.Printf("輸入: %v\n", edges4)fmt.Printf("并查集結果: %v\n", findRedundantConnection(edges4))fmt.Printf("DFS結果: %v\n", findRedundantConnectionDFS(edges4))fmt.Printf("優化并查集結果: %v\n", findRedundantConnectionOptimized(edges4))fmt.Printf("BFS結果: %v\n", findRedundantConnectionBFS(edges4))fmt.Println("期望結果: [6 1]")fmt.Println()// 測試用例5:多條冗余邊的情況edges5 := [][]int{{1, 2}, {2, 3}, {3, 4}, {4, 1}, {1, 3}}fmt.Println("測試用例5 (多條冗余邊):")fmt.Printf("輸入: %v\n", edges5)fmt.Printf("并查集結果: %v\n", findRedundantConnection(edges5))fmt.Printf("DFS結果: %v\n", findRedundantConnectionDFS(edges5))fmt.Printf("優化并查集結果: %v\n", findRedundantConnectionOptimized(edges5))fmt.Printf("BFS結果: %v\n", findRedundantConnectionBFS(edges5))fmt.Println("期望結果: [1 3] (返回最后出現的冗余邊)")fmt.Println()// 測試用例6:最小情況edges6 := [][]int{{1, 2}, {2, 3}, {3, 1}}fmt.Println("測試用例6 (最小情況):")fmt.Printf("輸入: %v\n", edges6)fmt.Printf("并查集結果: %v\n", findRedundantConnection(edges6))fmt.Printf("DFS結果: %v\n", findRedundantConnectionDFS(edges6))fmt.Printf("優化并查集結果: %v\n", findRedundantConnectionOptimized(edges6))fmt.Printf("BFS結果: %v\n", findRedundantConnectionBFS(edges6))fmt.Println("期望結果: [3 1]")
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915927.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915927.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915927.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ⅹ—6.計算機二級綜合題7---10套

目錄 第7套 【填空題】 【修改題】 【設計題】 第8套 【填空題】 【修改題】 【設計題】 第9套 【填空題】 【修改題】 【設計題】 第10套 【填空題】 【修改題】 【設計題】 第7套 【填空題】 題目要求:給定程序中,函數fun的功能是:將形參s所指字符串中所…

【三橋君】大語言模型計算成本高,MoE如何有效降低成本?

? 你好&#xff0c;我是 ?三橋君? &#x1f4cc;本文介紹&#x1f4cc; >> 一、引言 在AI技術飛速發展的當下&#xff0c;大語言模型&#xff08;LLM&#xff09;的參數規模不斷增長&#xff0c;但隨之而來的計算成本問題也日益凸顯。如何在保持高效推理能力的同時擴…

Python游戲開發利器:Pygame從入門到實戰全解析

引言 Pygame是Python中最受歡迎的2D游戲開發庫之一&#xff0c;基于SDL&#xff08;Simple DirectMedia Layer&#xff09;構建&#xff0c;支持圖形渲染、音效處理、事件響應等核心功能。無論是開發簡單的休閑游戲&#xff0c;還是復雜的交互式應用&#xff0c;Pygame都能提供…

行為型模式-協作與交互機制

行為型模式聚焦于對象間的行為交互&#xff0c;通過規范對象協作方式提升系統的靈活性與可擴展性。在分布式系統中&#xff0c;由于多節點異步通信、網絡不可靠性及狀態一致性挑戰&#xff0c;行為型模式需針對分布式特性進行適應性設計。本文從觀察者、策略、命令、責任鏈、狀…

spring boot 整合 Spring Cloud、Kafka 和 MyBatis菜鳥教程

環境準備確保項目中已引入 Spring Boot、Spring Cloud、Kafka 和 MyBatis 的依賴。以下是一個典型的 Maven 依賴配置&#xff1a;<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artif…

20 BTLO 藍隊靶場 Sticky Situation 解題記錄

難度&#xff1a;5/10考察技能: Windows admin, Autopsy 使用場景&#xff1a;分析USB設備使用情況Autopsy使用注意&#xff1a;用管理員打開&#xff0c;在實際分析時注意先復制一個鏡像文件&#xff0c;保存好原文件常用的Windows USB 取證的位置:Windows XP:Registry Key: U…

安裝及配置Go語言開發環境與VSCode集成指南

安裝Go語言開發 安裝Go語言開發環境是第一步。訪問Go官網&#xff0c;下載適合操作系統的安裝包&#xff0c;如果進不去可以訪問Go官方鏡像站。 根據自己的系統選擇對應的安裝包&#xff0c;我這邊是Windows系統就點擊安裝第一個即可。 點擊下一步即可。 驗證安裝是否成功可以…

專題:2025微短劇行業生態構建與跨界融合研究報告|附100+份報告PDF匯總下載

原文鏈接&#xff1a; https://tecdat.cn/?p43384 分析師&#xff1a;Boyu Wang 在此對 Boyu Wang 對本文所作的貢獻表示誠摯感謝&#xff0c;他在武漢大學完成了數據科學與大數據技術專業的學習。擅長 R 語言、Python、機器學習、數據可視化。 中國短視頻行業在經歷爆發式增…

配置NGINX

Nginx環境配置與前端VUE部署安裝nginx&#xff1a;命令sudo yum update && sudo yum install nginx部署:拷貝前端到目錄/home/publish/idasweb/下修改nginx配置&#xff1a;進入到/etc/nginx目錄下&#xff0c;修改nginx.conf中user www-data為user root&#xff0c;不…

MySQL深度理解-MySQL索引優化

1.Order by與Group by優化1.1Case1employees表中建立了name&#xff0c;position和age索引&#xff0c;并且使用了order by age進行排序操作&#xff1a;EXPLAIN SELECT * FROM employees WHERE name LiLei and position dev order by age最終explain的結果發現使用了idx_nam…

「Linux命令基礎」用戶和用戶組實訓

用戶與用戶組關系管理 在Linux系統中,用戶和用戶組的關系就像班級里的學生和小組。一個用戶可以同時屬于多個組,這種靈活的成員關系為權限管理提供了便利。創建用戶時,系統會自動生成一個與用戶同名的主組,這個組會成為用戶創建文件時的默認屬組。 理解用戶和用戶組的關系…

Https以及CA證書

目錄 1. 什么是 HTTPS 通信機制流程 證書驗證過程 CA證書 瀏覽器如何校驗證書合法性呢&#xff1f; 1. 什么是 HTTPS HTTP 加上加密處理和認證以及完整性保護后即是 HTTPS。 它是為了解決 HTTP 存在的安全性問題&#xff0c;而衍生的協議&#xff0c;那使用 HTTP 的缺點有…

數字圖像處理(四:圖像如果當作矩陣,那加減乘除處理了矩陣,那圖像咋變):從LED冬奧會、奧運會及春晚等等大屏,到手機小屏,快來挖一挖里面都有什么

數字圖像處理&#xff08;四&#xff09;三、&#xff08;準備工作&#xff1a;玩具咋玩&#xff09;圖像以矩陣形式存儲&#xff0c;那矩陣一變、圖像立刻跟著變&#xff1f;原圖發揮了鈔能力之后的圖上述代碼包含 10 個圖像處理實驗&#xff0c;每個實驗會生成對應處理后的圖…

SpringBoot航空訂票系統的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBoot持久層框架Hibernate成功系統案例&#xff1a;代碼參考數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續輸出高質…

2025年PostgreSQL 詳細安裝教程(windows)

前言 PostgreSQL 是一個功能強大的開源關系型數據庫管理系統(ORDBMS)&#xff0c;以下是對它的全面介紹&#xff1a; 基本概況 名稱&#xff1a;通常簡稱為 "Postgres" 類型&#xff1a;對象-關系型數據庫管理系統 許可&#xff1a;開源&#xff0c;采用類MIT許可…

Java日志按天切分方法

使用 Logrotate&#xff08;推薦&#xff09;Logrotate 是 Linux 系統自帶的日志管理工具&#xff0c;支持自動切割、壓縮和刪除舊日志。步驟&#xff1a;創建 Logrotate 配置文件在 /etc/logrotate.d/ 下新建配置文件&#xff08;如 java-app&#xff09;&#xff1a;sudo nan…

進階向:基于Python的本地文件內容搜索工具

概述 大家好&#xff01;今天我們將一起學習如何用Python創建一個簡單但強大的本地文件內容搜索工具。這個工具特別適合處理大量文本文件時的快速檢索需求。 為什么要學習這個工具 如果你剛接觸編程&#xff0c;完全不用擔心&#xff01;我會從零開始講解&#xff0c;確保每…

多模態AI的可解釋性

多模態AI的可解釋性挑戰 在深入探討解決方案之前&#xff0c;首先需要精確地定義問題。多模態模型因其固有的復雜性&#xff0c;其內部決策過程對于人類觀察者而言是不透明的。 模態融合機制 (Modal Fusion Mechanism)&#xff1a;模型必須將來自不同來源&#xff08;如圖像和文…

MySQL深度理解-MySQL事務優化

1.什么是事務事務就是進行多個操作&#xff0c;要么同時執行成功&#xff0c;要么同時執行失敗。2.事務的特性 - ACID特性2.1原子性Atomicity原子性&#xff08;Atomicity&#xff09;&#xff1a;當前事務的操作要么同時成功&#xff0c;要么同時失敗。原子性由undo log日志來…

2025小學所有學習科目的全部版本電子教材

2025春小學最新課本-新版電子教材【文末自行獲取全部資料~】 小學語文&#xff1a; 小學數學&#xff1a; 小學英語&#xff1a; 小學科學&#xff1a; 小學道德與法治&#xff1a; 小學勞動技術&#xff1a; 小學美術&#xff1a; 小學書法練習指導&#xff1a; 小學體育與健康…