精华内容
下载资源
问答
  • 2021-01-14 03:47:31

    惯例先说锁。

    第一张图是防盗门锁体。24*240,单主舌,斜舌防插。图片的单主舌偏小,要么不常用,要么P错了。反锁旋钮是四方杆,不是薄片插孔。和主流五舌锁体差别仅仅差在防插斜舌,单主舌大小,反锁旋钮孔这几个地方。应该是通用的,适合普通AB锁芯。主流锁体如下图。锁体型号:德兰TF002

    第二张图是个像是题主自己拆下来的,这个锁体和上图防盗门五舌锁体是完全不同的。上图是入户防盗门锁的锁体,这是室内木门锁体。专业点的叫法,叫做“小50铜锁体”。详细尺寸如下图锁舌侧板长度125mm

    锁可以拆成这种样子,肯定是锁舌不能正常伸出。因为如果是无法开门,或者出现反锁后的故障,题主是没有机会把锁体拆成这样的。

    我的建议:锁体拆成这样就别想着装回去了

    1,配件可能蹦丢了‘

    2,配件全,你自己装不上

    3 你找锁匠装,锁匠装上要花半个小时,收你多钱?

    4 就算有人帮你装好了,还能用吗?你忘了他是怎么坏的了?

    你那个锁是温州造的,配置是小50铜锁体,铝合金面板,锁芯估计是铝体单开小68一字,不贵,在任何地方买零售价格都不会超过100元,当然安装你要自己动手。买个新的吧。花不了多少钱,但是需要你去找。配木门锁要注意的地方很多,都是要精确到毫米的尺寸,一个不对,就有可能要改门。还有就是,想找一个和你旧锁款式一样,尺寸一样的锁很难,除非你还记得旧锁在哪里买的,他家还有老货没卖出去。

    值得注意的是,现在的市场上销售的木门执手锁,大部分都是轴承的小50,大50.安装尺寸和从前这种不带轴承的一样或者略大,但是轴承锁体锁舌较大,安装好了,锁舌无法进入门框,还需要换一个配套的门框片。

    最后,我赌32元,你门上的款式是我下面图片的这种:

    更多相关内容
  • 图结构 非常得类似我们之前讲到过的树结构,但前者没有很多的...在数学的概念中,后者是前者的种,不过在数据结构中我们还是认为两者有所区别,尽管如此,我们在学习图结构的时候仍可以稍微借鉴一下树结构的思想。

    本系列文章【数据结构与算法】所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接

    图结构 非常得类似我们之前讲到过的树结构,但前者没有很多的从属关系,更多的是各个数据之间的相关联系。在数学的概念中,后者是前者的一种,不过在数据结构中我们还是认为两者有所区别,尽管如此,我们在学习图结构的时候仍可以稍微借鉴一下树结构的思想

    这里放上之前树结构的文章地址,没看过的小伙伴可以查阅一下:

    【数据结构与算法】详解什么是树结构,并用代码手动实现一个二叉查找树

    接下来让我们来一起学习一下图结构吧

    在这里插入图片描述

    • 公众号:前端印象
    • 不定时有送书活动,记得关注~
    • 关注后回复对应文字领取:【面试题】、【前端必看电子书】、【数据结构与算法完整代码】、【前端技术交流群】

    一、什么是图结构

    是由顶点的集合和边的集合组成的。

    在我们的身边有很多用到图结构的地方,例如地铁线路图

    在这里插入图片描述
    地铁线路图中每一个站点都可以看成一个顶点,而连接着每个站点的线路可以看作是

    其中是可以有方向的。例如从 站点1站点2 是可以的,但是反过来 站点2站点1 是不可以的,那么此时就说 顶点1顶点2 之间的边是有方向的,方向为 顶点1 -> 顶点2

    二、图结构的术语

    文章开头说过,图结构与树结构有很多的相似之处,因此我们还是要先来介绍一些下文会提到的图结构中的术语

    术语含义
    顶点图中的某个结点
    顶点之间连线
    相邻顶点由同一条边连接在一起的顶点
    一个顶点的相邻顶点个数
    简单路径由一个顶点到另一个顶点的路线,且没有重复经过顶点
    回路第一个顶点和最后一个顶点的相同的路径
    无向图图中所有的边都没有方向
    有向图图中所有的边都有方向
    无权图图中的边没有权重值
    有权图图中的边带有一定的权重值

    我们再来看个图的例子,借此来更详细地介绍一下每个术语地含义,如图

    在这里插入图片描述
    该图为某某县地村落分布图,我们可以把其看成是一个图结构,其中每个村看成是一个顶点,每两个村之间可能通了一条路方便来往,例如 A村和D村之间就有一条路线1,我们称之为

    邻村表示只需要经过一条边就可以到达另一个村,那么我们就说这两个村互为邻村,也可以称它们互为相邻顶点。每个村都会有一个甚至多个邻村,例如D村的邻村有 A村 、C村 、F村,此时我们就说顶点D(D村)的为3

    假设有一天,你要从A村前往E村,你选择的路线是这样的,如图所示
    在这里插入图片描述
    途中我们经过了 顶点A顶点C顶点E ,没有重复经过某个顶点,因此我们称这条路线为简单路径

    此时,若你选择的路线是这样的,如图所示

    在这里插入图片描述
    途中经过两次 顶点C ,此时我们就不能称这条路线为简单路径了

    到了晚上,你准备起身回家,但选择经过B村再回家,那么此时你一整天的路线是这样的,如图所示
    在这里插入图片描述
    因为你当前的出发点和结束点都是A村(顶点A),因此这样的路线我们称之为回路

    第二天,你接到一个任务,尽快将一个包裹送往E村,为了节省时间,你查阅资料获取到了各条路的长度,如图所示

    在这里插入图片描述
    此时的图结构上每条边就带上了权重值,我们称这个图为有权图

    通过计算,最后选择了 A村 -> C村 -> E村 这条路线,等到包裹送到E村以后,你正准备原路返回,但发现来时的路都是单向的,现在不允许走这条路回去了,于是你又查阅资料,查看这个县各条路的方向情况,结果如图所示

    在这里插入图片描述
    此时的图结构上每条边都有一定的方向,我们称这个图为有向图

    最后你选择了 E村 -> B村 -> A村 这条路线成功回到了家

    三、图的表示

    上面我们在介绍图的时候,都是用一个形象的图片来讲解的,但在程序中,这样的表达方式显然不是我们想要的,因此我们要找到别的方式来表示结构

    图结构的常见的两个表达方式: 邻接矩阵邻接表

    (1)邻接矩阵

    顾名思义,邻接矩阵就像数学中的矩阵,我们只不过是借此来表示图结构,如图所示,现在有一个这样的图结构

    在这里插入图片描述

    很明显,该图为无向图,那么我们用矩阵的形式来表示它就如下图
    在这里插入图片描述
    图中的 0 表示该顶点无法通向另一个顶点,相反 1 就表示该顶点能通向另一个顶点

    先来看第一行,该行对应的是顶点A,那我们就拿顶点A与其它点一一对应,发现顶点A除了不能通向顶点D和自身,可以通向其它任何一个的顶点

    因为该图为无向图,因此顶点A如果能通向另一个顶点,那么这个顶点也一定能通向顶点A,所以这个顶点对应顶点A的也应该是 1

    为了大家更好的理解,我根据这个邻接矩阵,重新还原了一幅正确的图结构出来,如下面这张动图所示:

    在这里插入图片描述
    虽然我们确实用邻接矩阵表示了图结构,但是它有一个致命的缺点,那就是矩阵中存在着大量的0,这在程序中会占据大量的内存。此时我们思考一下,0就是表示没有,没有为什么还要写,所以我们来看一下第二种表示图结构的方法,它就很好的解决了邻接矩阵的缺陷

    (2)邻接表

    邻接表 是由每个顶点以及它的相邻顶点组成的

    还是使用刚才上面的那个例子,如图

    在这里插入图片描述
    那么此时我们的邻接表就是这样的,如下图

    在这里插入图片描述

    图中最左侧红色的表示各个顶点,它们对应的那一行存储着与它相关联的顶点

    因此,我们可以看出:

    • 顶点A 与 顶点B顶点C顶点E 相关联
    • 顶点B 与 顶点A 相关联
    • 顶点C 与 顶点A顶点D顶点E 相关联
    • 顶点D 与 顶点C 相关联
    • 顶点E 与 顶点A顶点C 相关联

    为了大家更好的理解,我根据这个邻接表,重新还原了一幅正确的图结构出来,如下面这张动图所示:

    在这里插入图片描述
    我们在文章末尾封装图结构时,也会用到这种表示方法

    四、遍历搜索

    在图结构中,存在着两种遍历搜索的方式,分别是 广度优先搜索深度优先搜索

    在介绍这两种搜索方式前,我们先来看一个例子

    在这里插入图片描述
    这是一个吃金币的小游戏,从入口开始,进去吃掉所到所有的金币,但是要尽可能少得走重复的路

    首先我们可以把它简化成我们学习的图结构,如图

    在这里插入图片描述
    接下来我们就根据这个图结构来介绍两种遍历搜索方式

    (1)广度优先搜索

    广度优先搜索 就是从第一个顶点开始,尝试访问尽可能靠近它的顶点,即先访问最靠近它的所有顶点,再访问第二靠近它的所有顶点,以此类推,直到访问完所有的顶点

    概念比较抽象,我们就拿上面的例子来说,如图所示

    在这里插入图片描述
    第一次先搜索离 顶点1 最近的两个顶点,即 顶点2顶点7

    然后再搜索离 顶点1 第二近的所有顶点,也就是离 顶点2顶点7 最近的所有顶点,如图所示
    在这里插入图片描述
    由图可知,离顶点2 最近的顶点为 顶点3顶点5 ,离 顶点7 最近的顶点为 顶点8 ,因此这几个点以此被遍历

    再继续往下搜索离 顶点1 第三近的所有顶点,也就是离 顶点3顶点5顶点8 最近的所有顶点,搜索过程如图所示
    在这里插入图片描述
    由图可知,离 顶点3 最近的顶点有 顶点6 ;离 顶点5 最近的顶点有 顶点4 ;离 顶点8 最近的顶点有 顶点9,因此它们也逐一被遍历

    到此为止,整个图结构就已经被遍历完成了,这就是一个广度优先搜索完整的过程

    (2)深度优先搜索

    深度优先搜索 就是从一个顶点开始,沿着一条路径一直搜索,直到到达该路径的最后一个结点,然后回退到之前经过但未搜索过的路径继续搜索,直到所有路径和结点都被搜索完毕

    同样的,概念比较抽象,我们来用上面的例子模拟一遍深度优先搜索,如图所示

    先随便沿着一条路径一直搜索,图中路径为 1 -> 2 -> 3 -> 6 -> 9 -> 8 -> 5 -> 4

    在这里插入图片描述

    当搜索到 顶点4 时,发现查找不到未被访问的顶点了,因此 顶点4 就是这条路径的最后一个顶点,此时我们要往后倒退,找寻别的每搜索过的路径

    此时发现当往后退到 顶点8 时,有一条路径上还有未被搜索过的顶点,即 8 -> 7 ,如图所示
    在这里插入图片描述

    沿着这条路径一直找到了最后一个顶点—— 顶点7,此时我们要继续往后退,看看还有没有别的路径没走过并且有未搜索过的顶点,但此时发现所有顶点都被访问过了,因此一个完整的深度优先搜索就完成了

    五、图结构的方法

    在封装图结构之前,我们先来了解一下图结构都由哪些方法,如下表所示

    方法含义
    addVertex()添加顶点
    addEdge()添加边
    toString()展示邻接表
    breadthFirstSearch()广度优先搜索
    depthFirstSearch()深度优先搜索

    六、用代码实现图结构

    前提:

    1. 我们封装的图结构中,存储边的方式用到的是我们上文提到的邻接表
    2. 封装的图结构面向的都是无权无向图

    (1)创建一个构造函数

    首先创建一个大的构造函数,用于存放二叉查找树的一些属性和方法。

    function Graph() {
        // 属性
        this.vertexes = []
        this.edges = {}
    }
    

    因为图结构是由顶点的集合和边的集合构成的,因此我们想要设定两个属性 vertexesedges ,分别存储着所有的顶点 、所有的边

    其中,属性 edges 是初始化了一个空对象。

    假设我们先新添加一个 顶点A ,那么我们除了在属性 vertexes 中存储一下该顶点信息,我们还要为 顶点A 在属性 edges 中创建一个键值对,键为 顶点A ,值是一个空数组,用于存放之后它的相邻顶点,如图所示

    在这里插入图片描述
    然后我们又新添加一个 顶点B ,并且设定 顶点A顶点B 为相邻顶点,那么此时的属性 edges 是这样的

    在这里插入图片描述
    此时可以很明显的看出,顶点A顶点B 相关联,即它们之间有一条边,它们互为相邻顶点

    (2)实现addVertex()方法

    addVertex() 方法就是将一个顶点添加到图结构中。该方法需要传入一个参数 v 用于表示顶点信息

    实现思路:

    1. 将新添加的顶点 v 添加到属性 vertexes
    2. 在属性 edges 中为顶点 v 创建一个数组空间,用于存放与其相关的边的信息

    我们来看一下代码

    function Graph() {
        // 属性
        this.vertexes = []
        this.edges = {}
    
    	// 方法
        // 添加顶点
        Graph.prototype.addVertex = function(v) {
            this.vertexes.push(v)
            this.edges[v] = []
        }
    }
    

    我们来使用一下该方法

    let graph = new Graph()
    
    graph.addVertex(3)
    graph.addVertex(9)
    graph.addVertex(5)
    

    我们来看一下我们定义的两个属性是什么样的,如图所示

    在这里插入图片描述

    在这里插入图片描述
    此时的各个顶点之间是没有任何的边的,等我们后面封装好了添加边的方法以后,再回头来看一下

    (3)实现addEdge()方法

    addEdge() 方法用于向图结构中添加边。该方法需要传入两个参数,即 v1v2,分别代表两个顶点

    实现思路:

    1. 找到属性 edges 中的 v1,为其添加一个相邻顶点 v1
    2. 同时找到属性 edges 中的 v2,为其添加一个相邻顶点 v1

    我们来看一下代码

    function Graph() {
        // 属性
        this.vertexes = []
        this.edges = {}
    
    	// 方法
        // 添加边
        Graph.prototype.addEdge = function(v1, v2) {
            this.edges[v1].push(v2)
            this.edges[v2].push(v1)
        }
    }
    

    现在我们来使用一下该方法

    let graph = new Graph()
    
    // 向图结构
    graph.addVertex(3)
    graph.addVertex(9)
    graph.addVertex(5)
    
    // 为顶点添加边
    // 在顶点3 和 顶点9 之间添加一条边
    graph.addEdge(3, 9)
    // 在顶点3 和 顶点5 之间添加一条边
    graph.addEdge(3, 5)
    // 在顶点5 和 顶点9 之间添加一条边
    graph.addEdge(5, 9)
    

    我们来看一下我们定义的两个属性是什么样的,如图所示
    在这里插入图片描述
    在这里插入图片描述
    此时的图结构是这样的

    在这里插入图片描述

    (4)实现toString()方法

    toString() 方法是用字符串的形式来向我们展示邻接表。该方法无需传入参数

    我们先来看一下我们最终需要的展示效果是如何的,如图

    在这里插入图片描述
    其实就是依次展示了每个顶点的所有相邻顶点

    实现思路:

    1. 创建一个字符串 str
    2. 遍历属性 vertexes,获取到每个顶点
    3. 每获取到一个顶点时,添加到 str 中,然后从属性 edges 中找到存放该顶点的相邻顶点的数组,然后遍历该数组,将所有相邻顶点添加到 str
    4. 最终返回 str

    我们直接来看一下代码

    function Graph() {
        // 属性
        this.vertexes = []
        this.edges = {}
    
    	// 方法
        // 展示邻接表
        Graph.prototype.toString = function() {
        	// 1. 创建字符串,用于存放数据
            let string = ''
            
            // 2. 遍历所有顶点
            for(let i in this.vertexes) {
    			
    			// 2.1 获取遍历到的顶点
                let vertex = this.vertexes[i]
    			
    			// 2.2 将遍历到的顶点添加到字符串中
                string += `${vertex} => `
                
                // 2.3 获取存储该顶点所有的相邻顶点的数组
                let edges = this.edges[vertex]
    
    			// 2.4 遍历该顶点所有的相邻顶点
                for(let i in edges) {
                	// 2.4.1 将遍历到的相邻顶点添加到字符串中
                    string += `${edges[i]} `
                }
                // 2.5 换行
                string += '\n'
            }
    		
    		// 3. 返回最终结果
            return string
        }
    }
    

    我们来使用一下该方法,为了方便,这里仍用上面的例子

    let graph = new Graph()
    
    // 向图结构
    graph.addVertex(3)
    graph.addVertex(9)
    graph.addVertex(5)
    
    // 为顶点添加边
    graph.addEdge(3, 9)
    graph.addEdge(3, 5)
    graph.addEdge(5, 9)
    
    // 获取邻接表
    console.log(graph.toString())
    /* 返回结果为:
    				3 => 9 5 
    				9 => 3 5 
    				5 => 3 9 
    */
    

    核对了一下,结果时正确的

    (5)实现initColor()方法(内部方法)

    在封装 breadthFirstSearch()方法和 depthFirstSearch() 方法之前,我们要额外封装一个 initColor()方法,这里要用到一个思想,但上面在介绍广度优先搜索和深度优先搜索时没有提到,这里我们来了解一下

    无论是在进行广度优先搜索还是深度优先搜索时,我们搜索顶点的时候,会频繁地重复搜索到某些顶点,那么我们就要用一种方式,使被搜索过的顶点不再被重复搜索一次。这种方法就是给每个顶点一个颜色标记,没有被搜索过的顶点被标记白色,被搜索过的顶点被标记黑色

    我们就拿一个简单的广度优先搜索的例子,来感受一下该方法的作用

    首先是广度优先搜索的例子,如图所示

    在这里插入图片描述
    首先我们从 顶点A 开始搜索,先依次遍历其所有的相邻顶点有 顶点B顶点C

    然后接着分别遍历 顶点B顶点C 的所有相邻顶点,其中 顶点B 的所有相邻顶点有 顶点A顶点C顶点D顶点C 的所有相邻顶点有 顶点A顶点B顶点D ,我们就按上述顺序依次遍历。此时我们可以发现,当遍历 顶点B 的相邻顶点时,会搜索到 顶点A,但是 顶点A 是我们一开始就搜索过的,因此不应该重复遍历。

    同样的,当遍历完 顶点B 的相邻顶点以后,在遍历 顶点C 的相邻顶点时,我们会发现其所有的相邻顶点之前都已经搜索过了,现在不应该重复遍历了。

    所以我们来看一下使用了颜色标记以后的搜索过程吧

    首先遍历到初始顶点——顶点A,此时我们给它标记黑色

    在这里插入图片描述
    接着遍历 顶点A 所有的相邻顶点,即 顶点B顶点C,并将它们都标记为黑色

    在这里插入图片描述
    最后,我们要遍历 顶点B顶点C 所有的相邻顶点

    先遍历 顶点B 的相邻顶点,分别是 顶点A顶点C顶点D,我们通过颜色辨认得知 顶点A顶点C 都为黑色,表示已经被搜索过了,所以无需重复遍历它们,此时只有 顶点D 不为黑色,所以我们搜索到了 顶点D,并将其标记为黑色

    在这里插入图片描述
    接着我们要遍历 顶点C 的相邻顶点,分别为 顶点A顶点B顶点D,但我们此时通过颜色辨认发现,所有的相邻顶点都被搜索过了,因此无需重复遍历这些顶点了。

    这样一个完美的广度优先搜索就完成了。

    因此,我们需要封装一个颜色初始化的函数,用于将所有顶点的颜色都初始化为白色,并将颜色信息存放在一个对象中,返回该对象用于别的函数

    我们来看一下代码

    function Graph() {
        // 属性
        this.vertexes = []
        this.edges = {}
    
    	// 方法
        // 顶点颜色初始化(内部函数)
        Graph.prototype.initColor = function() {
            // 1. 创建对象,存放颜色信息
            let color = {}
            
            // 2. 遍历所有顶点,将其颜色初始化为白色
            for(let i in this.vertexes) {
                color[this.vertexes[i]] = 'white'
            }
    		
    		// 3. 返回颜色对象
            return color       
        }
    }
    

    该方法的使用我们会在后续使用到,这里就不做演示了

    (6)实现breadthFirstSearch()方法

    breadthFirstSearch() 方法是对图结构进行广度优先搜索。该方法接收两个参数,第一个参数为初始顶点,即从哪个顶点开始搜索;第二个参数接收一个回调函数 handle 作为参数,用于在搜索过程中进行一些操作

    在上文多次介绍了广度优先搜索,其实这是一种基于队列来搜索顶点的方式

    注: 这里我就把我之前文章中封装的队列构造函数直接拿来使用了,如果想看队列的各个方法的实现过程的小伙伴可以点击下面跳转链接进行查看

    【数据结构与算法】详解什么是队列,并用代码手动实现一个队列结构

    实现思路:

    1. 先将所有的顶点颜色初始化为白色
    2. 从给定的第一个顶点开始搜索,即将第一个顶点添加到队列中,并将第一个顶点标记为黑色
    3. 从队列中取出一个顶点,查找该顶点的未被访问过的相邻顶点,将其添加到队列的队尾位置,并将这些顶点标记未黑色,表示也被访问过
    4. 执行我们的回调函数 handle,将该顶点作为参数传入
    5. 一直循环 步骤3 ~ 步骤4 ,直到队列为空

    我们来看一下具体的代码

    function Graph() {
        // 属性
        this.vertexes = []
        this.edges = {}
    
    	// 已经封装好的队列构造函数
    	function Queue() {
    	    this.list = []
    	
    	    //入队列
    	    Queue.prototype.enqueue = function (e) {
    	        this.list.push(e)
    	    }
    	    //出队列
    	    Queue.prototype.dequeue = function () {
    	        return this.list.shift()
    	    }
    	    //判断队列是否为空
    	    Queue.prototype.isEmpty = function() {
    	        if(this.list.length === 0) {
    	            return true
    	        }
    	        else {
    	            return false
    	        }
    	    }
    	    //返回队列中元素个数
    	    Queue.prototype.size = function () {
    	        return this.list.length
    	    }
    	    //返回队列中的第一个元素
    	    Queue.prototype.front = function () {
    	        return this.list[0]
    	    }
    	    //返回当前队列
    	    Queue.prototype.toString = function () {
    	        let string = ''
    	        for(let i in this.list) {
    	            string += `${this.list[i]} `
    	        }
    	        return string
    	    }
    	}
    
    	// 方法
        // 顶点颜色初始化(内部函数)
        Graph.prototype.initColor = function() {
            // 1. 创建对象,存放颜色信息
            let color = {}
            
            // 2. 遍历所有顶点,将其颜色初始化为白色
            for(let i in this.vertexes) {
                color[this.vertexes[i]] = 'white'
            }
    		
    		// 3. 返回颜色对象
            return color       
        }
    
    	// 广度优先搜索
        Graph.prototype.breadthFirstSearch = function(firstVertex, handle) {
            // 1. 初始化所有顶点颜色
            const color = this.initColor()
            
            // 2. 新建一个队列
            const queue = new Queue()
            
            // 3. 将第一个顶点加入队列
            queue.enqueue(firstVertex)
    
            // 4. 开始广度优先搜索
            while(!queue.isEmpty()) {
    
                // 4.1 从队列中取出一个顶点
                let vertex = queue.dequeue()
    
                // 4.2 获取与该顶点相关的其他顶点
                let otherVertexes = this.edges[vertex]
    
                // 4.3 将该顶点设为黑色,表示已被访问过,防止后面重复访问
                color[vertex] = 'black'
    
                // 4.4 遍历与该顶点相关的其它顶点
                for(let i in otherVertexes) {
    
                    // 4.4.1 获取与该顶点相关的顶点
                    let item = otherVertexes[i]
    
                    // 4.4.1 若未被访问,则加入到队列中
                    if(color[item] === 'white') {
                        color[item] = 'black'
                        queue.enqueue(item)
                    }
                }
    
                // 4.5 执行我们的回调函数
                handle(vertex)
            }     
        }
    }
    

    我们来使用一下该方法吧,为了方便检查函数的正确性,我们之前介绍到的吃金币的例子,并且回调函数 handle 用来打印一下访问到的顶点

    这里我直接把正确的访问顺序图放在这里,方便大家下面核对结果是否正确
    在这里插入图片描述

    let graph = new Graph()
    
    graph.addVertex(1)
    graph.addVertex(2)
    graph.addVertex(3)
    graph.addVertex(4)
    graph.addVertex(5)
    graph.addVertex(6)
    graph.addVertex(7)
    graph.addVertex(8)
    graph.addVertex(9)
    
    graph.addEdge(1, 2)
    graph.addEdge(1, 7)
    graph.addEdge(2, 3)
    graph.addEdge(2, 5)
    graph.addEdge(3, 2)
    graph.addEdge(3, 6)
    graph.addEdge(4, 5)
    graph.addEdge(5, 4)
    graph.addEdge(5, 2)
    graph.addEdge(5, 8)
    graph.addEdge(6, 3)
    graph.addEdge(6, 9)
    graph.addEdge(7, 1)
    graph.addEdge(7, 8)
    graph.addEdge(8, 5)
    graph.addEdge(8, 7)
    graph.addEdge(8, 9)
    graph.addEdge(9, 6)
    graph.addEdge(9, 8)
    
    // 广度优先搜索
    graph.breadthFirstSearch(1, function(vertex) {
    	// 打印访问到的顶点
    	console.log(vertex)
    })
    /* 打印结果:
    			1
    			2
    			7
    			3
    			5
    			8
    			6
    			4
    			9
    */
    

    把打印的结果和图片核对以后发现结果是一致的,因此这个方法是没有问题的

    (7)实现depthFirstSearch()方法

    depthFirstSearch() 方法是对图结构进行深度优先搜索。该方法接收两个参数,第一个参数为初始顶点,即从哪个顶点开始搜索;第二个参数接收一个回调函数 handle 作为参数,用于在搜索过程中进行一些操作

    在上文多次介绍了深度优先搜索,其实这是一种基于来搜索顶点的方式,我们也直到其实递归也是利用栈结构的思路实现的,因此我们这里封装该方法时就不把之前封装好的栈结构拿来使用了,直接利用递归实现,正好递归也能把代码变得简洁点

    因此首先我们要封装一个递归调用的主体函数,方法名为 depthVisit,该方法接收三个参数,第一个参数为搜索的顶点;第二个参数为存储顶点颜色信息的对象;第三个参数为回调函数,实现思路如下

    depthVisit()方法的实现思路:

    1. 从给定的顶点开始搜索,将其标记为黑色,表示已被访问过
    2. 执行我们的回调函数 handle,将该顶点作为参数传入
    3. 遍历该顶点的所有相邻顶点,若相邻顶点为黑色,则表示已被访问过,就不做任何处理
    4. 若相邻顶点为白色,则表示未被访问,于是就再次调用 breadthFirstSearch()方法,将该顶点作为第一个参数

    再来简单说一下 depthFirstSearch() 方法的实现思路

    depthFirstSearch()方法的实现思路:

    1. 将所有顶点的颜色初始化为白色
    2. 选择一个顶点作为深度优先搜索的第一个顶点,调用 depthVisit()方法,并将该顶点作为该方法的第一个参数

    接下来我们来看一下具体的代码吧

    function Graph() {
        // 属性
        this.vertexes = []
        this.edges = {}
    
    	// 方法
        // 顶点颜色初始化(内部函数)
        Graph.prototype.initColor = function() {
            // 1. 创建对象,存放颜色信息
            let color = {}
            
            // 2. 遍历所有顶点,将其颜色初始化为白色
            for(let i in this.vertexes) {
                color[this.vertexes[i]] = 'white'
            }
    		
    		// 3. 返回颜色对象
            return color       
        }
    	
    	// 深度优先搜索
        Graph.prototype.depthFirstSearch = function(firstVertex, handle) {
            // 1. 初始化所有顶点颜色
            const color = this.initColor()
    
            // 2. 开始递归访问各个顶点
            this.depthVisit(firstVertex, color, handle)
        }
    
        // 深度优先搜索的递归访问(内部函数)
        Graph.prototype.depthVisit = function(vertex, color, handle) {
            // 1. 先将访问到的顶点颜色设为黑色,防止后面重复访问
            color[vertex] = 'black'
    
            // 2. 执行回调函数
            handle(vertex)
    
            // 3. 获取与该顶点相关的其它顶点
            let otherVertexes = this.edges[vertex]
    
            // 4. 遍历所有相关的顶点
            for(let i in otherVertexes) {
                let item = otherVertexes[i]
                // 4.1 访问没有被访问过的相邻顶点
                if(color[item] === 'white') {
                    this.depthVisit(item, color, handle)
                }
            }
    
        }
    	
    }
    

    同样的,我们也用上文将到的吃金币例子中的深度优先搜索的结果图来验证我们方法的正确性,图片如下

    在这里插入图片描述

    let graph = new Graph()
    
    graph.addVertex(1)
    graph.addVertex(2)
    graph.addVertex(3)
    graph.addVertex(4)
    graph.addVertex(5)
    graph.addVertex(6)
    graph.addVertex(7)
    graph.addVertex(8)
    graph.addVertex(9)
    
    graph.addEdge(1, 2)
    graph.addEdge(1, 7)
    graph.addEdge(2, 3)
    graph.addEdge(2, 5)
    graph.addEdge(3, 2)
    graph.addEdge(3, 6)
    graph.addEdge(4, 5)
    graph.addEdge(5, 4)
    graph.addEdge(5, 2)
    graph.addEdge(5, 8)
    graph.addEdge(6, 3)
    graph.addEdge(6, 9)
    graph.addEdge(7, 1)
    graph.addEdge(7, 8)
    graph.addEdge(8, 5)
    graph.addEdge(8, 7)
    graph.addEdge(8, 9)
    graph.addEdge(9, 6)
    graph.addEdge(9, 8)
    
    // 深度优先搜索
    graph.depthFirstSearch(1, function(vertex) {
    	// 打印访问到的顶点
    	console.log(vertex)
    })
    /* 打印结果:
    			1
    			2
    			3
    			6
    			9
    			8
    			5
    			4
    			7
    */
    

    把打印的结果和图片核对以后发现结果是一致的,因此这个方法是没有问题的

    七、结束语

    图结构的讲解就到这里了,希望大家对图结构有了更深一层的理解。到此为止,我的【数据结构与算法】专栏中的数据结构部分已经结束了,接下来准备开始讲解排序算法了,下一篇文章为基本排序算法,顺便会在文中介绍一下大O表示法

    大家可以关注我,之后我还会一直更新别的数据结构与算法的文章来供大家学习,并且我会把这些文章放到【数据结构与算法】这个专栏里,供大家学习使用。

    然后大家可以关注一下我的微信公众号:前端印象,等这个专栏的文章完结以后,我会把每种数据结构和算法的笔记放到公众号上,大家可以去那获取。

    或者也可以去我的github上获取完整代码,欢迎大家点个Star

    我是Lpyexplore,创作不易,喜欢的加个关注,点个收藏,给个赞~ 带你们在Python爬虫的过程中学习Web前端

    展开全文
  • 目录.bat 16.1单元结构平面图 16.770结构平面图 4.9-13.3单元结构平面图 local_LIST.TXT 基础平面图及细部构造 屋面结构平面图 ...砖混住宅楼结构图.dwg 首层单元结构平面图及构造 马牙槎示意图.bmp
  • 步骤一、首先确定CAD结构图中房子的方向,一般情况下,如果图纸中没有标注方向,那么我们很难辨别房子的方向,方向的标注,主要是为了在设计时考虑采光的问题,所以我们最好在图中加一个方向的标注,如图做这样一个...

    CAD结构图怎么画?对于很多房屋设计来说,进行CAD结构图的绘制是开始设计的第一步。本期,模型云为您带来了CAD结构图的绘制方法,如果您还不了解的话,就来和我们一起看看吧!

    CAD结构图怎么画?

    步骤一、首先确定CAD结构图中房子的方向,一般情况下,如果图纸中没有标注方向,那么我们很难辨别房子的方向,方向的标注,主要是为了在设计时考虑采光的问题,所以我们最好在图中加一个方向的标注,如图做这样一个标志,标出南的方向。如图。

    步骤二、绘制CAD结构图房子的改造部分标示,一般情况下,应房主的要求,会在房子的结构中加一些墙,也就是原来结构中没有的部分,我们需要在图纸中标注出来。如图所示,可以做这样一个标志。

    步骤三、门窗部分的CAD结构图怎么画?我们在设计门窗部分的时候,要考虑到门的开启方向,做成什么门合适,比如是平开门还是推拉门等,在做图的时候也可以单独新建一个图层,专门做门窗,并给它一个颜色。如图所示。

    步骤四、文本框打印输出CAD结构图的比例设置,首先,点击布局1,在这里,我们假设输出A4纸大小,绘制一个280*200的矩形,并偏移5个,做一个图框,如图所示。

    步骤五、选择菜单栏中的布局--视口,矩形工具,为输出来添加一个CAD结构图视口。如图所示。

    步骤六、选中后,在刚才绘制的矩形中,从左上角的内角点点一下,再到右下角内角点确定它的范围,如图所示。

    步骤七、设置好视口后,在视口上双击进去,右下角的部门,有一个视口比例,可以设置一下CAD结构图的输出比例,当然也可以自定义一个输出比例。如图所示。选择一个合适的比例后的结果图。

    绘制CAD结构图的注意事项

    原始结构的依据是现场量房得出的精确尺寸,在量房的过程中这些数据是必须精确的测量出来的,每面墙的宽度、厚度,门的高度和宽度,窗户的长宽高以及窗户下沿儿距离地面的距离,房梁的位置以及房梁下掉的高度,卫生间地漏的位置、马桶下水的位置,厨房烟道的位置和下水的位置等等。确保这些尺侧是精确的,才能够保证CAD结构图会指出来是精准的。

    在实际的图纸操作中,CAD结构图的外围墙厚度都是按照承重墙的厚度来处理的。选择内侧墙体直线,执行【偏移(O)】距离【240mm】的操作,如图所示。注意在【偏移(O)】直线的过程中,每个方向上的内侧墙体线偏移一次就可以了。

    以上就是模型云为您带来的CAD结构图的绘制方法了,希望本期的分享能够给您带来一定的帮助。

    展开全文
  • 功能结构图就是按照功能的从属关系画成的图表,在该图表中的每一个框都称为一个功能模块。功能模块可以根据具体情况分得大一点或小一点,分解得最小功能模块可以是一个程序中的每个处理过程,而较大的功能模块则可能...

    一、功能结构图

    1定义

    功能结构图就是按照功能的从属关系画成的图表,在该图表中的每一个框都称为一个功能模块。功能模块可以根据具体情况分得大一点或小一点,分解得最小功能模块可以是一个程序中的每个处理过程,而较大的功能模块则可能是完成某一个任务的一组程序。(百度定义)用通俗的话来说,功能结构图就是以功能模块为类别,介绍模块下其各功能组成的图表。

    2作用

    1. 产品概念设计的运用工具之一,能够对不完全确定的设计问题或相当模糊的设计要求,以一种较为简洁和明确的方法表示。在绘制的过程中,能够帮助PM思考并清晰产品的功能模块及其功能组成;
    2. 梳理需求,以鸟瞰的方式对整个产品页面中的功能结构形成一个直观的认识,防止在产品需求转化为功能需求的过程中出现功能模块和功能点缺失的现象。

    3注意事项

    在区分功能结构、信息结构图、结构图前,有一个重要的前提需要大家达成共识:软件产品本身就是传递信息和提供功能的载体,完全绝对的信息类或功能类产品是不可能存的在,信息往往伴随着功能,我们很难划一条界限将两者彻底分开。从某种意义上,信息传递甚至就是软件产品最主要的核心功能。鉴于此,通常我们默认地把信息展示功能独立了出来,作为信息架构的一部分去思考,在产品功能结构时不考虑信息展示功能。

    这里举一个信息与功能纠缠的例子更好理解,如微信的个人信息模块(如下图),“名字”字段在这里既是信息又提供着修改设置的功能。

     

    所以我们不难理解许多功能结构图中出现了信息结构的要素,但由于功能结构图的使用目的(即上文中的作用)要求我们专注于产品功能这个维度,在功能结构图中我们最好尽量减少信息结构要素出现的可能性。

    就用上面功能与信息纠缠的例子来说,在其功能结构图中许多朋友会直接用“名字”来表示其功能点,画图人可能本人清楚,但看图人就会产生疑惑:这个“名字”到底是指提供可查看名字的功能还是可查看并修改名字的功能。

    在这里介绍一个小诀窍,形容一个功能点时建议多采用“动词+名词”的语言描述形式,这种方式不仅信息传达更加准确而且可以避免读者不必要的困惑。如上面的例子中我们就可以把“名字”改为“设置名字”或“查看并设置名字”来描述功能点。

    4如何绘制功能结构图

    在实际应用时,产品功能结构图通常在以下2种情况下绘制:

    • 对未完成的产品在设计阶段绘制,确定产品功能结构;
    • 对已完成的某个版本的产品绘制,用于分析并传递该产品的功能结构;

    (一)在产品的设计阶段,如何挖掘并确定功能结构图中的主功能模块呢?

    首先主功能模块应该是产品在完整业务流程中的各个核心功能模块,我们可通过业务流程中所涉及到的功能需求去提炼出主功能模块,提炼完成后再通过业务流程走查一次,看是否有遗漏的主功能模块。

    举个例子,假设我们参与了微信的早期功能设计,其产品初期定位是一款移动社交软件,那么其对应的核心业务可以简化为

    这样我们就很容易得出产品设计阶段微信的主功能模块,如下:

    结合下面现有版本的微信功能结构图对比一下,经过上百次迭代,其主功能结构几乎没有发生变化,我们不得不佩服其功能结构的拓展性;

    当通过业务流程将主功能模块确定下来后,再根据业务需求对其进行功能的详细设计即可,在此就不再展开了。

    2.对于已确定产品来说如何绘制功能结构图呢?

    对一款已确定产品绘制功能结构图,最快捷的方法便是参考产品的Tab功能模块找出产品主功能模块,然后按照层级归属关系详叙该功能模块提供的下一级功能模块或功能,如有必要,其颗粒度可一直细化到功能操作的描述程度。

    那上图“微信功能结构图(V6.5.21)”的主功能模块为什么不是“微信”、“通讯录”、“发现”、“我”这四大标签功能模块?

    在这里作者希望传达一个概念,结构图中的主功能模块不一定就是Tab中的标签功能模块,许多时候产品受限于移动端的空间限制,不得不把功能分为3到4个Tab中,这是一种务实的妥协。当然正常情况下以Tab标签名作为主功能模块的做法没有错,只是当产品功能复杂时,产品功能结构图采用这种划分有点粗糙。而绘制已确定产品的功能结构图能够帮助我们去挖掘这个产品的核心功能模块,梳理产品的功能架构。我们建议作图人可以尝试脱离Tab标签用自己的语言去挖掘并描述主功能模块。

    这样说来我们就可以随意将标签功能模块中的次级功能模块划分出来作为主功能模块吗?

    其实也不是,一款不管多复杂的应用其主功能模块的划分数量都不能太多(5-9个为佳),一般情况下当对产品功能结构进行分析后,我们仍然会采用Tab功能模块作为主功能模块然后对其下属的功能模块进行整理。只有当我们认为某个次级功能模块在业务上太过重要且产品价值较高时,我们才可以将其划分出来作为一个单独的主功能模块。

    这里介绍一个小秘诀,当一个次级功能模块反复出现在不同的Tab功能模块中的时候,我们就可以考虑将其拆分出来作为主功能模块,因为这个时候意味着这个次级功能模块在产品的业务流程中来说十分重要,而且这也可以让我们的产品功能结构图更加简洁清楚。如上面“微信功能结构图(V6.5.21)”中的搜索模块就同时出现在了Tab中的微信功能模块和通讯录功能模块。

    最后如何确定功能结构图中的颗粒度呢?

    功能结构图中的颗粒程度需要根据具体应用场景来定,由画图人根据需要自行把控即可比如说在产品设计的过程中,功能结构的建立是设计者的设计思维由发散趋向于收敛的过程,刚开始的颗粒度一般比较大,可能仅涉及到某个功能模块,随着设计的不断推进,功能结构图的颗粒度会不断细化,最终可以拆分至某个具体的功能操作。这里作者将“微信模块-个人对话”功能模块作了细化,仅供参考:

     二、信息结构图

    1、定义

    指脱离产品的实际页面,将产品的数据抽象出来,组合分类的图表。

    2、作用

    1. 帮助PM梳理复杂内容的信息组成,避免信息内容在展示过程中出现遗漏、混乱、重复;
    2. 作为开发工程师建立数据库的参考依据;

    信息结构图的绘制通常晚于功能结构图,往往是在产品设计阶段的概念化过程中,在产品功能框架已确定、功能结构已完善好的情况下才对产品信息结构进行分析设计。

    在这里,我们需要强调的是脱离实际页面这个概念,在一些产品相关文章中,我们会看到作者将信息结构图完全按照页面的逻辑顺序来进行分类组合,严格意义上来说,这种图表不是一份合格的信息结构图。

    我们用微信的个人信息模块举例,如下图所示:

    其结构信息图在这部分的绘制就需要脱离产品的实际页面,如下:

    最后需要强调的是:信息结构图主要适用于产品信息构成比较复杂需要考虑优化的情况,如内容型产品(博客、web门户网站等),产品的信息结构对于用户体验就十分重要,需要用信息结构图作为工具进行分析思考。

    这里作者简单绘制了一下微信的信息结构图作为参考

    三、结构图

    相较于功能结构图和信息结构图,产品结构图的定义就很混乱和模糊了,为什么会出现这种情况呢?

    一方面产品结构图从文字理解上来说就容易让人困惑:产品信息结构图、产品功能结构图不都可以简称为产品结构图嘛。

    另一方面现有网上流传的竞品分析文档、产品体验文档、PRD文档有不少是由产品新人模仿前辈流传出来的文档模板来写的。但让人尴尬的是,有部分同学没有进行细致深入地了解。经常在一篇文章中,前面说是产品的功能结构图,结果图中是产品功能有,产品信息要素也有,没有理解功能结构图的定义。而后来的初学者又从这些文章中去了解学习产品功能结构图、产品信息结构图,导致恶性循环;

    最重要的原因是:对于产品结构图,产品从业人员这个群体自身都还没有达成共识啊。作者在网上搜了搜相关文章,对于产品结构图大家的主要理解有3种:

    • 大部分产品人认为:产品结构图即产品功能结构图的简称,可能在产品没有强调信息结构的概念时,有部分PM开始简称产品功能结构图为产品结构图,之后便默认了这种称呼,当出现产品信息结构图后,概念就产生了混淆;
    • 一部分产品人认为:产品结构图是综合展示产品信息和功能逻辑的图表;
    • 少部分产品人认为:产品结构图就是产品信息架构图。

    在这里,作者更认同第2种观念:

    产品结构图是综合展示产品信息和功能逻辑的图表,简单说产品结构图就是产品原型的简化表达。它能够在前期的需求评审中或其他类似场景中作为产品原型的替代,因为产品结构图相较于产品原型,其实现成本低,能够快速对产品功能结构进行增、删、改操作,减少PM在这个过程中的实现成本。

    产品结构图就是通过信息架构设计,将功能和信息以一种合理自然的逻辑,把功能结构图和信息结构图中的内容放入产品中的每一个页面的结果。而现在许多PRD、竞品分析中提到的信息结构图、功能结构图其实大多数都是同时含有功能和信息元素的简化版产品结构图。如下图所示:

    总结

    在一款产品的设计过程中,功能结构图是必须的,信息结构图视产品和PM自身而定,通常我们初步确定了产品功能结构图(产品功能框架)之后才开始绘制产品信息结构图。

    在产品设计流程中,产品功能结构图是产品概念化阶段的初期输出,产品结构图是产品概念化的尾期阶段输出物,当产品结构图完成后,我们对产品的基本模样在心理就有了一个轮廓。同时以产品结构图作为绘制原型的依据,可以避免我们在产品设计中边画边改,跳进死掐细节,不见森林的陷阱。

    展开全文
  • MATLAB绘制一个Simulink结构图的基本步骤

    万次阅读 多人点赞 2018-10-29 19:12:51
    绘制单位负反馈阶跃响应的Simulink结构图 1、在菜单栏找到Simulink,单击打开 2、在弹出窗口点击新建空模型 3、在弹出窗口打开library browser 4、在模块库中搜索找到所需模块阶跃信号发生器(Step)、示...
  • 笔记本内部硬件构造图

    千次阅读 2021-07-24 03:32:41
    笔记本电脑作为我们日常生活中的一个重要的工作学习的工具,已经被大家所熟悉,下面简单解析笔记本内部硬件构造图。笔记本内部硬件构造图笔记本电脑虽然外观上和台式机有着很大的差异,但是内部构造其实相差无几,都...
  • 软件工程:数据流图和结构图怎么画?

    万次阅读 多人点赞 2020-09-01 18:43:03
    文章目录Step 1:根据软件的功能描述,绘制数据流图:Step 2:根据数据流图,分级绘制结构图:•边界划分:•第级分解:•第二级分解:•精化减少耦合: Step 1:根据软件的功能描述,绘制数据流图: 问题表述: ...
  • 防盗门锁锁体内部结构图是什么?

    万次阅读 2020-12-24 00:01:33
    把锁一般有3--5组弹子。3.弹簧:装在外锁芯的圆孔中。顶住弹子。4.锁舌:开锁时伸缩的部分。圆柱形内锁芯转动时带动锁舌。挂锁是带动锁“鼻”。5.钥匙:不必介绍,有不同高度的“锯齿”对应不同长度的弹子。扩展...
  • 模块结构图初涉

    万次阅读 多人点赞 2019-12-07 11:08:05
    模块结构图是用于描述系统模块结构的图形工具,不仅描述了系统的子系统结构与分层的模块结构,还清楚地表示了每个模块的功能 ...数据:当一个模块调用另一个模块时,调用模块可以把数据传送到被调用模块处...
  • //指向下一个表结点的指针 }ArcNode; typedef struct VNode{ char data; //顶点信息 ArcNode * firstarc; //指向第一个表结点的指针 }VNode, AdjList[MVNum]; //AdjList表示邻接表类型 typedef struct{ AdjList ...
  • C++实现一个简单的

    千次阅读 2021-04-25 09:28:17
    如下所示,这是一个简易的图结构: #define UNVISITED 0 #define VISITED 1 #define INFINITY 1000 template <class T> class Edge { public: int start,end; T weight; Edge() { start=0; end=0; ...
  • 电脑主机结构示意

    万次阅读 2021-06-22 21:14:30
    原标题:电脑主机结构示意为电脑主机结构示意: 电脑内部结构有CPU,主板,电源,显卡,硬盘,光驱,内存。内部结构主要的作用为:1.主板:主板是电脑的基本结构骨架,主板就是我们看到的那一些些矩形 电路...
  • 数据流图以及结构图

    万次阅读 2019-01-07 18:03:58
    某大学教学管理系统子系统的功能说明如下: 首先接受学生提交的学生证和申请单,根据学生档案文件检验学生证的有效性和申请单是否填写的正确,如果有误则拒绝,如果无误根据学生的...要求:用结构化方法学对教...
  • 组合结构图

    千次阅读 2017-01-01 23:29:44
    1,组合结构图将每一个类放在一个整体中,从类的内部结构来审视一个类。 2,组合结构图可用于表示一个类的内部结构。 二:主要组成元素  >部件(Part):表示被描述事物所拥有的内部成分。  >连接件...
  • 架构图、流程图、结构图、功能图、逻辑图

    万次阅读 多人点赞 2021-11-15 16:15:47
    我们画的架构图、流程图、结构图、功能图、逻辑图等,都需要好看、好懂、好用、好搞,因为: 好看是为了提升沟通效率, 好懂是为了提升交流共识, 好用是为了提升交付质量, 好搞是为了提升实施速度。 架构图有...
  • 1、眼的形体与结构眼部包括眼眶、眼睑、眼球三部分,眼眶为四边矩方形,内置眼球,双眼并置于脸部同一平面上。眼睑:俗称“眼皮”,它分为上下眼睑包裹在眼球外。眼睑开口处称为“眼裂”,眼裂两端分别为内眦分与外...
  • YOLOv3、YOLOv4、YOLOv5、YOLOx的网络结构图(清晰版)

    万次阅读 多人点赞 2021-09-13 15:54:41
    1. Yolov3网络结构图 2. Yolov4网络结构图 3. Yolov5网络结构图 4. Yolox网络结构图
  • idea查看类层次结构图

    万次阅读 多人点赞 2019-10-28 11:42:11
    分析源码时经常需要看一个类的层次结构 在idea中查看类层次结构的快捷键默认是: Crtl + H 如果快捷键冲突失效,那么可以通过 Navigate -> Type Hierarchy 打开 类层次结构图如下: 类继承关系 导出类层次结构...
  • 软件工程——数据流图转换成软件结构图

    千次阅读 多人点赞 2022-03-24 22:02:45
    目录 1.学生选课 2.求解系统 1.学生选课 数据流图 软件结构图 2.求解系统 数据流图 软件结构图
  • 中央处理器(CPU,Central Processing ...CPU的基本结构CPU一般包括三部分:基板、核心、针脚如,目前的CPU一般就是包括三部分:基板、核心、针脚。其中基板一般为PCB,是核心和针脚的载体。核心和针脚,都是通过...
  • 数据结构(Graph)【详解】

    万次阅读 多人点赞 2021-02-26 17:03:48
    在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和...
  • 数据结构(廿) -- C语言版 -- - 的基本概念

    千次阅读 多人点赞 2020-07-26 20:08:00
    (Graph)是一种较线性表和树更为复杂的数据结构,在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中 ,数据元素之间有着明显的层次关系,并且每一层上的数据元素...
  • 毕业设计——如何画系统功能结构图

    万次阅读 多人点赞 2020-12-08 20:37:41
    文章目录前言、打开Visio二、空缺带 前言 一般软件专业的学生用到工具都是starUML画各种类图、流程图、时序图、活动图、部署图、用例图…画图,...找到组织结构图 二、空缺带 依次将功能连接起来即可。 ...
  • 数据结构图结构的实现

    万次阅读 多人点赞 2018-02-07 19:44:45
    种很重要的数据结构,不解释。
  • 文章目录()数据流的定义:(二)数据流中的主要图形元素及符号(三)如何画数据流(四)数据流的层次结构1. 顶层流2. 底层流(零层)3.中间层流数据流设计原则:分层的数据流(五)实践(六...
  • yolov5s-6.0网络模型结构图

    千次阅读 多人点赞 2022-02-09 13:53:26
    yolov5s-5.0网络模型结构图_zhangdaoliang1的博客-CSDN博客_yolov5s模型结构看了很多yolov5方面的东西,最近需要yolov5得模型结构图,但是网上的最多的是大白老师的,但是大白老师的yolov5得模型结构图不知道是哪个...
  • yolov5s-5.0网络模型结构图

    万次阅读 多人点赞 2022-01-04 13:32:26
    看了很多yolov5方面的东西,最近需要yolov5得模型结构图,但是网上的最多...这模型结构图是用思维导图画出来得。这里面有几点可能与其他人画的不一样。 1、5.0采用的激活函数是SiLU(),不再是LeaKyReLU(),所以这里

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,669,057
精华内容 1,467,622
关键字:

一个网站的结构图

友情链接: CMM.rar