图的创建和基础操作(数据结构实验作业)

上面是我的实验作业要求:(看不到的同学,移步:https://gitee.com/young-lion/picture-bed/raw/master/202412051939715.png)

下面的代码使用的是go语言:

package mainimport ("fmt"
)// 访问标记数组
var visited []bool
// ----------------------------邻接矩阵表示的图-----------------------------------// 自定义顶点类型Vex,这里简单地包含一个整数值来表示顶点编号,可按需扩展其成员
type Vex struct {id   int    //顶点编号data int    //顶点数据
}// 图的定义,使用邻接矩阵存储结构
type Graph struct {vex   []Vex    // 顶点数组,使用自定义的Vex类型edge  [][]int  // 邻接矩阵,这里边的连接情况用0或1表示是否有边相连,可按需调整n     int      // 顶点个数m     int      // 边数(一条边的长度)
}// 创建节点
func CreateVex(id int, data int) Vex {return Vex{id: id, data: data}
}// 创建邻接矩阵表示的图
func CreateGraph() (n,m int,vex []Vex, edge [][]int) {// 顶点数组fmt.Println("请输入顶点个数:")fmt.Scan(&n)vex = make([]Vex, n)for i := 0; i < n; i++ {fmt.Println("请输入顶点data:")var data intfmt.Scan(&data)vex[i] = CreateVex(i, data)}// 创建空的邻接矩阵edge = make([][]int, n)for i := 0; i < n; i++ {edge[i] = make([]int, n)}// 邻接矩阵// 输入边的数量fmt.Println("请输入边的数量:")fmt.Scan(&m)fmt.Println("请输入边的关系:")for i := 0; i < m; i++ {var start, end intfmt.Scan(&start, &end)// 输入的是值datastartvex := SearchVex(vex, start)endvex := SearchVex(vex, end)startid := startvex.idendid := endvex.id// TODO:调试://fmt.Println(startid,"--->", endid)edge[startid][endid] = 1//fmt.Println(edge[startid][endid])//edge[endid][startid] = 1 // 无向图,双向边赋值}return
}// 深度优先搜索遍历(基于邻接矩阵的图)
func DFSTraverse(graph *Graph) {visited = make([]bool, graph.n)for i := 0; i < graph.n; i++ {if!visited[i] {DFS(graph, i)}}
}// 深度优先搜索(基于邻接矩阵的图)
func DFS(graph *Graph, index int) {fmt.Printf("%d ", graph.vex[index].data)visited[index] = truefor i := 0; i < graph.n; i++ {if graph.edge[index][i] == 1 &&!visited[i] {DFS(graph, i)}}
}// 广度优先搜索遍历(基于邻接矩阵的图)
func BFSTraverse(graph *Graph) {// 访问标记数组 初始化为false[默认]:都未访问visited := make([]bool, graph.n)// 暂存队列(用切片模拟)queue := make([]int, 0)// 遍历每一个顶点for i := 0; i < graph.n; i++ {// 如果没有访问if!visited[i] {// 先清空队列,避免之前连通分量遗留的顶点干扰当前遍历queue = queue[:0]// 将当前访问的节点位置加入队列queue = append(queue, i)visited[i] = true// 访问fmt.Printf("%d ", graph.vex[i].data)// 找当前层所有点的其他邻接点(遍历队列)for len(queue) > 0 {// 取出队列的第一个点vex := queue[0]queue = queue[1:]for j := 0; j < graph.n; j++ {if graph.edge[vex][j] == 1 && !visited[j] {// 进入队列,进入(逻辑上的)下一层queue = append(queue, j)// 访问新入队的邻接点fmt.Printf("%d ", graph.vex[j].data)visited[j] = true}}}}}
}// 定位顶点
func SearchVex(vex []Vex, data int) Vex {for i := 0; i < len(vex); i++ {if vex[i].data == data {return vex[i]}}return Vex{}
}// 打印邻接矩阵
func PrintEdge(edge [][]int) {for i := 0; i < len(edge); i++ {for j := 0; j < len(edge[i]); j++ {fmt.Print(edge[i][j], " ")}fmt.Println()}
}// 判断是否连通,打印连通分量(修改bfs)
// 广度优先搜索遍历(基于邻接矩阵的图)
func BFSTraverse_judgelinked(graph *Graph) {// 访问标记数组 初始化为false[默认]:都未访问visited := make([]bool, graph.n)// 暂存队列(用切片模拟)queue := make([]int, 0)// 访问到的点数量var count int// 连通分量数var num intfmt.Println("连通分量路径:")// 遍历每一个顶点for i := 0; i < graph.n; i++ {// 如果没有访问// 一般在一个visit中就可以遍历完整个连通图,条件不满足的原因是图是一个非连通图// 准备一个path存放路径path := make([]int, 0)// 优化减少循环次数if count == graph.n {break}if!visited[i] {// 先清空队列,避免之前连通分量遗留的顶点干扰当前遍历queue = queue[:0]// 将当前访问的节点位置加入队列queue = append(queue, i)visited[i] = truecount++// 访问path = append(path, graph.vex[i].data)// 找当前层所有点的其他邻接点(遍历队列)for len(queue) > 0 {// 取出队列的第一个点vex := queue[0]queue = queue[1:]for j := 0; j < graph.n; j++ {if graph.edge[vex][j] == 1 && !visited[j] {// 进入队列,进入(逻辑上的)下一层queue = append(queue, j)// 访问新入队的邻接点path = append(path, graph.vex[j].data)visited[j] = truecount++}}}}// 有连通分量打印if len(path) != 0 {num++fmt.Println(path)}}if num == 1 {fmt.Println("该图是连通图")} else {fmt.Println("该图不是连通图")}
}// 基本思想:从起点开始并加入path,拿着当前节点去遍历其邻接点,有邻接点就加入path,并标记,相等的时候就直接打印path;找不到就回溯,去掉标记,继续搜索
func PrintSimplePath(graph *Graph, start, end int) []int {// 用于存储所有找到的路径(如果要找所有路径时启用,初始注释掉下面这行来实现只找一条路径并打印的功能)// var allPaths [][]intvar path []intvisited := make([]bool, graph.n)var dfs func(int) booldfs = func(current int) bool {// 标记当前节点visited[current] = truepath = append(path, graph.vex[current].data)// 找到终点,直接返回trueif current == end {// 如果只找一条路径,直接打印// fmt.Println(path)// 如果要找所有路径,将当前路径加入到allPaths中// allPaths = append(allPaths, append([]int{}, path...))return true}// 遍历当前节点的所有邻接点for i := 0; i < graph.n; i++ {// 邻接点未被访问过,且存在邻接边if!visited[i] && graph.edge[current][i] == 1 {// 邻接点未被访问过,就继续搜索if dfs(i) {return true}}}// 回溯,移除当前节点path = path[:len(path)-1]visited[current] = falsereturn false}dfs(start)// 如果只找一条路径,无需返回值(直接打印了),如果要找所有路径,返回收集的所有路径// return allPathsreturn path
}// 输入寻路的数据
func SearchPath(graph *Graph) {fmt.Println("请输入起始顶点:")var start intfmt.Scan(&start)fmt.Println("请输入终止顶点:")var end intfmt.Scan(&end)startvex := SearchVex(graph.vex, start)endvex := SearchVex(graph.vex, end)startid := startvex.idendid := endvex.id// 基于上面的函数, 这里求两点之间的简单路径并打印出来path := PrintSimplePath(graph, startid, endid)if len(path) == 0 {fmt.Println("从输入的起始顶点到终止顶点之间不存在路径")return}fmt.Println("从输入的起始顶点到终止顶点之间存在路径,路径为:")fmt.Println(path)
}// 计算顶点的度数(一律看作有向图)
func CaculateDegree(graph *Graph) {edge := graph.edgesumdb := make([]int, graph.n)for i := 0;i < graph.n; i++{// 拿到点,将这行和这列的数字加和sum := 0// 加行hang := 0for j := 0; j < graph.n; j++ {hang += edge[i][j]}// 加列lie := 0for j := 0; j < graph.n; j++ {lie += edge[j][i]}// 加和sum = hang + liesumdb[i] = sum}for i := 0; i < graph.n; i++ {fmt.Println("顶点", graph.vex[i].data, "的度数为:", sumdb[i])}
}//----------------------------------------------------------------------------// ----------------------------邻接表表示的图--------------------------------// 复习:邻接表的存储结构:总的list是一个数组,每个元素是data和邻接节点链表的指针// 节点定义
type Node struct {data intnext *Node// 可以直接存储一个visited值,这样直接就判断是否被访问过:node.visited == true就是被访问过// 或者可以像邻接矩阵一样,用一个visited数组来存储是否被访问过,但是要加id属性
}// 邻接表表示的图(List)
type GraphList struct {datas[] int        // 顶点数据nodes []*Node  // 邻接节点列表n int       // 邻接节点个数m int       // 边数
}func CreateGraphList() *GraphList {// 目的:创建一个邻接表表示的图,返回一个邻接表表示的图graph := new(GraphList)// 填充邻接表fmt.Println("请输入顶点数:")var n intfmt.Scan(&n)var m intfmt.Println("请输入边数:")fmt.Scan(&m)graph.n = ngraph.m = mdatas := make([]int, n)nodes := make([]*Node, n)for i := 0; i < n; i++ {fmt.Println("请输入第", i+1, "个顶点的数据:")var data intfmt.Scan(&data)datas[i] = data}graph.datas = datas// 点和边分开进行填充fmt.Println("请输入边的关系:")for i := 0; i < m; i++ {var start, end intfmt.Scan(&start, &end)// 输入的是值data,要找到元素,需要遍历定位// 先考虑start有效性startIndex := GetIndex(graph, start)if startIndex == -1 {fmt.Println("输入的起始顶点不存在,请重新输入合法的起始顶点")continue}// 再考虑end有效性+end的位置endIndex := GetIndex(graph, end)if endIndex == -1 {fmt.Println("输入的终止顶点不存在,请重新输入合法的终止顶点")continue}// 添加节点:nodes[startIndex]相当于单链表头指针if nodes[startIndex] == nil {// 如果起始顶点邻接链表为空,则直接添加节点newNode := CreateListNode(end)nodes[startIndex] = newNode} else {// 如果起始顶点邻接链表不为空,则找到最后一个节点,添加新的节点cur := nodes[startIndex]for cur.next != nil {cur = cur.next}newNode := CreateListNode(end)cur.next = newNode}}// 返回邻接表graph.nodes = nodesreturn graph
}func PrintGraphList(graph *GraphList) {// 打印邻接表fmt.Println("邻接表为:")for i := 0; i < graph.n; i++ {fmt.Print(graph.datas[i], ":")node := graph.nodes[i]for node != nil {fmt.Print(node.data, " ")node = node.next}}
}// 通过数据找到邻接表中的索引
func GetIndex(graph *GraphList,data int)int{for i := 0; i < len(graph.datas); i++ {if graph.datas[i] == data {return i}}return -1
}func CreateListNode(data int) *Node {node := new(Node)node.data = datanode.next = nilreturn node
}// 基于邻接表的图进行深度优先搜索
func DFSList(graph *GraphList) {visited = make([]bool, graph.n)// 遍历每一个顶点,对满足条件的顶点进行深度优先搜索// 条件:顶点未被访问for i := 0; i < graph.n; i++ {if !visited[i] {// 传入图和顶点位置dfsList(graph, i)}}
}func dfsList(graph *GraphList,index int){// 找当前点的邻接点(遍历当前点的邻接链表) + 未被访问curNode := graph.nodes[index]fmt.Printf("%d ", graph.datas[index])visited[index] = truefor curNode != nil {// 找到邻接点curNode = curNode.nextif curNode != nil{newIndex := GetIndex(graph,curNode.data)if !visited[newIndex] {dfsList(graph, newIndex)}}}
}func BFSList(graph *GraphList) {visited := make([]bool, graph.n)queue := make([]int, 0)for i := 0; i < graph.n; i++ {if!visited[i] {// 未访问,加入队列中,这里加入的是顶点的索引queue = append(queue, i)visited[i] = true// 访问并输出当前顶点数据(只输出一次)fmt.Printf("%d ", graph.datas[i])for len(queue) > 0 {// 取出队列的第一个点(索引)nodeindex := queue[0]queue = queue[1:]// 找当前点的邻接点(遍历当前点的邻接链表) + 未被访问curNode := graph.nodes[nodeindex]for curNode!= nil {newIndex := GetIndex(graph, curNode.data)if!visited[newIndex] {// 邻接顶点未被访问,加入队列,标记为已访问,并输出其数据queue = append(queue, newIndex)visited[newIndex] = truefmt.Printf("%d ", graph.datas[newIndex])}curNode = curNode.next}}}}
}// 判断图是否连通,打印连通分量
func PrintSomeListByBFS(graph *GraphList) {visited := make([]bool, graph.n)queue := make([]int, 0)components := make([][]int, 0)for i := 0; i < graph.n; i++ {path := make([]int, 0)if!visited[i] {// 未访问,加入队列中,这里加入的是顶点的索引queue = append(queue, i)visited[i] = true// 访问并输出当前顶点数据(只输出一次)path = append(path, graph.datas[i])for len(queue) > 0 {// 取出队列的第一个点(索引)nodeindex := queue[0]queue = queue[1:]// 找当前点的邻接点(遍历当前点的邻接链表) + 未被访问curNode := graph.nodes[nodeindex]for curNode!= nil {newIndex := GetIndex(graph, curNode.data)if!visited[newIndex] {// 邻接顶点未被访问,加入队列,标记为已访问,并输出其数据queue = append(queue, newIndex)visited[newIndex] = truepath = append(path, graph.datas[newIndex])}curNode = curNode.next}}}if len(path) > 0 {components = append(components, path)}}fmt.Println("连通分量为:")for _, path := range components {fmt.Println(path)}if len(components) == 1 {fmt.Println("图是连通图")} else {fmt.Println("图不是连通图")}
}// 判断图中指定两点的简单路径(一条就行)
func FindPathList(graph *GraphList){fmt.Println("请输入要查找的起始顶点:")var start intfmt.Scan(&start)fmt.Println("请输入要查找的目标顶点:")var end intfmt.Scan(&end)visited = make([]bool, graph.n)startIndex := GetIndex(graph, start)if startIndex < 0 {// 起始顶点不存在,直接返回return}endIndex := GetIndex(graph, end)if endIndex < 0 {// 目标顶点不存在,直接返回return}// 得到从最底层返回的路径path,ok := dfsFindPath(graph, startIndex, endIndex)if ok{fmt.Println("路径为:", path)}else{fmt.Println("未找到从", start, "到", end, "的简单路径")}
}// 基于dfs的找路
func dfsFindPath(graph *GraphList, curIndex, endIndex int) ([]int, bool) {visited[curIndex] = truepath := make([]int, 0)path = append(path, graph.datas[curIndex])if curIndex == endIndex {return path, true}curNode := graph.nodes[curIndex]for curNode!= nil {nextIndex := GetIndex(graph, curNode.data)if !visited[nextIndex] {subPath, found := dfsFindPath(graph, nextIndex, endIndex)if found {// 返回当前路径和子路径的合并结果return append(path, subPath...), true}}curNode = curNode.next}return nil, false
}// 打印图的各个顶点的度
func PrintListLevel(graph *GraphList) {//1. 邻接表只有出度,如果要算一个顶点的度,需要遍历整个邻接表//2. 可以直接再创建一个逆邻接表,找指定顶点的所有入边,然后求邻接表的出度,再加和degree := make([]int, 0)// 遍历邻接表for i := 0; i < graph.n; i++ {ru_degree := 0chu_degree := 0// 遍历每一个顶点的邻接链表curNode := graph.nodes[i]for curNode!= nil {// 遍历当前顶点的邻接表,计算出度chu_degree++curNode = curNode.next}// 遍历其他点,求入度for j := 0; j < graph.n; j++ {if i != j{curNode := graph.nodes[j]for curNode!= nil {// 遍历当前顶点的邻接表,计算出度if curNode.data == graph.datas[i] {ru_degree++}curNode = curNode.next}}}temp := ru_degree + chu_degreedegree = append(degree, temp)}fmt.Println("顶点及其度数:")for i := 0; i < graph.n; i++ {fmt.Printf("顶点 %d 的度: %d\n", graph.datas[i], degree[i])}
}//--------------------------------------------------------------------------func main() {//------------------------------邻接矩阵测试-------------------------------//// 创建邻接矩阵表示的图n, m, vex,edge := CreateGraph()PrintEdge(edge)// 封装图(邻接矩阵表示的图)graph := Graph{vex: vex, edge: edge, n: n, m: m}// 吸收回车键fmt.Scanln()// 调用深度优先搜索fmt.Println("深度优先搜索结果(邻接矩阵):")DFSTraverse(&graph)fmt.Println()// 调用广度优先搜索fmt.Println("广度优先搜索结果(邻接矩阵):")BFSTraverse(&graph)fmt.Println()// 判断图是否为连通图,打印其连通分量BFSTraverse_judgelinked(&graph)// 搜索两点的简单路径SearchPath(&graph)// 打印度数CaculateDegree(&graph)//-------------------------------邻接表测试------------------------------//// 创建并打印邻接表表示的图graphlist := CreateGraphList()PrintGraphList(graphlist)fmt.Println()// 调用深度优先搜索fmt.Println("深度优先搜索结果(邻接表):")DFSList(graphlist)fmt.Println()// 调用广度优先搜索fmt.Println("广度优先搜索结果(邻接表):")BFSList(graphlist)fmt.Println()// 判断图是否为连通图,打印其连通分量PrintSomeListByBFS(graphlist)// 搜索两点的简单路径FindPathList(graphlist)// 打印图的各个顶点的度PrintListLevel(graphlist)//-----------------------------------------------------------------------////总结://深度优先:遍历点集,访问当前点,再访问其邻接点,直到无法访问,再返回上一层,再访问其邻接点,直到无法访问,再返回上一层,直到所有点都被访问完//广度优先:遍历点集,访问当前点(访问+入栈),从队列中取出每一个点找他的邻接点,直到队列为空//打印连通分量:直接改造广度优先遍历,记录所有连通分量( 个人觉得广度优先的改造更容易 )//搜索两点的简单路径(一条):直接改造深度优先遍历(dfs),记录路径,直到找到目标点,返回路径(个人觉得深度优先的改造更容易)//打印图中各顶点的度:直接根据存储结构的不同去特殊计算}

上面代码的最后,我结合邻接矩阵和邻接表的特点,对图的操作做了一个简单的方法总结,如果对你有用,请点个赞?收个藏?或者加个关注?

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

flex布局容易忽略的角色作用

目录 清除浮动 作用于行内元素 flex-basis宽度 案例一&#xff1a; 案例二&#xff1a; 案例三&#xff1a; flex-grow设置权重 案例一&#xff1a; 案例二&#xff1a; 简写flex-grow:1 0 auto; flex作为一维布局,行和列的使用&#xff0c;忽略的小角色&#xff0c;大…

javascript-svg-在圆环上拖动并选中区域

目录 问题描述解决思路代码结构 问题描述 假设我某个页面上使用了<svg>&#xff0c;其中包括一个<circle>。我希望实现的是&#xff1a;在circle上点击某个位置后&#xff0c;拖动&#xff0c;出现圆弧状阴影。实现效果为&#xff1a; 解决思路 要实现这个效果…

Android 使用 Canvas 和 Paint 实现圆形图片

学习笔记 效果展示: 全部代码: public class YuanActivity extends AppCompatActivity {private ActivityYuanBinding binding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过 DataBinding 获取布局文件binding …

python怎么将字母大写

Python中有三种将字母转换为大写的方法&#xff1a;upper()、capitalize()、title()。 下面通过实例给大家介绍具体用法&#xff1a; str "www.php.com" print(str.upper()) # 把所有字符中的小写字母转换成大写字母 print(str.lower()) # 把所有字…

鸿蒙Next星河版高级用例之网络请求和自适应布局以及响应式布局

目录&#xff1a; 1、发起网络请求的两种方式第一种使用httpRequest发送http的请求&#xff1a;1.1、在进行网络请求前&#xff0c;您需要在module.json5文件中申明网络访问权限1.2、GET 请求1.3、POST请求1.4、处理响应的结果第二种使用axios发送http的请求&#xff1a;1.1、在…

ClouderaManager 集群搭建

前提&#xff1a;服务器之前做过域名映射、免密登录 ClouderaManager 集群 1. 组件分布规划 服务器服务器h1zk、hdfs(dn)、yarn(nm)、spark、kafka、flumeh2hdfs(nn-standy)、yarn(rm-active)、sparkh3hdfs(nn-active)、yarn(rm-standy)、hive、sparkh4zk、hdfs(dn)、yarn(n…

如何获取谷歌新闻API密钥?

在信息获取和新闻传播领域&#xff0c;快速获取最新的新闻动态至关重要。谷歌新闻API为开发者提供了强大的工具&#xff0c;能够方便地集成全球各类新闻内容。通过使用该API&#xff0c;开发者可以实现对新闻的实时访问和管理&#xff0c;为用户提供丰富的信息服务。本文将指导…

IP 协议

IP协议 一、介绍1、IP协议2、IPv43、IPv6 二、主要功能三、协议格式1、示意图2、说明 四、网段划分1、介绍2、目的3、方法4、步骤 五、基于类别的IP地址分配方式1、示意图2、范围 六、CIDR1、介绍2、组成3、优点4、示意图 七、子网掩码1、介绍2、功能3、表示方法4、CIDR表示法5…

数据结构 (23)并查集与等价类划分

一、并查集 并查集&#xff08;Union-Find Set或Disjoint Set&#xff09;是一种数据结构&#xff0c;用于处理一些不相交集合&#xff08;disjoint sets&#xff09;的合并及查询问题。它通常表示为森林&#xff0c;并用数组来实现&#xff08;类似于二叉堆&#xff09;。在并…

Java 【数据结构】 哈希(Hash超详解)HashSetHashMap【神装】

登神长阶 第十神装 HashSet 第十一神装 HashMap 目录 &#x1f454;一.哈希 &#x1f9e5;1.概念 &#x1fa73;2.Object类的hashCode()方法: &#x1f45a;3.String类的哈希码: &#x1f460;4.注意事项: &#x1f3b7;二.哈希桶 &#x1fa97;1.哈希桶原理 &#x…

lyapunov指数的绘制

有如下方程&#xff1a; %% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)绘制其对应的lyapunov指数。 MATLAB实现方式&#xff1a; clc; clearvars; close all;%% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)%% 代码 N 1000; a (0:0.001:1.4); b 0.3; na length(a…

LearnOpenGL学习(高级OpenGL -- 深度测试,模板测试,)

深度测试 深度缓冲用来防止被阻挡的面渲染到其他面的前面&#xff0c;深度缓冲就像颜色缓冲&#xff0c;在每个片段中储存了信息&#xff0c; 当深度测试(Depth Testing)被启用的时候&#xff0c;OpenGL会将一个片段的深度值与深度缓冲的内容进行对比。OpenGL会执行一个深度测…

【CSP CCF记录】202305-2第30次认证 矩阵运算

题目 样例输入 3 2 1 2 3 4 5 6 10 10 -20 -20 30 30 6 5 4 3 2 1 4 0 -5 样例输出 480 240 0 0 -2200 -1100 思路 我的初步想法是按照题目所给计算顺序&#xff0c;分为三步计算&#xff0c;即&#xff1a; 1. &#xff0c;时间复杂度为 2. &#xff0c;时间复杂度为 3.&a…

Tomcat,javaweb, servlet , springBoot

在server.xml里配置服务器 <scope>provided</scope>打包的时候&#xff0c;这个jar包不会被打进去&#xff0c;因为tomcat已将封装了这个jar包&#xff0c;没必要要这个

书生实战营第四期-进阶岛第一关-探索 InternLM 模型能力边界

任务一: InternThinker 挑战 Leetcode Leetcode题目链接 Prompt InternThinker 回答截图 Q1 仅含置位位的最小整数 - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 n。 返回 大于等于 n 且二进制表示仅包含 置位 位…

[SAP ABAP] ALV基础开发

ALV全称为SAP List Viewer&#xff0c;是SAP中常用的报表输出格式&#xff0c;输出结果以行和列展示&#xff0c;集成的功能有排序&#xff0c;求和&#xff0c;过滤&#xff0c;隐藏&#xff0c;筛选等功能 ALV格式的数据是以单元格为单位显示&#xff0c;这种方式便于数据导…

360全向触觉型灵巧手 Allegro Hand V5 亮相,Wonik 机器人助推前沿科技前行

在机器人技术持续演进的当下&#xff0c;Wonik Robotics 依靠自身技术实力&#xff0c;推出了新一代机器人手 Allegro Hand V5&#xff0c;为工业与科研领域带来新机遇。 Allegro Hand V5 具备诸多出色特性。 Allegro Hand V5 指尖配备的全方位触觉传感器是一大亮点&#xff0…

python 装饰器学习与实践

目录 装饰器学习1、最基本装饰器2、函数带参数的装饰器3、装饰器带参数4、类中函数的装饰器5、装饰器实践6、pyqt5类中方法的装饰器实现时遇到的问题 装饰器学习 先假定一个场景 在之前的一篇文章中&#xff0c;分享了一个pyqt5将日志实时展示在gui界面上的功能python在pyqt5l…

12.4深度学习_模型优化和迁移_awanb、tb

一、数据获取方法 1. 开源数据集 ​ 免费&#xff0c;成本低 PyTorch&#xff1a; https://pytorch.org/vision/stable/datasets.html 开源数据集imagenet&#xff1a;https://image-net.org/ Hugging Face数据集&#xff1a;https://huggingface.co/datasets kaggle数据集…

网络基础知识

172.16.24.100这个是ip地址&#xff0c;讲师机的IP地址。IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。每台电脑只要联网都会有ip地址。ip地址数量有限&#xff0c;不够给世界上每一台电脑分配ip地址&#xff0…