代码随想录二刷之“图论”~GO

A.深搜与广搜(重点掌握!!!!)

深搜类似于回溯法

  • 搜索方向,是认准一个方向搜,直到碰壁之后再换方向
  • 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。

广搜能保存我们要遍历过的元素的容器就可以,队列、栈、数组都是OK

  • 用队列的话,就是保证每一圈都是一个方向去转,例如统一顺时针或者逆时针。因为队列是先进先出,加入元素和弹出元素的顺序是没有改变的。
  • 如果用栈的话,就是第一圈顺时针遍历,第二圈逆时针遍历,第三圈有顺时针遍历。因为栈是先进后出,加入元素和弹出元素的顺序改变了

1.可达路径

感悟:找出从1到5的所有路径,深度优先搜索的代码其实和回溯法很像,节点入path,递归+回溯

var result [][]int 
var path []int     
func dfs(graph [][]int, x, n int) {// 当前遍历的节点x 到达节点nif x == n { // 找到符合条件的一条路径temp := make([]int, len(path))copy(temp, path)result = append(result, temp)return}for i := 1; i <= n; i++ { // 遍历节点x链接的所有节点if graph[x][i] == 1 { // 找到 x链接的节点path = append(path, i)    // 遍历到的节点加入到路径中来dfs(graph, i, n)          // 进入下一层递归path = path[:len(path)-1] // 回溯,撤销本节点}}
}

2.岛屿数量

方法一:深搜---模板题,后期要总结!!!!

package main
import "fmt"var dir = [][]int{{0, 1},   // 右{1, 0},   // 下{-1, 0},  // 上{0, -1},  // 左
}
func dfs(graph [][]int, visited [][]bool,x,y int){for i := range dir{nextx := x + dir[i][0]nexty := y + dir[i][1]if nextx < 0||nextx >= len(graph)||nexty < 0||nexty >=len(graph[0]){continue}if !visited[nextx][nexty] && graph[nextx][nexty] == 1{visited[nextx][nexty] = truedfs(graph,visited,nextx,nexty)}}
}
func main(){var n,m intfmt.Scan(&n,&m)graph := make([][]int,n)for i := range graph{graph[i] = make([]int,m)}for i := 0;i < n; i++{for j := 0;j < m; j++{fmt.Scan(&graph[i][j])}}visited := make([][]bool,n)for i := range visited{visited[i] = make([]bool,m)}var res intfor i := 0;i < n;i++{for j := 0;j < m;j++{if !visited[i][j] && graph[i][j] == 1{visited[i][j] = trueres++dfs(graph,visited,i,j)//将和他相连的陆地都标记上true}}}fmt.Println(res)
}

方法二:广搜---模板题---后期要总结!!!

package main
import ("fmt""container/list"
)var dir = [4][2]int{{0, 1},   // 右{1, 0},   // 下{-1, 0},  // 上{0, -1},  // 左
}
func bfs(graph [][]int, visited [][]bool,x,y int){queue := list.New()queue.PushBack([2]int{x,y})visited[x][y] = truefor queue.Len() > 0{cur := queue.Remove(queue.Front()).([2]int)curx,cury := cur[0],cur[1]for i := range dir{nextx := curx + dir[i][0]nexty := cury + dir[i][1]if nextx < 0 || nexty < 0||nextx >= len(graph)||nexty >= len(graph[0]){continue}if !visited[nextx][nexty] && graph[nextx][nexty] == 1{visited[nextx][nexty] = truequeue.PushBack([2]int{nextx,nexty})}}}
}func main(){var n,m intfmt.Scan(&n,&m)graph := make([][]int,n)for i := range graph{graph[i] = make([]int,m)}for i := 0;i < n;i++{for j := 0;j < m;j++{fmt.Scan(&graph[i][j])}}visited := make([][]bool,n)for i := range visited{visited[i] = make([]bool,m)}var res intfor i := 0;i < n;i++{for j := 0;j < m;j++{if !visited[i][j] && graph[i][j] == 1{visited[i][j] = trueres++bfs(graph,visited,i,j)//将和他相连的陆地都标记上true}}}fmt.Println(res)
}

3.岛屿最大面积

感悟:本题就在模板题的基础之上统计面积!!!

package main
import "fmt"var dir = [][]int{{0, 1},   // 右{1, 0},   // 下{-1, 0},  // 上{0, -1},  // 左
}
var count int
func dfs(graph [][]int, visited [][]bool,x,y int){for i := range dir{nextx := x + dir[i][0]nexty := y + dir[i][1]if nextx < 0||nextx >= len(graph)||nexty < 0||nexty >=len(graph[0]){continue}if !visited[nextx][nexty] && graph[nextx][nexty] == 1{visited[nextx][nexty] = truecount++dfs(graph,visited,nextx,nexty)}}
}
func max(i,j int)int{if i > j{return i}else{return j}
}
func main(){var n,m intfmt.Scan(&n,&m)graph := make([][]int,n)for i := range graph{graph[i] = make([]int,m)}for i := 0;i < n; i++{for j := 0;j < m; j++{fmt.Scan(&graph[i][j])}}visited := make([][]bool,n)for i := range visited{visited[i] = make([]bool,m)}var res intfor i := 0;i < n;i++{for j := 0;j < m;j++{if !visited[i][j] && graph[i][j] == 1{visited[i][j] = truecount = 1dfs(graph,visited,i,j)res = max(res,count)//将和他相连的陆地都标记上true}}}fmt.Println(res)
}

4.孤岛总面积

本题要求找到不靠边的陆地面积,那么我们只要从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图 统计此时还剩下的陆地就可以了。

package mainimport ("container/list""fmt"
)// 四个方向的偏移量
var dir = [][]int{{0, 1},   // 右{1, 0},   // 下{-1, 0},  // 上{0, -1},  // 左
}// BFS函数,用于标记并清除连通的陆地
func bfs(grid [][]int, x, y int) {// 使用list作为队列que := list.New()que.PushBack([2]int{x, y})grid[x][y] = 0 // 加入队列后立即标记为已访问// 队列不为空时继续处理for que.Len() > 0 {// 取出队首元素cur := que.Front().Value.([2]int)que.Remove(que.Front())curx, cury := cur[0], cur[1]// 遍历四个方向for i := 0; i < 4; i++ {nextx := curx + dir[i][0]nexty := cury + dir[i][1]// 边界检查if nextx < 0 || nextx >= len(grid) || nexty < 0 || nexty >= len(grid[0]) {continue}// 如果是未访问的陆地,加入队列并标记if grid[nextx][nexty] == 1 {que.PushBack([2]int{nextx, nexty})grid[nextx][nexty] = 0 // 加入队列后立即标记}}}
}func main() {var n, m intfmt.Scan(&n, &m)// 初始化网格grid := make([][]int, n)for i := range grid {grid[i] = make([]int, m)}// 读取网格数据for i := 0; i < n; i++ {for j := 0; j < m; j++ {fmt.Scan(&grid[i][j])}}// 处理左右边界的陆地for i := 0; i < n; i++ {if grid[i][0] == 1 {bfs(grid, i, 0)}if grid[i][m-1] == 1 {bfs(grid, i, m-1)}}// 处理上下边界的陆地for j := 0; j < m; j++ {if grid[0][j] == 1 {bfs(grid, 0, j)}if grid[n-1][j] == 1 {bfs(grid, n-1, j)}}// 统计剩余的陆地(孤岛)数量count := 0for i := 0; i < n; i++ {for j := 0; j < m; j++ {if grid[i][j] == 1 {count++}}}fmt.Println(count)
}

5.沉没孤岛

感悟:这道题只不过遇到陆地就加一,最后都减1。和上道题一个思路

package mainimport ("container/list""fmt"
)// 四个方向的偏移量
var dir = [][]int{{0, 1},   // 右{1, 0},   // 下{-1, 0},  // 上{0, -1},  // 左
}// BFS函数,用于标记并清除连通的陆地
func bfs(grid [][]int, x, y int) {// 使用list作为队列que := list.New()que.PushBack([2]int{x, y})grid[x][y] = 2 // 加入队列后立即标记为已访问// 队列不为空时继续处理for que.Len() > 0 {// 取出队首元素cur := que.Front().Value.([2]int)que.Remove(que.Front())curx, cury := cur[0], cur[1]// 遍历四个方向for i := 0; i < 4; i++ {nextx := curx + dir[i][0]nexty := cury + dir[i][1]// 边界检查if nextx < 0 || nextx >= len(grid) || nexty < 0 || nexty >= len(grid[0]) {continue}// 如果是未访问的陆地,加入队列并标记if grid[nextx][nexty] == 1 {que.PushBack([2]int{nextx, nexty})grid[nextx][nexty] = 2 // 加入队列后立即标记}}}
}func main() {var n, m intfmt.Scan(&n, &m)// 初始化网格grid := make([][]int, n)for i := range grid {grid[i] = make([]int, m)}// 读取网格数据for i := 0; i < n; i++ {for j := 0; j < m; j++ {fmt.Scan(&grid[i][j])}}// 处理左右边界的陆地for i := 0; i < n; i++ {if grid[i][0] == 1 {bfs(grid, i, 0)}if grid[i][m-1] == 1 {bfs(grid, i, m-1)}}// 处理上下边界的陆地for j := 0; j < m; j++ {if grid[0][j] == 1 {bfs(grid, 0, j)}if grid[n-1][j] == 1 {bfs(grid, n-1, j)}}// 统计剩余的陆地(孤岛)数量for i := 0; i < n; i++ {for j := 0; j < m; j++ {if grid[i][j] != 0 {grid[i][j]--}}}for i := 0;i < n;i++{for j := 0;j < m-1;j++{fmt.Printf("%d ",grid[i][j])}fmt.Println(grid[i][m-1])}
}

6.水流问题

从第一组边界逆流而上,第二组边界也逆流而上,然后同时标记过的点就是答案

package mainimport "fmt"var n, m int
var dir = [][]int{{-1, 0}, // 上{0, -1}, // 左{1, 0},  // 下{0, 1},  // 右
}// dfs 函数:从(x,y)开始遍历,只向不低于当前高度的方向移动
func dfs(grid [][]int, visited [][]bool, x, y int) {if visited[x][y] {return}visited[x][y] = truefor i := 0; i < 4; i++ {nextx := x + dir[i][0]nexty := y + dir[i][1]// 边界检查if nextx < 0 || nextx >= n || nexty < 0 || nexty >= m {continue}// 只向不低于当前高度的方向遍历(从低向高)if grid[x][y] > grid[nextx][nexty] {continue}dfs(grid, visited, nextx, nexty)}
}func main() {fmt.Scan(&n, &m)// 初始化网格grid := make([][]int, n)for i := range grid {grid[i] = make([]int, m)}// 读取网格数据for i := 0; i < n; i++ {for j := 0; j < m; j++ {fmt.Scan(&grid[i][j])}}// 初始化两个边界访问标记数组firstBorder := make([][]bool, n)secondBorder := make([][]bool, n)for i := range firstBorder {firstBorder[i] = make([]bool, m)secondBorder[i] = make([]bool, m)}// 从最左列和最右列开始遍历for i := 0; i < n; i++ {dfs(grid, firstBorder, i, 0)          // 第一组边界:最左列dfs(grid, secondBorder, i, m-1)       // 第二组边界:最右列}// 从最上行和最下行开始遍历for j := 0; j < m; j++ {dfs(grid, firstBorder, 0, j)          // 第一组边界:最上行dfs(grid, secondBorder, n-1, j)       // 第二组边界:最下行}// 输出同时被两组边界遍历到的节点坐标for i := 0; i < n; i++ {for j := 0; j < m; j++ {if firstBorder[i][j] && secondBorder[i][j] {fmt.Printf("%d %d\n", i, j)}}}
}

7.建造最大孤岛

package mainimport "fmt"var n, m int
var dir = [][]int{{-1, 0}, // 上{0, -1}, // 左{1, 0},  // 下{0, 1},  // 右
}// dfs 函数:从(x,y)开始遍历,只向不低于当前高度的方向移动
func dfs(grid [][]int, visited [][]bool, x, y int) {if visited[x][y] {return}visited[x][y] = truefor i := 0; i < 4; i++ {nextx := x + dir[i][0]nexty := y + dir[i][1]// 边界检查if nextx < 0 || nextx >= n || nexty < 0 || nexty >= m {continue}// 只向不低于当前高度的方向遍历(从低向高)if grid[x][y] > grid[nextx][nexty] {continue}dfs(grid, visited, nextx, nexty)}
}func main() {fmt.Scan(&n, &m)// 初始化网格grid := make([][]int, n)for i := range grid {grid[i] = make([]int, m)}// 读取网格数据for i := 0; i < n; i++ {for j := 0; j < m; j++ {fmt.Scan(&grid[i][j])}}// 初始化两个边界访问标记数组firstBorder := make([][]bool, n)secondBorder := make([][]bool, n)for i := range firstBorder {firstBorder[i] = make([]bool, m)secondBorder[i] = make([]bool, m)}// 从最左列和最右列开始遍历for i := 0; i < n; i++ {dfs(grid, firstBorder, i, 0)          // 第一组边界:最左列dfs(grid, secondBorder, i, m-1)       // 第二组边界:最右列}// 从最上行和最下行开始遍历for j := 0; j < m; j++ {dfs(grid, firstBorder, 0, j)          // 第一组边界:最上行dfs(grid, secondBorder, n-1, j)       // 第二组边界:最下行}// 输出同时被两组边界遍历到的节点坐标for i := 0; i < n; i++ {for j := 0; j < m; j++ {if firstBorder[i][j] && secondBorder[i][j] {fmt.Printf("%d %d\n", i, j)}}}
}

8.岛屿周长

package mainimport ("bufio""fmt""os""strconv""strings"
)func main() {scanner := bufio.NewScanner(os.Stdin)scanner.Scan()line := scanner.Text()n, m := parseInput(line)// 初始化 gridgrid := make([][]int, n)for i := range grid {grid[i] = make([]int, m)}// 读入 grid 数据for i := 0; i < n; i++ {scanner.Scan()line := scanner.Text()values := parseLine(line, m)for j := 0; j < m; j++ {grid[i][j] = values[j]}}sum := 0   // 陆地数量cover := 0 // 相邻数量for i := 0; i < n; i++ {for j := 0; j < m; j++ {if grid[i][j] == 1 {sum++ // 统计总的陆地数量// 统计上边相邻陆地if i-1 >= 0 && grid[i-1][j] == 1 {cover++}// 统计左边相邻陆地if j-1 >= 0 && grid[i][j-1] == 1 {cover++}// 为什么没统计下边和右边? 因为避免重复计算}}}fmt.Println(sum*4 - cover*2)
}// parseInput 解析 n 和 m
func parseInput(line string) (int, int) {parts := strings.Split(line, " ")n, _ := strconv.Atoi(parts[0])m, _ := strconv.Atoi(parts[1])return n, m
}// parseLine 解析一行中的多个值
func parseLine(line string, count int) []int {parts := strings.Split(line, " ")values := make([]int, count)for i := 0; i < count; i++ {values[i], _ = strconv.Atoi(parts[i])}return values
}

9.字符串接龙

1、图中的线是如何连在一起的

在搜索的过程中,我们可以枚举,用26个字母替换当前字符串的每一个字符,在看替换后 是否在 strList里出现过,就可以判断两个字符串是否是链接的。

2、起点和终点的最短路径长度

首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个。所以判断点与点之间的关系,需要判断是不是差一个字符,如果差一个字符,那就是有链接。然后就是求起点和终点的最短路径长度,在无权图中,求最短路,用深搜或者广搜就行,没必要用最短路算法。在无权图中,用广搜求最短路最为合适,广搜只要搜到了终点,那么一定是最短的路径。因为广搜就是以起点中心向四周扩散的搜索。

另外需要有一个注意点:

  • 本题是一个无向图,需要用标记位,标记着节点是否走过,否则就会死循环!
  • 使用哈希表来检查字符串是否出现在字符串集合里更快一些

这道题好难啊!!!(需要二刷)

package main
import("fmt"
)
var count int
func bfs(start,end string,strset map[string]bool)int{visited := make(map[string]int)que := []string{start}visited[start] = 1for len(que) > 0{word := que[0]que = que[1:]path := visited[word]for i := 0;i < len(word);i++{newWord := []byte(word)for j := 0;j < 26;j++{newWord[i] = byte('a'+j)newString := string(newWord)if newString == end{return path + 1}if strset[newString] && visited[newString]==0{//当前单词没有遍历过且新单词在给定的集合当中visited[newString] = path + 1que = append(que,newString)}}}}return 0//没找到
}func main(){var num intfmt.Scan(&num)var start,end,str stringfmt.Scan(&start,&end)strset := make(map[string]bool,num)for i := 0;i < num;i++{fmt.Scan(&str)strset[str] = true}result := bfs(start,end,strset)fmt.Println(result)
}

10.有向图的完全可达性

如果是无权的。邻接矩阵就是:如果a和b相连接,a和c连接,那么graph[a][b] = 1.graph[a][c] = 1。如果是邻接表,那么graph[a] = [b,c]

思路:构建邻接表,如果遇到了没有经历过的节点visited置为true。随后遍历他的邻接表。如果遇到新的节点,就接着递归遍历,并且置为true。直到最后。

package mainimport ("fmt"
)func dfs(graph [][]int, key int, visited []bool) {visited[key] = truefor _,neighbor := range graph[key]{if visited[neighbor] == false{dfs(graph,neighbor,visited)}}
}func main(){var n, k intfmt.Scan(&n, &k)//n个节点,k个边graph := make([][]int,n+1)for i := 0;i < k;i++{var u,v intfmt.Scan(&u,&v)graph[u] = append(graph[u],v) }visited := make([]bool,n+1)dfs(graph,1,visited)for i := 1; i <= n; i++ {if !visited[i] {fmt.Println(-1)return}}fmt.Println(1)
}

11.单词接龙

感悟:这道题的本质和字符串接龙是一模一样的。。下午刷完,晚上看这道题就晕了。类似于层序遍历。

func ladderLength(beginWord string, endWord string, wordList []string) int {wordSet := make(map[string]bool,len(wordList))for _,word := range wordList{wordSet[word] = true}if !wordSet[endWord]{return 0}visited := make(map[string]int)visited[beginWord] = 1que := []string{beginWord}for len(que) > 0{cur := que[0]que = que[1:]//出队列path := visited[cur]for i := 0;i < len(cur);i++{newstr := []byte(cur)for j := 0;j < 26;j++{newstr[i] = byte('a'+j)nextword := string(newstr)if nextword == endWord{return path + 1//找到了}if visited[nextword] == 0 && wordSet[nextword]{//能找到,但是没有遍历过visited[nextword] = path + 1que = append(que,nextword)}}}}    return 0
}

12.钥匙和房间

感悟:这道题的本质就是图的连通性的问题。每个房间对应个节点,房间里的钥匙对应节点间的“边”。所以即转换成起始节点遍历所有节点。选择DFS,是因为很契合DFS的逻辑“深度优先,递归探索。”

func canVisitAllRooms(rooms [][]int) bool {visited := make([]bool,len(rooms))var dfs func(key int)dfs = func(key int){if visited[key]{return}visited[key] = truefor _,i := range rooms[key]{dfs(i)}}dfs(0)for i := range visited{if visited[i] == false{return false}}return true
}

B.并查集

并查集主要有两个功能:

  • 将两个元素添加到一个集合中。
  • 判断两个元素在不在同一个集合

并查集模板

package mainimport ("fmt"
)const MaxNodes = 101var n int
var father [MaxNodes]int// 初始化并查集
func initialize() {for i := 1; i <= n; i++ {father[i] = i}
}// 并查集里寻根的过程
func find(u int) int {if u == father[u] {return u}father[u] = find(father[u])return father[u]
}// 判断 u 和 v 是否找到同一个根
func isSame(u, v int) bool {return find(u) == find(v)
}// 将 v->u 这条边加入并查集
func join(u, v int) {rootU := find(u)rootV := find(v)if rootU != rootV {father[rootV] = rootU}
}func main() {var m, s, t, source, destination intfmt.Scan(&n, &m)initialize()for i := 0; i < m; i++ {fmt.Scan(&s, &t)join(s, t)}fmt.Scan(&source, &destination)if isSame(source, destination) {fmt.Println(1)} else {fmt.Println(0)}
}

1.冗余连接

方法一深搜:每遍历一条边的时候,比如[u,v],首先判断u是否能与v连通。如果不能,将其放入连通表中。如果可以连通,那就把那条边返回。对于深搜的思路:比如判断2和3能不能连通。遍历2的连通表,比如数字是1.然后接着就去判断1和3的连通性了。如果在1的连通表的可以找到3,那么就说明2,3连通。然后递归返回。

func findRedundantConnection(edges [][]int) []int {graph := make(map[int][]int)visited := make(map[int]bool)var dfs func(u, v int) booldfs = func(u, v int) bool {if u == v {return true}visited[u] = truefor _, next := range graph[u] {if !visited[next] {// 关键修复:如果递归找到路径,立即返回trueif dfs(next, v) {return true}}}return false}for _, edge := range edges {u, v := edge[0], edge[1]// 重置访问标记for node := range visited {visited[node] = false}if dfs(u, v) {return []int{u, v}}// 将当前边加入图中graph[u] = append(graph[u], v)graph[v] = append(graph[v], u)}return []int{}
}

方法二:并查集:

首先记住并查集的初始化方式,还有find函数的思想。然后就一次遍历边集的,然后查看x和y是否有同一个根节点。如果有了,就证明再加那条边就冗余了。

func findRedundantConnection(edges [][]int) []int {parent := make([]int,len(edges) + 1)// 初始化并查集,每个节点的父节点指向自己for i := 1;i <= len(edges);i++{parent[i] = i}// 查找根节点(带路径压缩)var find func(int) intfind = func(x int) int {if parent[x] != x {parent[x] = find(parent[x]) // 路径压缩}return parent[x]
//处理当前逻辑:对于parent[x]通过若干的递归和回溯,已经找到了目前他所对应的根节点了。所以直接返回}for _,edge := range edges{u,v := edge[0],edge[1]rootU := find(u)rootV := find(v)if rootU == rootV{return edge}parent[rootV] = rootU}return nil
}

处理当前层逻辑:在递归调用返回后,利用返回的结果来完成当前层需要完成的任务

拓扑排序的过程

  1. 找到入度为0 的节点,加入结果集
  2. 将该节点从图中移除

循环以上两步,直到 所有节点都在图中被移除了。结果集的顺序,就是我们想要的拓扑排序顺序 

拓扑排序判断有没有环:0加入到结果集之后,找不到入度为0的点

C.最小生成树理论

prim && kruskal

感觉面试不怎么考。。。

D.拓扑排序

拓扑排序指的是一种 解决问题的大体思路, 而具体算法,可能是广搜也可能是深搜。

1.课程表

func canFinish(numCourses int, prerequisites [][]int) bool {inDegree := make([]int,numCourses)//入度graph := make([][]int,numCourses)//邻接表for _,pre := range prerequisites{//初始化course,precourse := pre[0],pre[1]graph[precourse] = append(graph[precourse],course)inDegree[course]++}queue := []int{}for i := 0;i < numCourses;i++{//入度为0点点加入队列if inDegree[i] == 0{queue = append(queue,i)}}count := 0for len(queue) > 0{cur := queue[0]queue = queue[1:]count++// 遍历当前课程的所有后续课程for _,nextCourse := range graph[cur]{inDegree[nextCourse]--if inDegree[nextCourse] == 0{queue = append(queue,nextCourse)}}}return count == numCourses
}

2.课程表2️⃣

方法一:开两个数组(冗余)方法二:

func findOrder(numCourses int, prerequisites [][]int) []int {inDegree := make([]int, numCourses)graph := make(map[int][]int)for _, val := range prerequisites {course, precourse := val[0], val[1]inDegree[course]++graph[precourse] = append(graph[precourse], course)}res := []int{}// 第一轮:添加所有入度为0的课程for i := 0; i < numCourses; i++ {if inDegree[i] == 0 {res = append(res, i)}}// 使用res作为队列,i作为指针for i := 0; i < len(res); i++ {cur := res[i]for _, next := range graph[cur] {inDegree[next]--if inDegree[next] == 0 {res = append(res, next)}}}if len(res) != numCourses {return []int{}}return res
}

感悟:这也太优雅了吧。len(res) 在循环过程中会不断增长。res同时充当结果容器去存储结果,同时i也相当于指针去标记当前处理的位置

E.最短路算法理论

感觉面试不怎么考。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/923682.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Echarts+HTML5可视化数据大屏展示-白茶大数据溯源平台V2

效果展示&#xff1a;代码结构&#xff1a;主要代码实现 index.html布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta n…

Linux 系统网络配置及 IP 地址相关知识汇总

Linux 系统网络配置及 IP 地址相关知识汇总 一、IP地址基础 IP地址&#xff1a;在计算机网络中用来唯一标识一台设备的一组数字。 二、IPv4相关知识 1. IPv4的表示方法 采用点分十进制表示&#xff0c;即由4个0-255的十进制数通过点分隔组成&#xff08;如192.168.1.1&#xff…

百度股价突破120美元创年内新高,AI云成为增长新引擎

美东时间9月16日&#xff0c;百度&#xff08;NASDAQ: BIDU&#xff09;美股大涨近8%&#xff0c;收盘价突破120美元&#xff0c;站上124美元高位&#xff0c;创2023年10月以来新高。北京时间9月17日港股开盘&#xff0c;百度&#xff08;09888.HK&#xff09;港股再次暴涨&…

《彩虹六号:围攻》“Siege X”发布会3月14日举行!

使用jQuery的常用方法与返回值分析 jQuery是一个轻量级的JavaScript库&#xff0c;旨在简化HTML文档遍历和操作、事件处理以及动画效果的创建。本文将介绍一些常用的jQuery方法及其返回值&#xff0c;帮助开发者更好地理解和运用这一强大的库。 1. 选择器方法 jQuery提供了多种…

[从青铜到王者] Spring Boot+Redis+Kafka电商场景面试全解析

互联网大厂Java开发岗技术面试实录&#xff1a;严肃面试官VS搞笑程序员谢飞机 文章内容 第一轮&#xff1a;基础框架与并发控制&#xff08;电商系统基础能力&#xff09; 面试官&#xff08;严肃&#xff09;&#xff1a;欢迎进入面试环节&#xff0c;首先请用3句话总结Spring…

【DMA】DMA架构解析

目录 1 DMA架构 1. 芯片架构图一览 2. AHB总线矩阵挂载 3. AHB1/APB1的桥和AHB1/APB2的桥 4. DMA1 和 DMA2 的区别 2 AHB总线矩阵 1 DMA架构 1. 芯片架构图一览 2. AHB总线矩阵挂载 stm32F411 芯片的 AHB 总线矩阵上共挂载了 6 主 5 从 六主&#xff1a; Icode-bus、D…

GPS 定位器:精准追踪的“隐形守护者”

GPS 定位器&#xff1a;精准追踪的“隐形守护者” 一、什么是 GPS 定位器&#xff1f; GPS 定位器是一种基于 全球定位系统&#xff08;Global Positioning System, GPS&#xff09; 的智能追踪设备。 通过接收卫星信号并结合通信模块&#xff08;如 4G、NB-IoT&#xff09;&am…

前端拖拽排序实现

1. 使用 HTML5 事件 触发时机 核心任务 dragstart 开始拖拽时 准备数据&#xff0c;贴上标签 dragover 经过目标上方时 必须 preventDefault()&#xff0c;发出“允许放置”的信号 dragleave 离开目标上方时 清理高亮等临时视觉效果 drop 在目标上松手时 接收数据…

arm coresight

这是一个arm设计的调试基础架构&#xff0c;我们常用的debug基本都包含在内。比如ETM、PTM、ITM、HTM、ETB等。 注意ETM、PTM、ITM、HTM、ETB是coresight的子集。这些工具相比普通debug的断点调试&#xff0c;需要更高的专业水平&#xff0c;因此也用于复杂软件故障定位、性能…

《华为基本法》 —— 企业发展的导航仪

当一家企业从 “小作坊” 向 “规模化组织” 跨越时&#xff0c;最需要的是什么&#xff1f;华为的答案&#xff0c;藏在 1998 年出台的《华为基本法》里。1998 年&#xff0c;《华为基本法》正式颁布&#xff0c;这部凝结华为早期经营智慧的纲领性文件&#xff0c;不仅为华为从…

【完整源码+数据集+部署教程】传统韩文化元素分割系统: yolov8-seg-GFPN

背景意义 研究背景与意义 随着全球化的加速&#xff0c;传统文化的保护与传承面临着前所未有的挑战。尤其是韩国的传统文化&#xff0c;作为东亚文化的重要组成部分&#xff0c;蕴含着丰富的历史、艺术和哲学内涵。然而&#xff0c;随着现代化进程的推进&#xff0c;许多传统文…

构建AI智能体:三十五、决策树的核心机制(一):刨根问底鸢尾花分类中的参数推理计算

一、初识决策树想象一个生活中的场景&#xff0c;我们去水果店买一个西瓜&#xff0c;该怎么判断一个西瓜是不是又甜又好的呢&#xff1f;我们可能会问自己一系列问题&#xff1a;首先看看它的纹路清晰吗&#xff1f;如果“是”&#xff0c;那么它可能是个好瓜。如果“否“&…

c语言中实现线程同步的操作

线程 常见问题 同步权限 在多线程 / 多进程并发时&#xff0c;为避免共享资源&#xff08;如内存变量、硬件设备、文件&#xff09;被同时修改导致的数据不一致&#xff0c;需要通过 “同步机制” 控制谁能访问资源 ——“获取同步权限” 就是线程 / 进程申请这种访问资格的过程…

一台设备管理多个 GitHub 账号:从配置到切换的完整指南

一台设备管理多个 GitHub 账号&#xff1a;从配置到切换的完整指南 在日常开发中&#xff0c;我们经常需要在同一台电脑上使用多个 GitHub 账号&#xff08;比如个人账号和工作账号&#xff09;。但默认情况下&#xff0c;Git 会优先使用全局配置的账号&#xff0c;导致推送代…

即插即用,秒入虚拟:TouchDIVER Pro 触觉手套 赋能 AR/VR 高效交互

一、即插即用&#xff0c;零门槛开启沉浸之旅 在XR&#xff08;扩展现实&#xff09;技术高速发展的今天&#xff0c;用户对“真实感”的追求愈发迫切。Weart公司旗下旗舰产品TouchDIVER Pro触觉手套&#xff0c;凭借无需适配器、无需复杂设置的极简设计&#xff0c;打破传统触…

GitHub热榜项目 - 日榜之应用场景与未来发展趋势

一、引言GitHub热榜项目 - 日榜呈现出丰富多样的技术成果&#xff0c;这些项目蕴含着巨大的应用潜力&#xff0c;并且对未来数智化技术的发展有着重要的指示作用。深入探究其应用场景以及未来发展趋势&#xff0c;能让我们更好地把握技术发展方向&#xff0c;将这些前沿技术应用…

Linux网络:socket编程TCP

文章目录前言一&#xff0c;服务器端流程1-1 绑定协议1-2 绑定IP和端口1-3 监听客户端1-4 接收连接1-5 收发数据1-6 关闭连接1-7 服务端整体代码二&#xff0c;客户端流程2-1 指定地址和端口2-2 连接服务器2-3 发送消息2-4 客户端整体代码前言 TCP 的通信过程就像两个人打电话…

飞书智能查询机器人搭建说明文档

飞书智能查询机器人搭建说明文档 一、使用手册 1. 创建飞书机器人应用 如果仅需对接已有机器人应用则可跳过该步骤&#xff08;建议各业务部门独立使用各自的机器人应用&#xff09;。在飞书开发者后台中创建企业自建应用&#xff0c;添加机器人应用能力并申请对应的身份权限…

蓝色系列包装行业网站 适合企业站,带手机版自适应

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 蓝色通用企业网站是基于SDCMS四合一企业网站管理系统开发的模板&#xff0c;适合企业站&#xff0c;带手机版。 四网合一企业网站管理系统是一个以PHPMySQL/Sqlite进行开发的四网合一网…

【大模型:知识图谱】--6.Neo4j DeskTop安装+使用

上一期讲了图知识库的安装&#xff0c; 【图数据库】--Neo4j 安装_neo4j安装-CSDN博客 现在来看看可视化管理程序&#xff1a;Neo4j DeskTop的安装. 需要先安装java环境&#xff0c;具体看上面 目录 1.Neo4j DeskTop版下载 2.Neo4j DeskTop版安装 3.Neo4j DeskTop版使用 …