【華為機試】127. 單詞接龍

文章目錄

  • 127. 單詞接龍
    • 描述
    • 示例 1:
    • 示例 2:
    • 提示:
    • 解題思路
      • 算法分析
      • 問題本質分析
      • 單向BFS算法詳解
      • 雙向BFS算法詳解
      • 鄰居單詞生成過程
      • 算法流程圖
      • 邊界情況分析
      • 各種解法對比
      • 時間復雜度分析
      • 空間復雜度分析
      • 關鍵優化點
      • 實際應用場景
      • 圖構建策略
      • 雙向BFS優化細節
      • 測試用例設計
      • 算法擴展
      • 代碼實現要點
      • 手工驗證示例
    • 完整題解代碼

127. 單詞接龍

描述

字典 wordList 中從單詞 beginWord 到 endWord 的 轉換序列 是一個按下述規格形成的序列 beginWord -> s1 -> s2 -> … -> sk:

每一對相鄰的單詞只差一個字母。
對于 1 <= i <= k 時,每個 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
sk == endWord
給你兩個單詞 beginWord 和 endWord 和一個字典 wordList ,返回 從 beginWord 到 endWord 的 最短轉換序列 中的 單詞數目 。如果不存在這樣的轉換序列,返回 0 。

示例 1:

輸入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”,“cog”]
輸出:5
解釋:一個最短轉換序列是 “hit” -> “hot” -> “dot” -> “dog” -> “cog”, 返回它的長度 5。

示例 2:

輸入:beginWord = “hit”, endWord = “cog”, wordList = [“hot”,“dot”,“dog”,“lot”,“log”]
輸出:0
解釋:endWord “cog” 不在字典中,所以無法進行轉換。

提示:

  • 1 <= beginWord.length <= 10
  • endWord.length == beginWord.length
  • 1 <= wordList.length <= 5000
  • wordList[i].length == beginWord.length
  • beginWord、endWord 和 wordList[i] 由小寫英文字母組成
  • beginWord != endWord
  • wordList 中的所有字符串 互不相同

解題思路

算法分析

這道題是圖的最短路徑BFS廣度優先搜索的經典應用。主要解法包括:

  1. 單向BFS:從起點開始廣度優先搜索
  2. 雙向BFS:從起點和終點同時搜索
  3. A*搜索:啟發式搜索算法
  4. Dijkstra算法:適用于加權圖的最短路徑

問題本質分析

graph TDA[單詞接龍] --> B[圖的最短路徑問題]B --> C[單向BFS]B --> D[雙向BFS]B --> E[A*搜索]C --> F[從起點層層擴展]D --> G[兩端同時搜索]E --> H[啟發式函數引導]F --> I[時間復雜度O_N2×M]G --> J[時間復雜度O_N×M]H --> K[時間復雜度優化]

單向BFS算法詳解

輸入beginWord和endWord
檢查endWord是否在wordList中
endWord存在?
返回0
初始化隊列和訪問集合
將beginWord加入隊列
BFS層次遍歷
隊列為空?
返回0 - 無法到達
取出當前層所有單詞
對每個單詞嘗試變換
枚舉每個位置的26個字母
新單詞在wordList中?
繼續下一個變換
新單詞是endWord?
返回當前層數+1
加入隊列和訪問集合
當前單詞所有位置遍歷完?
當前層所有單詞處理完?
層數+1

雙向BFS算法詳解

flowchart TDA[雙向BFS初始化] --> B[創建正向和反向搜索集合]B --> C[beginSet = {beginWord}]C --> D[endSet = {endWord}]D --> E[visited = 空集合]E --> F{beginSet和endSet都非空?}F -->|否| G[返回0]F -->|是| H{beginSet與endSet有交集?}H -->|是| I[返回當前層數]H -->|否| J[選擇較小的集合擴展]J --> K[遍歷當前集合中的每個單詞]K --> L[生成所有可能的鄰居]L --> M{鄰居在對方集合中?}M -->|是| N[找到連接路徑]M -->|否| O{鄰居未被訪問?}O -->|是| P[加入下一層集合]O -->|否| Q[跳過此鄰居]P --> R[標記為已訪問]Q --> LR --> LL --> S{當前單詞所有鄰居處理完?}S -->|否| LS -->|是| T{當前集合所有單詞處理完?}T -->|否| KT -->|是| U[更新當前集合為下一層]U --> V[層數+1]V --> FN --> W[返回總層數]

鄰居單詞生成過程

鄰居單詞生成
遍歷單詞每個位置
保存原字符
嘗試26個字母替換
新單詞在字典中?
添加到鄰居列表
跳過此字母
恢復原字符
所有字母嘗試完?
所有位置處理完?
返回鄰居列表

算法流程圖

開始
輸入驗證
endWord在wordList中?
返回0
選擇搜索算法
單向BFS
雙向BFS
從beginWord開始層次遍歷
從兩端同時搜索
生成鄰居單詞
找到目標單詞?
返回路徑長度
還有未訪問單詞?
繼續搜索下一層
返回0 - 無路徑

邊界情況分析

邊界情況
endWord不在字典中
beginWord等于endWord
字典為空
無法到達
只差一個字母
直接返回0
返回1或處理特殊情況
返回0
BFS遍歷完無結果
返回2

各種解法對比

graph TDA[解法對比] --> B[單向BFS]A --> C[雙向BFS]A --> D[A*搜索]A --> E[DFS回溯]B --> F[時間O_N2×M空間O_N×M]C --> G[時間O_N×M空間O_N×M]D --> H[時間優化空間O_N×M]E --> I[時間指數級空間O_深度]F --> J[簡單直觀推薦]G --> K[性能最優推薦]H --> L[復雜實現適合研究]I --> M[不適合此問題]

時間復雜度分析

  • 單向BFS:O(N2 × M),N為單詞數,M為單詞長度
  • 雙向BFS:O(N × M),搜索空間減半
  • A*搜索:O(N × M × log N),依賴啟發函數
  • DFS回溯:O(N!),指數級時間復雜度

空間復雜度分析

  • 單向BFS:O(N × M),隊列和訪問集合
  • 雙向BFS:O(N × M),兩個搜索集合
  • A*搜索:O(N × M),優先隊列和訪問記錄
  • DFS回溯:O(深度 × M),遞歸棧空間

關鍵優化點

優化策略
雙向搜索
字典預處理
鄰居緩存
啟發式函數
搜索空間減半
快速鄰居查找
避免重復計算
引導搜索方向
性能提升

實際應用場景

應用場景
自然語言處理
游戲開發
網絡路由
社交網絡
詞匯語義距離
路徑尋找算法
最短路徑路由
社交關系鏈
核心算法組件

圖構建策略

圖構建方法
鄰接表
模式匹配
在線生成
預構建所有連接
通配符模式匹配
動態生成鄰居
空間換時間
中間節點優化
時間換空間

雙向BFS優化細節

雙向BFS優化
始終擴展較小集合
減少分支因子
提前終止條件
內存優化
集合大小比較
選擇擴展方向
平衡搜索樹
及時清理無用節點
復用數據結構

測試用例設計

測試用例
基礎功能
邊界情況
性能測試
正常轉換
單步轉換
多步轉換
無法到達
目標不在字典
相同起止點
大字典測試
長單詞測試
驗證正確性
驗證性能

算法擴展

算法擴展
單詞接龍II
最小基因變化
開鎖問題
迷宮問題
返回所有最短路徑
基因序列變換
密碼鎖狀態轉換
二維網格路徑
圖搜索問題家族

代碼實現要點

  1. 圖的表示

    • 使用鄰接表或在線生成鄰居
    • 字典可以用Set進行快速查找
    • 考慮內存和時間的平衡
  2. BFS實現細節

    • 使用隊列進行層次遍歷
    • 記錄訪問狀態避免重復
    • 正確處理層數計算
  3. 雙向BFS優化

    • 始終擴展較小的集合
    • 及時檢測兩個搜索的交集
    • 合理的終止條件
  4. 鄰居生成策略

    • 枚舉每個位置的所有可能字符
    • 利用字典進行有效性檢查
    • 避免生成已訪問的單詞

手工驗證示例

graph TDA["hit → cog 示例"] --> B[層次0: hit]B --> C[層次1: hot]C --> D[層次2: dot, lot]D --> E[層次3: dog, log]E --> F[層次4: cog]F --> G[路徑長度 = 5]H[雙向BFS] --> I[正向: hit → hot → dot]H --> J[反向: cog ← dog ← dot]I --> K[在dot處相遇]J --> KK --> L[總長度 = 3 + 2 = 5]

這個問題的關鍵在于理解圖的最短路徑本質掌握BFS層次遍歷技巧,通過合適的搜索策略找到從起始單詞到目標單詞的最短變換序列。

完整題解代碼

package mainimport ("fmt""strings""time"
)// 解法一:單向BFS(經典解法)
// 時間復雜度:O(N2×M),空間復雜度:O(N×M)
func ladderLength(beginWord string, endWord string, wordList []string) int {// 特殊情況:起點等于終點if beginWord == endWord {return 1}// 將wordList轉換為set以便快速查找wordSet := make(map[string]bool)for _, word := range wordList {wordSet[word] = true}// 如果endWord不在wordList中,無法到達if !wordSet[endWord] {return 0}// BFS隊列和訪問記錄queue := []string{beginWord}visited := make(map[string]bool)visited[beginWord] = truelevel := 1for len(queue) > 0 {size := len(queue)// 處理當前層的所有單詞for i := 0; i < size; i++ {current := queue[i]// 生成所有可能的鄰居單詞neighbors := getNeighbors(current, wordSet)for _, neighbor := range neighbors {if neighbor == endWord {return level + 1}if !visited[neighbor] {visited[neighbor] = truequeue = append(queue, neighbor)}}}// 更新隊列為下一層queue = queue[size:]level++}return 0
}// 生成所有有效的鄰居單詞
func getNeighbors(word string, wordSet map[string]bool) []string {var neighbors []stringchars := []rune(word)for i := 0; i < len(chars); i++ {original := chars[i]// 嘗試26個字母for c := 'a'; c <= 'z'; c++ {if c == original {continue}chars[i] = cnewWord := string(chars)if wordSet[newWord] {neighbors = append(neighbors, newWord)}}chars[i] = original // 恢復原字符}return neighbors
}// 解法二:雙向BFS(優化解法)
// 時間復雜度:O(N×M),空間復雜度:O(N×M)
func ladderLengthBidirectional(beginWord string, endWord string, wordList []string) int {// 特殊情況:起點等于終點if beginWord == endWord {return 1}wordSet := make(map[string]bool)for _, word := range wordList {wordSet[word] = true}if !wordSet[endWord] {return 0}// 雙向搜索集合beginSet := make(map[string]bool)endSet := make(map[string]bool)beginSet[beginWord] = trueendSet[endWord] = truevisited := make(map[string]bool)level := 1for len(beginSet) > 0 && len(endSet) > 0 {// 優化:始終擴展較小的集合if len(beginSet) > len(endSet) {beginSet, endSet = endSet, beginSet}nextSet := make(map[string]bool)for word := range beginSet {neighbors := getNeighbors(word, wordSet)for _, neighbor := range neighbors {// 如果在對方集合中找到,說明路徑連通if endSet[neighbor] {return level + 1}// 如果未訪問過,加入下一層if !visited[neighbor] {visited[neighbor] = truenextSet[neighbor] = true}}}beginSet = nextSetlevel++}return 0
}// 解法三:使用模式匹配優化的BFS
// 時間復雜度:O(N×M),空間復雜度:O(N×M)
func ladderLengthPattern(beginWord string, endWord string, wordList []string) int {if beginWord == endWord {return 1}// 構建模式到單詞的映射patterns := make(map[string][]string)for _, word := range wordList {for i := 0; i < len(word); i++ {pattern := word[:i] + "*" + word[i+1:]patterns[pattern] = append(patterns[pattern], word)}}// 也要為beginWord建立模式for i := 0; i < len(beginWord); i++ {pattern := beginWord[:i] + "*" + beginWord[i+1:]patterns[pattern] = append(patterns[pattern], beginWord)}// BFSqueue := []string{beginWord}visited := make(map[string]bool)visited[beginWord] = truelevel := 1for len(queue) > 0 {size := len(queue)for i := 0; i < size; i++ {current := queue[i]// 通過模式找到所有鄰居for j := 0; j < len(current); j++ {pattern := current[:j] + "*" + current[j+1:]for _, neighbor := range patterns[pattern] {if neighbor == endWord {return level + 1}if !visited[neighbor] && neighbor != current {visited[neighbor] = truequeue = append(queue, neighbor)}}}}queue = queue[size:]level++}return 0
}// 解法四:A*搜索算法
// 時間復雜度:O(N×M×log N),空間復雜度:O(N×M)
func ladderLengthAStar(beginWord string, endWord string, wordList []string) int {wordSet := make(map[string]bool)for _, word := range wordList {wordSet[word] = true}if !wordSet[endWord] {return 0}// 啟發式函數:計算兩個單詞的差異字符數heuristic := func(word1, word2 string) int {diff := 0for i := 0; i < len(word1); i++ {if word1[i] != word2[i] {diff++}}return diff}// 優先隊列節點type Node struct {word stringg    int // 從起點到當前節點的實際距離f    int // g + h(啟發式距離)}// 簡化的優先隊列實現var pq []Node// 添加起始節點start := Node{word: beginWord,g:    0,f:    heuristic(beginWord, endWord),}pq = append(pq, start)visited := make(map[string]int)visited[beginWord] = 0for len(pq) > 0 {// 簡單的優先隊列:找f值最小的節點minIdx := 0for i := 1; i < len(pq); i++ {if pq[i].f < pq[minIdx].f {minIdx = i}}current := pq[minIdx]pq = append(pq[:minIdx], pq[minIdx+1:]...)if current.word == endWord {return current.g + 1}neighbors := getNeighbors(current.word, wordSet)for _, neighbor := range neighbors {newG := current.g + 1if prevG, exists := visited[neighbor]; !exists || newG < prevG {visited[neighbor] = newGnode := Node{word: neighbor,g:    newG,f:    newG + heuristic(neighbor, endWord),}pq = append(pq, node)}}}return 0
}// 解法五:DFS + 記憶化(遞歸回溯)
// 時間復雜度:O(N!),空間復雜度:O(N×M + 深度)
func ladderLengthDFS(beginWord string, endWord string, wordList []string) int {wordSet := make(map[string]bool)for _, word := range wordList {wordSet[word] = true}if !wordSet[endWord] {return 0}memo := make(map[string]int)visited := make(map[string]bool)var dfs func(word string) intdfs = func(word string) int {if word == endWord {return 1}if val, exists := memo[word]; exists {return val}visited[word] = trueminLen := 0neighbors := getNeighbors(word, wordSet)for _, neighbor := range neighbors {if !visited[neighbor] {length := dfs(neighbor)if length > 0 {if minLen == 0 || length+1 < minLen {minLen = length + 1}}}}visited[word] = falsememo[word] = minLenreturn minLen}return dfs(beginWord)
}// 測試函數
func testLadderLength() {testCases := []struct {beginWord stringendWord   stringwordList  []stringexpected  intdesc      string}{{"hit", "cog",[]string{"hot", "dot", "dog", "lot", "log", "cog"},5, "示例1:標準轉換路徑",},{"hit", "cog",[]string{"hot", "dot", "dog", "lot", "log"},0, "示例2:目標不在字典中",},{"a", "c",[]string{"a", "b", "c"},2, "簡單單字母轉換",},{"hot", "dog",[]string{"hot", "dog", "dot"},3, "兩步轉換",},{"hot", "dog",[]string{"hot", "dog"},0, "無中間路徑",},{"leet", "code",[]string{"lest", "leet", "lose", "code", "lode", "robe", "lost"},6, "復雜路徑",},{"hit", "hit",[]string{"hit"},1, "起點等于終點",},{"qa", "sq",[]string{"si", "go", "se", "cm", "so", "ph", "mt", "db", "mb", "sb", "kr", "ln", "tm", "le", "av", "sm", "ar", "ci", "ca", "br", "ti", "ba", "to", "ra", "fa", "yo", "ow", "sn", "ya", "cr", "po", "fe", "ho", "ma", "re", "or", "rn", "au", "ur", "rh", "sr", "tc", "lt", "lo", "as", "fr", "nb", "yb", "if", "pb", "ge", "th", "pm", "rb", "sh", "co", "ga", "li", "ha", "hz", "no", "bi", "di", "hi", "qa", "pi", "os", "uh", "wm", "an", "me", "mo", "na", "la", "st", "er", "sc", "ne", "mn", "mi", "am", "ex", "pt", "io", "be", "fm", "ta", "tb", "ni", "mr", "pa", "he", "lr", "sq", "ye"},5, "大字典測試",},}fmt.Println("=== 單詞接龍測試 ===")fmt.Println()for i, tc := range testCases {// 測試主要解法result1 := ladderLength(tc.beginWord, tc.endWord, tc.wordList)result2 := ladderLengthBidirectional(tc.beginWord, tc.endWord, tc.wordList)result3 := ladderLengthPattern(tc.beginWord, tc.endWord, tc.wordList)status := "?"if result1 != tc.expected {status = "?"}fmt.Printf("測試 %d: %s\n", i+1, tc.desc)fmt.Printf("輸入: beginWord=\"%s\", endWord=\"%s\"\n", tc.beginWord, tc.endWord)fmt.Printf("字典: %v\n", tc.wordList)fmt.Printf("期望: %d\n", tc.expected)fmt.Printf("單向BFS: %d\n", result1)fmt.Printf("雙向BFS: %d\n", result2)fmt.Printf("模式匹配: %d\n", result3)fmt.Printf("結果: %s\n", status)fmt.Println(strings.Repeat("-", 50))}
}// 性能測試
func benchmarkLadderLength() {fmt.Println()fmt.Println("=== 性能測試 ===")fmt.Println()// 構造測試數據testData := []struct {beginWord stringendWord   stringwordList  []stringdesc      string}{{"hit", "cog",[]string{"hot", "dot", "dog", "lot", "log", "cog"},"小字典測試",},{"qa", "sq",generateLargeWordList(100, 2),"中等字典測試",},{"start", "enddd",generateLargeWordList(500, 5),"大字典測試",},}algorithms := []struct {name stringfn   func(string, string, []string) int}{{"單向BFS", ladderLength},{"雙向BFS", ladderLengthBidirectional},{"模式匹配", ladderLengthPattern},{"A*搜索", ladderLengthAStar},}for _, data := range testData {fmt.Printf("%s (字典大小: %d):\n", data.desc, len(data.wordList))for _, algo := range algorithms {start := time.Now()result := algo.fn(data.beginWord, data.endWord, data.wordList)duration := time.Since(start)fmt.Printf("  %s: 結果=%d, 耗時: %v\n", algo.name, result, duration)}fmt.Println()}
}// 生成大規模測試詞典
func generateLargeWordList(size, wordLen int) []string {words := make([]string, 0, size)// 生成一些相關的單詞base := strings.Repeat("a", wordLen)words = append(words, base)for i := 1; i < size; i++ {word := []rune(base)// 隨機改變1-2個字符changes := 1 + i%2for j := 0; j < changes; j++ {pos := (i + j) % wordLenword[pos] = rune('a' + (i+j)%26)}words = append(words, string(word))}return words
}// 演示BFS搜索過程
func demonstrateBFS() {fmt.Println("\n=== BFS搜索過程演示 ===")beginWord := "hit"endWord := "cog"wordList := []string{"hot", "dot", "dog", "lot", "log", "cog"}fmt.Printf("從 \"%s\" 到 \"%s\" 的轉換過程:\n", beginWord, endWord)fmt.Printf("字典: %v\n\n", wordList)// 演示搜索層次wordSet := make(map[string]bool)for _, word := range wordList {wordSet[word] = true}queue := []string{beginWord}visited := make(map[string]bool)visited[beginWord] = truelevel := 1fmt.Printf("層次 %d: %v\n", level, queue)for len(queue) > 0 && level <= 5 {size := len(queue)nextLevel := []string{}for i := 0; i < size; i++ {current := queue[i]neighbors := getNeighbors(current, wordSet)for _, neighbor := range neighbors {if neighbor == endWord {fmt.Printf("層次 %d: 找到目標 %s!\n", level+1, neighbor)fmt.Printf("路徑長度: %d\n", level+1)return}if !visited[neighbor] {visited[neighbor] = truenextLevel = append(nextLevel, neighbor)}}}if len(nextLevel) > 0 {queue = nextLevellevel++fmt.Printf("層次 %d: %v\n", level, queue)} else {break}}
}// 演示雙向BFS
func demonstrateBidirectionalBFS() {fmt.Println("\n=== 雙向BFS演示 ===")beginWord := "hit"endWord := "cog"wordList := []string{"hot", "dot", "dog", "lot", "log", "cog"}fmt.Printf("雙向搜索從 \"%s\" 和 \"%s\" 同時開始\n", beginWord, endWord)wordSet := make(map[string]bool)for _, word := range wordList {wordSet[word] = true}beginSet := map[string]bool{beginWord: true}endSet := map[string]bool{endWord: true}visited := make(map[string]bool)level := 1fmt.Printf("層次 %d: 正向=%v, 反向=%v\n", level, getKeys(beginSet), getKeys(endSet))for len(beginSet) > 0 && len(endSet) > 0 && level <= 3 {if len(beginSet) > len(endSet) {beginSet, endSet = endSet, beginSetfmt.Println("交換搜索方向")}nextSet := make(map[string]bool)for word := range beginSet {neighbors := getNeighbors(word, wordSet)for _, neighbor := range neighbors {if endSet[neighbor] {fmt.Printf("層次 %d: 在 %s 處相遇!\n", level+1, neighbor)fmt.Printf("總路徑長度: %d\n", level+1)return}if !visited[neighbor] {visited[neighbor] = truenextSet[neighbor] = true}}}beginSet = nextSetlevel++if len(beginSet) > 0 {fmt.Printf("層次 %d: 當前擴展=%v, 對方=%v\n", level, getKeys(beginSet), getKeys(endSet))}}
}// 輔助函數:獲取map的所有鍵
func getKeys(m map[string]bool) []string {keys := make([]string, 0, len(m))for k := range m {keys = append(keys, k)}return keys
}func main() {fmt.Println("127. 單詞接龍 - 多種解法實現")fmt.Println("=====================================")// 基礎功能測試testLadderLength()// 性能對比測試benchmarkLadderLength()// BFS過程演示demonstrateBFS()// 雙向BFS演示demonstrateBidirectionalBFS()// 展示算法特點fmt.Println("\n=== 算法特點分析 ===")fmt.Println("1. 單向BFS:經典解法,層次遍歷,簡單直觀")fmt.Println("2. 雙向BFS:從兩端搜索,搜索空間減半,性能最優")fmt.Println("3. 模式匹配:預處理優化鄰居查找,減少重復計算")fmt.Println("4. A*搜索:啟發式搜索,適合有明確目標的場景")fmt.Println("5. DFS回溯:遞歸實現,但時間復雜度較高")fmt.Println("\n=== 關鍵技巧總結 ===")fmt.Println("? 圖的建模:將單詞看作圖中的節點,差一個字母的單詞相連")fmt.Println("? BFS層次遍歷:保證找到的第一個路徑是最短的")fmt.Println("? 雙向優化:從兩端同時搜索,顯著減少搜索空間")fmt.Println("? 訪問控制:避免重復訪問和環路問題")fmt.Println("? 集合操作:使用Set進行快速查找和去重")
}

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

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

相關文章

仿艾莫迅MODBUS調試工具寫一個上位機

公司采購了一個夾具&#xff0c;項目負責人想要試探這個夾具的性能&#xff0c;于是想要我這邊寫一個烤機的程序&#xff0c;小編結合官網資料 https://wiki.amsamotion.com/?title196&doc222查看其pdf說明文檔和調試工具并按照其工具寫一個烤機上位機根據項目負責人的要求…

云展廳:開啟數字化展示新時代

在科技飛速發展的今天&#xff0c;數字化浪潮正席卷各個行業&#xff0c;展覽展示領域也不例外。云展廳作為一種全新的展覽形式&#xff0c;正逐漸嶄露頭角&#xff0c;以其獨特的優勢和創新的技術應用&#xff0c;為觀眾帶來前所未有的觀展體驗&#xff0c;也為企業和機構提供…

硬件電路基礎學習

一、基礎元器件學習 1、電阻 1.1 作用 電阻的工作原理是基于歐姆定律&#xff0c;即電阻的阻值取決于其材料、長度和橫截面積。電阻的主要作用是限制電流&#xff0c;調節電壓和電流&#xff0c;以及保護電路。1.2 數值計算 歐姆定律 通過歐姆定律計算所需保護電阻的大小注意…

基于C++和人工智能(DeepSeek)實踐

基于C++和人工智能(如DeepSeek)實踐 以下是基于C++和人工智能(如DeepSeek或其他AI框架)的實際應用示例,涵蓋不同領域和技術方向,供參考: 基于C++和人工智能(如DeepSeek或其他AI框架)的實際應用示例 圖像識別與處理 人臉檢測:使用OpenCV和DNN模塊加載預訓練的Caffe…

書生浦語第五期L0G1000

完成 視頻課程學習&#xff0c;并在 https://chat.intern-ai.org.cn/ 平臺中實踐提示詞技巧&#xff0c;與 InternLM 和 InternVL 各完成 10 次對話記錄在飛書文檔中。 參加 浦語提示詞工程論文分類打榜賽&#xff0c;分數超過 40 分 InternLM InternVL 浦語提示詞工程論文分…

SpringCloud(一)微服務基礎認識

1、介紹微服務架構是一種架構模式&#xff0c;它提倡將原本獨立的單體應用&#xff0c;拆分成多個小型服務。這些小型服務各 自獨立運行&#xff0c;服務與服務間的通信采用輕量級通信機制&#xff08;一般基于HTTP協議的RESTful API&#xff09; &#xff0c;達到互相協調、互…

MaxKB+MinerU:通過API實現PDF文檔解析并存儲至知識庫

MinerU是一款開源的高質量數據提取工具&#xff0c;能夠將PDF文檔轉換為Markdown和JSON格式。2025年6月13日&#xff0c;MinerU發布了v2.0版本&#xff0c;相較于v1.0版本實現了架構和功能的全面重構與升級。在優化代碼結構和交互方式的同時&#xff0c;v2.0版本還集成了小參數…

一文了解 `package.json` 和 `package-lock.json`文件

所有使用 npm 或 yarn&#xff08;部分場景&#xff09;管理依賴的 JavaScript/Node.js 項目都會存在**的核心文件–package.json 和 package-lock.json&#xff0c;無論項目類型是 Vue、React、Angular&#xff0c;還是純 Node.js 后端項目、普通 JavaScript 工具庫等。 所以這…

【AI論文】大語言模型量化的幾何原理:將GPTQ視為Babai最近平面算法

摘要&#xff1a;將大型語言模型&#xff08;LLMs&#xff09;的權重從16位量化到更低位寬&#xff0c;是實際部署大規模Transformer模型到更具性價比的加速器上的通用方法。GPTQ已成為大語言模型規模下一站式訓練后量化的標準方法之一。然而&#xff0c;其內部工作原理被描述為…

數據處理四件套:NumPy/Pandas/Matplotlib/Seaborn速通指南

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 數據清洗 特征可視化 Kaggle數據集實操 讀者收獲&#xff1a;1周內具備數據預處理能力 數…

計算機系統層次結構

計算機系統通過多層抽象&#xff0c;平衡硬件效率與軟件靈活性&#xff0c;各層以獨立語言和功能構成有機整體。一、層次劃分&#xff08;從底層到頂層&#xff09;層級名稱特點實現方式第1級微程序機器層硬件直接執行微指令&#xff08;如微操作控制信號&#xff09;。物理硬件…

04 基于sklearn的機械學習-梯度下降(上)

梯度下降一 、為什么要用到梯度下降&#xff1f;正規方程的缺陷&#xff1a;非凸函數問題&#xff1a;損失函數非凸時&#xff0c;導數為0會得到多個極值點&#xff08;非唯一解&#xff09;計算效率低&#xff1a;逆矩陣運算時間復雜度 O(n3)&#xff0c;特征量翻倍時計算時間…

淘寶 API HTTP/2 多路復用與連接優化實踐:提升商品數據采集吞吐量

一、引言?隨著電商行業的蓬勃發展&#xff0c;對淘寶平臺商品數據的采集需求日益增長。無論是市場調研公司分析市場趨勢、電商平臺整合商品資源&#xff0c;還是商家進行競品分析&#xff0c;都需要高效、穩定地獲取大量淘寶商品數據。然而&#xff0c;傳統的 HTTP 協議在面對…

javascript中call、apply 和 bind 的區別詳解

文章目錄深入淺出&#xff1a;JavaScript 中的 call、apply 和 bind一、三位魔法師的共同使命二、各顯神通的魔法師們1. call - 即時通訊專家2. apply - 批量處理高手3. bind - 預約服務大師三、魔法師們的對比表格四、魔法師們的實際應用1. 借用方法2. 函數柯里化3. 事件處理五…

【PHP】接入百度AI開放平臺人臉識別API,實現人臉對比

目錄 一、需求 二、準備工作 1、申請服務 2、創建應用&#xff0c;獲取開發密鑰 3、官方開發文檔 4、測試人像圖片 三、PHP接入 1、鑒權&#xff0c;獲取access_token 2、人臉對比 四、完整代碼 一、需求 現在人臉識別、人臉對比技術越來越成熟&#xff0c;使用越來越…

【東楓科技】DreamHAT+

DreamHAT 是一款頂部附加硬件 (HAT) 套件&#xff0c;可為 Raspberry Pi 提供 60GHz 毫米波雷達供您使用。 全尺寸 HAT 包含一個英飛凌 BGT60TR13C 芯片&#xff0c;具有單個發射天線和三個接收器&#xff08;TX/RX&#xff09;&#xff0c;通過 GPIO 引腳和 SPI 連接到 Raspbe…

Spring Boot + MongoDB:從零開始手動配置 MongoConfig 實戰

前言 你以為只要寫上 spring.data.mongodb.*,就能一勞永逸,MongoDB 立馬聽話?別天真,這只是入門級操作,像是拿個自動擋鑰匙,開個小車溜達溜達,遠遠算不上高手操作。當項目需求變得復雜,連接字符串需要靈活配置,或者多數據源并行作戰時,自動配置的魔法顯得捉襟見肘。…

建筑節能目標下,樓宇自控系統以高效運行助力節能減碳

隨著全球氣候變化問題日益嚴峻&#xff0c;節能減排已成為各國政府和企業的重要任務。在建筑領域&#xff0c;樓宇自控系統&#xff08;Building Automation System, BAS&#xff09;作為實現建筑節能目標的關鍵技術&#xff0c;正發揮著越來越重要的作用。根據中國政府發布的《…

LOVON——面向足式Open-Vocabulary的VLN導航:LLM做任務分解、YOLO11做目標檢測,最后L2MM將指令和視覺映射為動作,且解決動態模糊

前言 因為項目需要(比如我們在做的兩個展廳講解訂單)&#xff0c;近期我一直在研究VLN相關&#xff0c;有些工作哪怕暫時還沒開源(將來可能會開源)&#xff0c;但也依然會解讀&#xff0c;比如好處之一是構建完整的VLN知識體系&#xff0c;本文便是其中一例 我在解讀過程中&am…

在線免費的AI文本轉語音工具TTSMaker介紹

TTSMaker是一個在線的文本轉語音工具&#xff0c; 支持多語言和中文方言&#xff0c;不同的語言和方言單次轉換的字符上限從200-10000 不同&#xff0c;轉換的效果還不錯&#xff0c;聽不出明顯的AI痕跡。 工具的網址是&#xff1a;https://ttsmaker.cn/。 工具的界面如上&…