- 博客(86)
- 收藏
- 关注
原创 三层架构(Three-tier Architecture)
通过这种比喻,可以更形象地理解三层架构的含义和各层的职责分工。每一层都有明确的职责,层与层之间通过清晰的接口进行交互,这样不仅能提高系统的可维护性,还能使得每一层都可以独立修改和扩展而不影响其他层。
2024-06-10 12:38:43
451
原创 MAC帧的含义
MAC帧是网络中的一个基本单位,用来传递数据。MAC帧就像是你给朋友写的纸条,但里面有各种信息,比如发送者、接收者以及数据本身。帧头部有个MAC地址,确定谁是收发者,中间是数据载荷,最后是个校验和,确保数据没被篡改。这就像是在数据传输的世界里发短信一样简单。
2024-05-14 18:55:23
1898
1
原创 资源和进程的关系(操作系统)
而进程,则像是一群贪吃的派对客,每个都想分一杯羹。:在多进程环境中,多个进程可能会竞争相同的资源,操作系统必须确保在同一时间内,某资源只被一个进程所使用,或者在访问共享资源时能够正确同步,避免数据不一致或死锁等问题。操作系统的职责之一就是管理这些资源,确保每个进程都能公平、有效地访问所需的资源。在操作系统中,资源可以看作是系统提供的各种硬件和软件设施,例如处理器、内存、磁盘空间和输入输出设备等。每个部分都像是一个热辣的舞步,操作系统得在不让任何进程感到失落的同时,让整个系统的表现尽量光鲜亮丽。
2024-05-10 19:43:06
634
原创 Dijkstra算法
Dijkstra算法,这就像在城市的夜生活中找到最快捷的路线一样,既实用又充满策略!这个算法是由荷兰计算机科学家Edsger Dijkstra发明的,用来找到图中一个节点到其他所有节点的最短路径。它特别适合用在那些包含了权重的图上,比如路线的距离或者花费时间。Dijkstra算法像是城市中的导航系统,总能找到从一点到另一点的最快路径。但记得,老兄,这个算法假设所有的权重都是正值,所以如果你的图中包含负权重的边,那么你可能需要考虑其他算法,比如贝尔曼-福特算法。
2024-05-10 12:06:55
199
原创 拓扑排序——数据结构
拓扑排序的本质是这样的:你有一堆任务或者课程,某些任务必须在其他任务之前完成,就像先去健身再去约会,这样你看起来更加帅气迷人。在拓扑排序中,每个任务或者课程都是图中的一个节点,而某个任务依赖另一个任务的关系,就用有向边来表示。就像精心策划一场约会,了解每一步的逻辑和顺序,才能确保一切按部就班,避免任何尴尬的等待或冲突。拓扑排序是对有向无环图(DAG)的顶点进行线性排序的方法。关键在于每个顶点代表了一个任务,而每条有向边代表了任务间的先后依赖关系。这个排序保证了每个任务只在它依赖的任务完成后才开始。
2024-05-08 12:34:07
379
原创 深度优先搜索
这个过程可以用一个栈(Stack)来帮助记住回溯的位置,每访问一个节点,就把它推入栈中,每回溯一步,就从栈中弹出一个节点。启动时候,它从图的一个节点开始,沿着一条路走到底,直到不能再继续,就像探索一条地下通道一样,达到尽头才停。然后,这货回溯到最近的一个节点,那里还有未探索的路线,继续探索新的分支。想象一下,你在一个复杂的洞穴系统里寻宝,每个分叉路口都可能通向未知的宝藏,DFS 就是你手中的那盏灯,引导你在正确的时候,回到那些未探索的分叉路口,继续你的冒险。图可能包含环,所以一个节点可能会被多次访问。
2024-05-08 12:30:03
343
原创 拓扑是什么意思
在星型拓扑中,每一个设备都有一条单独的连接线直连到中心节点,形成像星星一样的结构,因此得名星型拓扑。而且,如果一个节点出现问题,也不会影响到其他节点,因为每个节点都是独立连接到中心的,这就提高了网络的可靠性。这是因为它们都有一个洞,而拓扑学中只关心洞的数量和它们的布局,而不关心对象的确切形状。总的来说,拓扑是探索形状如何通过连续变形相互关联的一门学科,它的美在于,尽管外形可能天差地别,核心的性质却可能一致。但是,星型拓扑的缺点在于,如果中心节点出现故障,那么整个网络就会瘫痪,因为所有的通信都依赖那个中心。
2024-05-06 20:17:22
754
原创 互斥关系和同步关系
想象一下,两个线程同时修改同一个变量,结果会乱七八糟,对吧?所以,互斥锁或其他机制(如信号量)会用来锁住资源,直到占用它的线程用完为止。这不仅仅是防止同时访问同一资源,而是关于协调线程的执行顺序,确保某些事件按照预定的顺序发生。比如,一个线程需要在另一个线程计算出某些数据后才能执行,这就需要同步。所以说,互斥是确保不会有两个家伙同时在同一个试衣间换衣服,而同步是确保每个人都按顺序进入演出的舞台。这两者都是多线程程序设计中不可或缺的元素,就像舞会上的交际舞步,得步步为营,确保一切都井然有序。
2024-05-03 18:11:54
594
原创 空闲缓冲区(empty) 和 非空缓冲区(full) 的的概念和区别【操作系统 生产者——消费者进程】
相对的,这个也是个计数信号量,但它告诉我们有多少个缓冲区是满的,即里面有数据,等待消费者来取用。如果“empty”信号量是0,意味着没有空的缓冲区,生产者就需要等待,不能继续生产。相似地,如果“full”信号量是0,说明没有满的缓冲区,消费者也需要等待,不能消费数据。这个数是动态变化的,每当生产者往一个缓冲区内放置了数据后,这个“empty”信号量就会减一(因为空的缓冲区少了一个)(而每当消费者从缓冲区中取出数据,这个信号量就会增加,因为又空出来了一个缓冲区。这个信号量的初始值通常是缓冲区的总数。
2024-05-03 18:06:50
877
原创 多道批 单道批处理系统的“批”是什么意思 —— 操作系统
然后,我们再看看“多道批处理”。这样的系统可以让更多的桌子同时得到服务,大大提高了处理的速度和效率。就像是你在酒吧,一边调酒,一边还能调情,手忙脚乱但是风风火火,效率杠杠的。想象一下你在一个热闹的餐厅里工作,那里的“批处理系统”就是你的工作方式了。对于“单道批处理”,就像是你一个服务员,一次只能服务一桌客人。客人点了餐,你把这一桌的订单处理完,再跑下一桌。这种方式简单明了,但效率低下,尤其是在客人多的时候。所以,无论是单道还是多道,关键点就在于任务的处理方式。多道则是多线进行,效率高,能同时处理多个任务。
2024-05-01 19:55:07
123
原创 PCB概念(进程控制块)—— 操作系统(形象解释版)
当操作系统需要指挥这些小跟班干活或者查岗的时候,它就会翻阅这些小本本,确保每个小跟班都在自己的岗位上,没有偷懒也没越界。每当有新的小跟班加入,老板就会赶紧开一本新的小本本,确保能随时掌握他的一举一动。这本小本本里记录了每个小跟班的全貌:他的姓名(进程ID),他现在忙啥(状态,比如是不是正在运行,挂起,还是已经完事了),他住哪儿(内存信息),他的日常工作效率如何(CPU寄存器信息),以及老板给他的地位高低(进程优先级)。所以说,这些小本本,也就是PCB,是操作系统维持秩序、执行任务不可或缺的工具。
2024-05-01 16:37:52
619
原创 ARP模块——计算机网络
在IP网络中,设备之间的数据传输通常需要知道目标设备的物理地址才能进行,而ARP提供了这一转换机制。3. ARP表:设备通常会维护一个ARP表,这是一个缓存列表,存储了网络中其他设备的IP地址与对应的物理地址。1. ARP请求:当一个设备需要向另一个设备发送数据但不知道其物理地址时,它会在本地网络广播一个ARP请求,询问具有特定IP地址的设备的物理地址。2. ARP响应:网络上的设备检查这个ARP请求,如果请求中的IP地址与自己的IP地址匹配,它会发送一个ARP响应,包含自己的物理地址。
2024-04-27 13:08:11
588
原创 IP模块——计算机网络
IP模块在计算机网络中通常指的是处理互联网协议(Internet Protocol,简称IP)的部分,它负责网络中的数据包的发送和接收。2. 分段和重组:由于网络中不同的部分可能有不同的最大传输单元(MTU),IP模块需要将较大的数据包分段以适应较小的MTU,或者在接收端将分段的数据包重组成原始数据。1. 地址化和路由:IP模块使用IP地址来确定数据包的发送和接收位置,并通过路由选择数据包传输的最佳路径。4. 数据包封装:在发送数据前,IP模块将数据封装在IP数据包中,这包括添加IP头部等信息。
2024-04-27 13:05:47
561
1
原创 处理机和CPU的区别
而CPU(Central Processing Unit)是处理机的核心部分,它是计算机系统中的主要计算和控制单元。ALU负责执行算术和逻辑运算,CU负责控制指令的执行和数据的传输,寄存器用于暂时存储数据和指令。处理机(Processor)是指计算机系统中负责执行指令和处理数据的硬件部件,它包括了中央处理器(CPU)、内存、输入输出设备等。处理机是计算机系统的核心组成部分,负责执行计算机程序的指令,控制和协调各个硬件设备的工作。而CPU则是处理机中最重要的组成部分,它负责执行指令和进行数据处理。
2024-04-19 20:14:05
1848
原创 双向冒泡算法(C语言版)
放在函数中间是为了在正向冒泡和反向冒泡之间进行判断,如果在正向冒泡中已经确定数组有序,则可以直接跳出循环,无需继续执行后续的反向冒泡过程。被放在函数中间的原因是为了在正向冒泡和反向冒泡之间进行判断。
2024-04-11 18:46:10
479
原创 二分查找失败 元素插入
循环结束后仍然存在,并且其作用范围延伸到循环结束后的代码块。在许多编程语言中,包括 C、C++、Java 等,循环变量(比如。循环执行完毕后执行的。这两个语句不是分开的,而是在不同的位置。仍然存在,并且其值是循环结束时的值,即。在循环结束后继续存在,你可以在。循环内部执行的,因此它属于。的值会保留为循环结束时的值。的作用范围就会被限制在。因此,在你的代码片段中,
2024-03-18 12:14:41
312
原创 for循环执行到最后 还会执行到最后一次吗(刚刚不满足条件时)
当循环执行到 i 等于 high + 1 时,它会继续执行一次循环体(以i=high+1的条件执行),然后 i 会减一,变为 high,然后循环结束(for循环内部不再执行了因为不满足i>high的条件)。详细分析:当 i 是 n-1 时,循环开始。循环条件是 i > high。循环体内的代码被执行。i-- 操作执行,i 减一。i 的值检查是否大于 high。如果是,继续循环,回到步骤 2。如果不是,循环结束。当 i 的值等于 high + 1 时,循环体内的代码仍然会被执行一次,然后 i-
2024-03-18 12:13:56
596
原创 顺序表和链表的区别
顺序表和链表是两种常见的数据结构,它们在存储和组织数据上有一些关键的区别。存储方式:顺序表: 使用数组(或列表)来存储元素,元素在内存中是连续存储的。这意味着通过索引可以直接访问任何元素。链表: 使用节点来存储元素,每个节点包含数据和一个指向下一个节点的指针。节点在内存中可以是分散的,不要求连续存储。插入和删除操作:顺序表: 在顺序表中,插入和删除元素可能需要移动其他元素,以保持顺序表的连续性。这可能导致较大的时间复杂度,尤其是在插入或删除元素的中间位置时。链表: 插入和删除操作在链表中更为高
2024-03-10 09:22:41
370
原创 二叉树层次建树中的 双结构体(树与辅助队列)
结构体内部的指针用于在树或队列中建立节点之间的关系,从而促使树的构建和遍历。这个成员变量的作用是将辅助队列中的节点与二叉树中的节点进行关联。是一个成员变量,它的作用是存储指向二叉树节点的指针。这是一种常见的做法,为了方便使用和更好的代码可读性使用这样的别名。:这个成员是指向二叉树中节点的指针。这个指针用于将辅助队列中的节点与二叉树中的节点相关联。:这个结构体表示在构建二叉树时使用的辅助队列中的一个节点。类型的指针来操作辅助队列中的节点,包括访问其中的。结构体表示二叉树中的一个节点,包括节点的数据 (
2024-03-07 13:11:25
903
原创 辅助队列结构体(链表) 中定义的树的结构体指针p的具体含义
视为队列结构体中的一个指针,它被利用于指向树节点,确保在队列中能够正确遍历树的层次结构。是队列结构体中能够指向树节点的指针,通过它可以在队列中正确地访问树的层次结构。,能够逐个遍历树的节点,并在每个节点上执行相应的操作,比如插入新节点。它在当前结构体的上下文中被利用,用于连接队列中的不同节点。可以视为队列结构体中的一个指向树节点的指针,类似于链表中的。是用来连接队列中的下一个节点的指针。是队列结构体中的一个指向二叉树节点的指针。是队列中每个节点所对应的树节点的指针,而。指针,指向队列中的下一个节点。
2024-03-06 21:55:01
246
原创 二叉树层次建树
如果队列结构体中没有存储指向树结点的指针,那么就无法追踪最新的树结点,而这对于按顺序构建树结构是很重要的。(辅助队列为了获取新的树的指针 只能由自己的新队列结构体指针指向自己结构体中定义的树指针p来获取)这样做的目的是为了在队列中维护一个顺序,确保新创建的树结点按照输入的顺序被插入到树中。表示当前要插入新结点的位置的树结点的左子树是否为空,用于确定新结点应该插入的位置。表示当前要插入新结点的位置的树结点,而。不是树结点的值,而是指向树结点的指针。的值即为最新创建的树结点的指针,而。分别表示左子树和右子树。
2024-03-05 21:26:15
278
原创 结构体标签和结构体名(链表为例)
在这个上下文中, "tag_t" 用于表示结构体本身,而 "ptag_t" 用于表示指向该结构体的指针。为结构体选择名字的原因可能是任意的,也可能基于代码中使用该结构体的具体上下文。需要注意的是,C 中的命名约定并不是强制性的,开发者在选择类型和变量名字时通常有一定的灵活性。结构体标签是在结构体定义时给结构体起的一个标识符,用于标记这个结构体的类型。是一个辅助队列结点,它的目的是用来构建一个队列,按照输入顺序维护新创建的树结点。是辅助队列的结点类型,它用于维护一个队列,存储了树结点的指针。
2024-03-05 12:59:34
1178
原创 队列循环——C++引用详解【入队元素不引用 出队元素引用】(C语言版)
对于入队操作而言,只需将元素的值复制到队列的数组中,而不需要修改结构体的其他部分。因为元素的插入并没有改变结构体的空间,所以不需要使用引用来传递元素的值。相反,对于出队操作,需要修改结构体中的队头指针等信息,并且需要将出队的元素的值返回给调用者。函数的目的是将一个元素入队,而不需要修改传递给它的元素的实际值。在这个特定的队列实现中,入队操作不需要引用,是因为在入队的过程中,只是往队列的数组中添加一个元素,而并。使用引用允许函数修改。入队操作只需要知道要添加的元素的值即可,而不需要改变传递给函数的实际参数。
2024-03-03 11:56:49
1396
原创 考研408 2019年 第41题 链表代码及其详解(数据结构)
真题代码的三个函数find_middle()、reverse()、merge()的时间复杂度都为O(n/2),主要原因在于它们都是对链表进行遍历的操作,且每次遍历都跳过一些节点,使得实际遍历的节点数量为链表总节点数的一半。综上所述,这三个函数的核心思想是通过巧妙的指针移动和逻辑设计,在遍历链表时跳过一些节点,从而实现对链表的操作,使得时间复杂度都保持在O(n/2)的水平。这种设计有效地减少了遍历的总次数,提高了算法的效率。
2024-03-02 09:20:14
386
原创 函数是否使用结构体C++引用情况说明
在这些情况下,如果希望在函数外部能够感知到头指针的改变,就需要传递头指针的指针或引用,以便在函数内部能够修改外部的头指针。在链表中,头指针通常指向链表的第一个节点,而头节点包含了链表的第一个元素以及指向下一个节点的指针。代码中,虽然链表头节点的位置发生了变化,但头指针仍然指向原始链表的地址,因此不算作头指针的改变。这里,传递的是链表头节点的一个副本,但通过这个副本仍然可以访问和修改链表中的节点。如果链表非空,而你删除了链表的头节点,那么头指针会被更新,指向新的头节点。的内容,但并没有改变链表头指针的指向。
2024-03-01 13:13:11
496
原创 C语言创建结构体时 什么时候需要C++引用 什么情况下下不需要引用
引用是C++中的一种特殊机制,用于更方便地传递参数,但在纯粹的C语言中,你通常会使用指针来达到相同的目的。修改结构体内容:如果在函数中需要修改结构体的内容,并且希望这些修改在调用函数后保持,那么应该传递结构体指针或使用C++的引用。在C语言中,通常会传递指针。上面的例子中,`modifyStruct` 函数接受结构体的指针,通过指针修改了结构体的内容,因此需要传递指针而不是直接的结构体。不修改结构体内容:如果只是需要读取结构体的内容而不修改它,那么不需要使用引用或指针,直接传递结构体即可。
2024-03-01 12:24:31
755
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人