当前位置: 首页 > news >正文

数据结构-栈和队列的应用

目录

  • 前言
  • 一、栈的应用(迷宫问题)
    • 1.1 问题描述
    • 1.2 算法选择
    • 1.3 算法精化
    • 1.4 算法实现
    • 1.5 问题结果
  • 二、队列的应用(农夫过河问题)
    • 2.1 问题描述
    • 2.2 算法选择
    • 2.3 算法精化
    • 2.4 算法实现
    • 2.5 问题结果
  • 总结

前言

本篇文章使用两个例子说明栈和队列的应用,
对于迷宫问题,使用栈实现深度优先策略解决迷宫问题;
对于农夫过河问题,使用队列实现广度优先策略解决农夫过河问题。

一、栈的应用(迷宫问题)

1.1 问题描述

从入口进入迷宫,如何可以尽快找到迷宫的出口?这是一个十分有趣的经典游戏。
迷宫可用如图1.1所示的方块表示,其中每个元素或为通道(以空白方块表示),或为墙(以带阴影的方块表示)。迷宫问题要求的是:从入口到出口的一个以空白方块构成的(无环路径)。
在这里插入图片描述

图1.1 迷宫的图形表示

1.2 算法选择

求解迷宫问题的简单方法是:从入口出发,沿某一方向进行探索,若能走通,则继续往前走;否则沿原路返回,换一方向再进行探索,直到找到了一个出口,或者所有可能的探索都以失败而告终。这类探索方法统称为回溯法,也可以称为深度优先探索方法。实现深度优先探索的工具是栈。
其算法的基本框架如下:

mazeFrame(void)
{创建一个(保存探索过程)空栈;把入口位置压入栈中;while(栈不为空){取栈顶位置并设置为当前位置;while(当前位置存在试探的可能性){取下一试探位置;if(下一位置是出口)打印栈中保存的探索过程然后返回;if(下一位置是通道)把下一位置进栈并且设置为当前位置;}}	
}

1.3 算法精化

在求解程序中,迷宫可用二维数组maze[m][n]表示,其中数组中元素是0表示通道,1表示墙。
入口坐标为(1,1)
出口坐标为(6,9)
在这里插入图片描述

图1.2 迷宫的二维数组表示

为了细化前面的框架,还要考虑试探方向的表示
假设某时刻所在迷宫的位置坐标为(i,j),相邻的四个位置分别标E、S、W、N表示东、南、西、北方向;
为了简化算法,可以建立一个数组direction,这个数组给出了相对于位置(i,j)的4个方向上,i和j的增量值
使用一个变量elem_d表示试探方向,
0-表示方向E
1-表示方向S
2-表示方向W
3-表示方向N
则某个方向的试探位置i和j的变化值为

new_i = i + direction[elem_d][0] (新的行坐标)
new_j = j + direction[elem_d][1] (新的列坐标)例如,当位置坐标为(3,4)时
elem_d = 0 表示试探方向为E
则试探坐标为
new_i = i + direction[0][0] = 3 + 0 = 3
new_j = j + direction[0][1] = 4 + 1  = 5
则新坐标为(3,5)

在这里插入图片描述

图1.3 迷宫中方向的表示

另外,为了避免走到已经试探过的位置(包括现在探索路径上的和曾经在探索路径上的位置),凡是已经探索过的位置都应该做上标记。根据约定,值为1表示墙,0表示通道,那么,凡是探索过的位置可以赋予一个既非0又非1的值,假设取值为2(这样做可以节省空间,缺点是破坏了maze数组的状态;否则要设置一个与迷宫那样大小的数组来保存标记)。一旦将某一位置(i,j)纳入到当前路径中,就将maze[i][j]设置为2。为了记录探索路径中当前位置以及在该位置上的试探方向,算法设置了一个栈,栈中元素包括三项,分别记录当前位置的行坐标、列坐标和以及在该位置上的试探方向。

//栈数据元素类型
struct ElemType {int x;			//行坐标int y;			//列坐标int direction;	//试探方向
};

1.4 算法实现

经过上述设计,求迷宫中一条路径上的算法可以从入口开始,对每个当前位置都从E方向(elem_d = 0)开始试探,若不能通过,则顺时针依次试探S方向、W方向和N方向。当选定一个可以前进的位置,要把当前所在的位置纳入探索路径中,并将当前所在位置以及试探方向记录下来,以便走不通时可以顺序原路一步步回退,每退一步以后接着试探在该位置上的其他未试探过的方向,如此循环,直到找到出口。

/*
int(*maze)[11] 数组指针类型,表示传入迷宫数组
int(*direction)[2] 数组指针类型,表示传入direction数组
int entrance_x  入口行坐标
int entrance_y  入口列坐标
int eixt_x		出口行坐标
int exit_y 		出口纵坐标
*/
void mazePath(int (*maze)[11], int(*direction)[2], int entrance_x, int entrance_y, int exit_x, int exit_y)
{int elem_x = 0;int elem_y = 0;int elem_d = 0;int newDirection_x = 0;int newDirection_y = 0;//初始化栈SeqStack stack = { 0 };initSeqStack(&stack);//初始化入口坐标元素SElemType element = { 0 };maze[entrance_x][entrance_y] = 2; //从入口开始标记element.x = entrance_x;			 element.y = entrance_y;element.direction = -1;		     //未试探任何方向if (!pushSeqStack(&stack, element))	 //将入口点进栈{destroySeqStack(&stack);return;}while (!isEmptySeqStack(&stack))   //走不通时,一步步回退{if (!popSeqStack(&stack, &element))  //获取栈顶元素并出栈{destroySeqStack(&stack);return;}elem_x = element.x;elem_y = element.y;elem_d = element.direction+1;while (elem_d <= 3)  //一次试探一个方向{newDirection_x = elem_x + direction[elem_d][0];newDirection_y = elem_y + direction[elem_d][1];if (newDirection_x == exit_x && newDirection_y == exit_y && maze[newDirection_x][newDirection_y] == 0)//走到出口{element.x = elem_x;element.y = elem_y;element.direction = elem_d;if (!pushSeqStack(&stack, element)){destroySeqStack(&stack);return;}element.x = newDirection_x;element.y = newDirection_y;element.direction = 4;if (!pushSeqStack(&stack, element)){destroySeqStack(&stack);return;}printf("The revers path is:\n"); //打印路径while (!isEmptySeqStack(&stack)){if (!popSeqStack(&stack, &element)){destroySeqStack(&stack);return;}printf("The node is: (%d %d)\n", element.x, element.y);}//销毁栈destroySeqStack(&stack);return;}if (maze[newDirection_x][newDirection_y] == 0) //走到没走过的点{maze[newDirection_x][newDirection_y] = 2;   //标记走过的点element.x = elem_x;element.y = elem_y;element.direction = elem_d;if (!pushSeqStack(&stack, element))  //进栈{destroySeqStack(&stack);return;}elem_x = newDirection_x;  //下一点转换成当前点elem_y = newDirection_y;elem_d = -1;}elem_d++;}}printf("The path has not been found!\n");//销毁栈destroySeqStack(&stack);
}

注意: 顺序栈的代码已经省略

1.5 问题结果

二、队列的应用(农夫过河问题)

2.1 问题描述

一个农夫带着一只狼、一只羊和一颗白菜,身处河的南岸。农夫要把这些东西全部运到河的北岸。问题是农夫只有一条小船,船小到只能容下农夫和一件物品,当然,船只有农夫能撑。另外,因为狼能吃羊,而羊能吃白菜,所以,农夫不能留下羊和狼或者羊和白菜单独在河一边,自己离开。好在狼属于食肉动物,它不吃白菜。请问农夫该采取什么方案,才能将所有的东西安全运过河呢?

2.2 算法选择

求解这个问题的最简单的方法是逐步进行试探。每一步都在前一步选择基础上搜素下一步的所有可能的状态。用计算机实现上述系统搜索过程,可以采用两种不同的策略,一种是广度优先搜索(breadth first);另一种是深度优先搜索(depth first)。实现广度优先搜索的工具是队列;实现深度优先搜索的工具是栈。本节讨论队列的应用,所以重点介绍广度优先搜索策略。
广度优先搜索的思想就是,在搜索过程中,总是首先搜索下面一步的所有可能情况,然后再进一步考虑更后面的各种情况。要实现广度优先搜索,一般都采用队列作为辅助结构,把每一步所有可能达到的状态都列举出来,放在这个队列中,然后顺序取出来分别进行处理,在处理中又再把下一步的情况全部放在队列里。由于队列的操作原则是先进先出,所以,只有在前一步的所有情况都处理完后,才能开始后面一步各情况的处理。
以遍历二叉树为例,使用广度优先搜索策略,进行层序遍历。
在这里插入图片描述

图2.1 广度优先遍历二叉树

2.3 算法精化

要模拟农夫过河问题,首先需要选择一个对问题中每个角色的位置进行描述的方法。一个很方便的方法是用4位二进制数顺序分别表示农夫、狼、白菜和羊的位置。例如,用0表示农夫或某物品在河的南岸,1表示在河的北岸。因此,整数5(其二进制表示为0101)表示农夫和白菜在河的南岸,而狼和羊在北岸。这时,农夫不在,因此狼会把羊吃掉,所以是一种不安全的状态。问题的初始状态是整数0(其二进制为0000);而问题的终结状态是整数15(其二进制表示为1111)。
在这里插入图片描述

图2.2 二进制位置表示图

用整数location表示用上述方法描述的状态,可以用下面的4个函数从上述状态得到每个角色所在位置的代码。函数返回值为真(1)表示农夫或物品的位置在河的北岸,否则在南岸。

//农夫过河问题
//个体判断函数
/*	四位二进制数分别表示农夫,狼,白菜,羊的位置0 表示在南岸  1 表示在北岸初始状态 location = 0000(二进制) 表示农夫,狼,白菜,羊都位于河的南岸使用按位 & 操作,取出每个位置的信息,例如 location & 0x08 取出农夫的位置信息
*///取出农夫位置信息
int farmer(int location)
{return (0 != (location & 0x08));
}//取出狼位置信息
int wolf(int location)
{return (0 != (location & 0x04));
}//取出白菜位置信息
int cabbage(int location)
{return (0 != (location & 0x02));
}//取出羊位置信息
int goat(int location)
{return (0 != (location & 0x01));
}

此外,还应该分析问题中的所有角色构成的状态,确定其中那些状态是安全的,哪些是不安全的。因为,单独留下白菜和羊或单独留下狼和羊在某一岸是不安全的,所以安全状态的判断可以使用下面的函数实现。

//安全状态的判断函数
/*不能单独留下狼和羊,例如 location = 0101 是一种不安全的状态不能单独留下白菜和羊,例如 location = 1100 是一种不安全的转态安全返回 1不安全返回 0
*/int safe(int location)
{//判断羊和白菜是否单独if ((goat(location) == cabbage(location)) && (farmer(location) != goat(location))){return 0;}//判断狼和羊是否单独if ((wolf(location) == goat(location)) && (farmer(location) != goat(location))){return 0;}return 1;   //其他状态安全
}

2.4 算法实现

完成了上面的准备工作后,现在的问题变成:从初始状态二进制0000出发,寻找一种全部由安全状态构成的、能够实现的状态变迁序列(序列中的每状态都可以从前一状态通过农夫带东西划船过河到达),到达最终状态二进制1111.为避免不必要的重复,在序列中不应该出现重复的状态。
根据广度优先搜索的思想,算法中需要使用一个整数队列moveTo,把搜索过程中每一步所有可能到达的状态都保存起来。队列中的每个元素表示可以安全到达的中间状态。
另外,使用一个整数数组rooute记录已被访问过的各个状态,以及已被发现的能够到达这些状态的前驱状态。由于在这个问题中需要列举的所有状态(二进制0000~1111)一共16种,所以route数组只需要使用16个元素。route的每个元素初始化为-1,每当在队列中加入一个新的状态时,就把route中以该状态作下标的元素的值改为达到这个状态的前一转态的下标值。所以数组的第i个元素不仅记录了状态i是否已经被访问过,同时对于以及被访问过的状态,还保存了这个状态的前驱状态下标。算法结束后,可以利用route数组元素的值生成一个正确的路径。
在这里插入图片描述

图2.3 route数组

代码实现如下:

//农夫问题求解/*从初始状态二进制0000出发,寻找一种全部由安全状态构成、能够实现的状态变迁序列(序列中的每个状态都可以从前一状态通过农夫带东西划船过河到达)到达最终的状态1111。为避免不必要的重复,在序列中不应该出现重复的状态整数队列moveTo:把搜索过程中每一步所有可能到达的状态都保存起来。队列中的每个元素表示可以安全到达的中间状态整数数组route:用于记录已被访问过的各个状态,以及已被发现的能够到达这些状态的前驱状态由于在这个问题中需要列举的状态(二进制0000~1111)一共16种,则数组长度大小为16每个数组的元素值初始化为-1每当在队列中加入一个新的状态时,就把route中以该状态做下标的元素的值改为达到这个状态的下标值数组的第i个元素不仅记录状态i是否已被访问过,同时对于已被访问过的状态,还保存了这个状态的前驱状态算法结束后,可以利用route数组元素的值生成一个正确的状态路径
*/void farmerProblem()
{int movers, location, newlocation;int route[16];				//用于记录已考虑的状态路径struct SeqQueue moveTo;		//用于记录可以安全到达的中间状态initSeqQueue(&moveTo);		//初始化队列enSeqQueue(&moveTo, 0x00);	//初始状态二进制0000入队for (int i = 0; i < 16; i++)//初始化数组route{route[i] = -1;}route[0] = 0;while (!isEmptySeqQueue(&moveTo) && (route[15] == -1)){getQElemSeqQueue(&moveTo, &location);	//取出队头状态为当前状态QElemType e;deSeqQueue(&moveTo, &e);//循环值依次表示羊、白菜、狼、农夫的移动情况//movers的值用二进制表示依次为0001(羊)、0010(白菜)、0100(狼)、1000(农夫)for (movers = 1; movers <= 8; movers <<= 1){if ((0 != (location & 0x08)) == (0 != (location & movers))) //农夫与移动的物品在同一岸{// 0x08 | movers 得到的结果表明农夫或物品应该在船上,物品无法单独过河// location ^ (0x08 | movers) 把坐船过河的农夫与物品的状态翻转newlocation = location ^ (0x08 | movers);			//计算新状态if (safe(newlocation) && route[newlocation] == -1)	//新状态安全且未处理{route[newlocation] = location;					//记录旧状态且作为新状态的前驱enSeqQueue(&moveTo, newlocation);				//将新状态入队}}}}if (route[15] != -1){printf("The reverse path is :\n");for (location = 15; location >= 0; location = route[location]){printf("The location is : %d\n", location);if (location == 0){exit(0);}}}else{printf("No solution\n");}
}

注意:这里实现队列的代码已省略,感兴趣可查看文章:https://blog.csdn.net/pyc68/article/details/145093486?spm=1001.2014.3001.5501

算法开始时,把初始状态为0(表明人和物都在南岸)放入队列中。while循环时,只要队列不为空便取出队头元素,for循环用于列举所有可以移动的角色(包括农夫本身,用movers表示),for循环的增量表达式里使用了左移位操作,循环值依次为1、2、4、8,分别表示羊、白菜、狼和农夫的移动情况。由于在每一次移动时,农夫都必须改变状态,所以只有农夫与被移动的东西在同一岸时,农夫才可以将其带走。当然,农夫可以什么都不带,单独过河。将变量movers与二进制0x08进行按位异或运算,所得结果为1,表明相应的农夫或物品应该在船上,再将原有状态与这个结果进行一次按位异或运算,得到移动后的一个新状态。最后检验新状态是否安全,是否未被处理过。如果成立,就确认这个状态转换可行(把这个状态放入队列中,并且修改route数组的值)

2.5 问题结果

图2.4标出了送入队列的各个状态(位置)和广度优先搜索的顺序编号。
通过图2.4得出一条从0000到达1111的路径:
0000-1001:农夫把羊从南岸带到北岸
1001-0001:农夫独自从北岸回到南岸
0001-1011:农夫把白菜从南岸带到北岸
1011-0010:农夫把羊从北岸带回南岸
0010-1110:农夫把狼从南岸带到北岸
1110-0110:农夫独自从北岸回到南岸
0110-1111:农夫把羊从南岸带到北岸

在这里插入图片描述

图2.4 广度优先搜索的结果和顺序图

总结

迷宫问题完整代码: https://gitee.com/PYSpring/data-structure/tree/master/maze_code
农夫过河问题完整代码:https://gitee.com/PYSpring/data-structure/tree/master/queue_code

相关文章:

数据结构-栈和队列的应用

目录 前言一、栈的应用&#xff08;迷宫问题&#xff09;1.1 问题描述1.2 算法选择1.3 算法精化1.4 算法实现1.5 问题结果 二、队列的应用&#xff08;农夫过河问题&#xff09;2.1 问题描述2.2 算法选择2.3 算法精化2.4 算法实现2.5 问题结果 总结 前言 本篇文章使用两个例子…...

【JavaScript】异步编程汇总

异步编程解决方案&#xff1a; 回调函数PromiseGeneratorawait / async 回调函数 回调函数是早期处理异步编程的主要方式&#xff0c;虽然它本身存在很多的缺陷&#xff0c;比如那个时候对于复杂的异步处理常常会出现回调地狱。 但是因为 JavaScript 中当时并没有很好的API来帮…...

【AI系列】从零开始学习大模型GPT (2)- Build a Large Language Model (From Scratch)

前序文章 【AI系列】从零开始学习大模型GPT (1)- Build a Large Language Model (From Scratch) Build a Large Language Model 背景第1章:理解大型语言模型第2章:处理文本数据第3章:编码Attention机制什么是Attention机制?Attention机制的基本原理数学表示应用总结为什么要…...

动态规划——路径问题②

文章目录 931. 下降路径最小和算法原理代码实现 64. 最小路径和算法原理代码实现 174. 地下城游戏算法原理代码实现 931. 下降路径最小和 题目链接&#xff1a;931. 下降路径最小和 算法原理 状态表示&#xff1a; 经验题目要求&#xff1a;dp[i][j]表示到达[i,j]位置时&…...

【每日关注】科技圈重要动态

时代新动态 2025 年 2 月 12 日科技圈重要动态总结全球 AI 治理新进展巴黎 AI 宣言签署&#xff0c;美英缺席 科技巨头合作与竞争苹果联姻阿里开发中国版AI功能DeepSeek生态持续扩展OpenAI拒绝马斯克收购&#xff0c;矛盾公开化 汽车行业动态小米汽车销量跃居新势力第二比亚迪智…...

Postgresql的三种备份方式_postgresql备份

这种方式可以在数据库正在使用的时候进行完整一致的备份&#xff0c;并不阻塞其它用户对数据库的访问。它会产生一个脚本文件&#xff0c;里面包含备份开始时&#xff0c;已创建的各种数据库对象的SQL语句和每个表中的数据。可以使用数据库提供的工具pg_dumpall和pg_dump来进行…...

Linux 配置 MySQL 定时自动备份到另一台服务器

Linux 配置 MySQL 定时自动备份到另一台服务器这里写自定义目录标题 前言1、配置服务器通信1.1&#xff1a;配置过程 2、编写自动备份sh脚本文件3&#xff1a;设置定时自动执行 前言 此方案可使一台服务器上的 MySQL 中的所有数据库每天 0 点自动转储为 .sql 文件&#xff0c;…...

CCF-GESP 等级考试 2024年6月认证C++二级真题解析

2024年6月真题 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 正确答案&#xff1a;C 考察知识点&#xff1a;计算机基础与编程环境 解析&#xff1a;CCF 组织的 GESP 认证考试第 1 级可选择的认证语言有 Scratch、Python、C &#xff0c;共 3 种。答案为C。 …...

vm虚拟机的一些操作命令

PowerShell命令 // 获取虚拟机列表&#xff1a; get-vm // 创建虚拟机&#xff1a; new-vm -Name "BrioDev75" -MemoryStartupBytes 16GB -Path "D:\Hyper-V" // 删除虚拟机&#xff1a; remove-vm -Name "BrioDev75" -Force (-Force参数是…...

sql难点

一、 假设你有一个查询&#xff0c;需要根据 id 是否为 null 来动态生成 SQL 条件&#xff1a; xml复制 <select id"getResources" resultType"Resource">SELECT * FROM resources<where><if test"id ! null">and id <!…...

【多模态大模型】系列1:Transformer Encoder——ViLT、ALBEF、VLMO

目录 1 ViLT2 ALBEF3 VLMO 1 ViLT ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision 图文多模态任务&#xff0c;关键是提取视觉特征和文本特征&#xff0c;然后对齐。在之前的多模态研究工作中&#xff0c;视觉侧通常需要一个目标检测器来…...

2.4 测试数据与初始化

测试数据与初始化 在 Spring Test 中&#xff0c;合理管理测试数据的初始化和清理是保证测试可靠性的关键。本章将介绍多种数据准备方式&#xff0c;涵盖 SQL 脚本执行、编程式初始化 和 动态数据生成&#xff0c;并提供最佳实践示例。 1. 使用 Sql 执行 SQL 脚本 作用 在测…...

DataBase【MySQL基础夯实使用说明(中)】

MySQL数据库 &#x1f3c6;当领导问你忙不忙&#xff0c;您怎么回复&#xff1f; &#x1f514;要让领导知道你很忙&#xff0c;但是你的事情紧急&#xff0c;我可以优先处理&#xff01; 文章目录 MySQL数据库前言一、SQL&#xff08;Structured Query Language&#xff09;1…...

Unity3D Shader 简析:变体与缓存详解

引言 在 Unity3D 中&#xff0c;Shader 是渲染管线的核心部分&#xff0c;负责控制物体的外观和材质表现。Shader 的变体&#xff08;Variants&#xff09;和缓存机制是优化渲染性能的关键。本文将深入探讨 Unity3D 中 Shader 变体的概念、缓存机制以及如何通过代码实现和管理…...

vuex基础介绍

/store/index.js import Vue from vue import Vuex from vuexVue.use(Vuex)/*** 创建并导出一个 Vuex 仓库实例* 仓库是一个存储应用所有状态的容器&#xff0c;并且提供了修改和获取状态的方法*/ export default new Vuex.Store({// state 是一个对象&#xff0c;用于存储应…...

OpenWRT中常说的LuCI是什么——LuCI介绍(一)

我相信每个玩openwrt的小伙伴都或多或少看到过luci这个东西&#xff0c;但luci到底是什么东西&#xff0c;可能还不够清楚&#xff0c;今天就趁机来介绍下&#xff0c;openwrt中的luci&#xff0c;到底是个什么东西。 什么是LuCI&#xff1f; 首先&#xff0c;LuCI是OpenWRT中…...

singleTaskAndroid的Activity启动模式知识点总结

一. 前提知识 1.1. 任务栈知识 二. Activity启动模式的学习 2.1 standard 2.2 singleTop 2.3.singleTask 2.4.singleInstance 引言&#xff1a; Activity作为四大组件之一&#xff0c;也可以说Activity是其中最重要的一个组件&#xff0c;其负责调节APP的视图&#xff…...

DeepSeek-V3 技术报告

1.摘要 为了减少开源模型与闭源模型的能力差距&#xff0c;我们提出了DeepSeek-V3&#xff0c;一个大的混合专家模型&#xff08;Mixture-of-Experts (MoE) &#xff09;&#xff0c;有6710亿参数&#xff0c;每个token会激活370亿参数。 DeepSeek-V3采用多头隐注意力&#xf…...

Vue 3 30天精进之旅:Day 22 - 构建和部署

欢迎回来&#xff01;在我们的Vue 3学习旅程的第22天&#xff0c;我们将探讨应用的构建和部署。在完成了我们的应用开发后&#xff0c;下一步就是如何将其部署到服务器&#xff0c;使得用户可以访问。 1. 构建Vue应用 构建Vue应用是将我们在本地开发的代码打包成生产环境可用…...

Ansible中Playbook的逻辑控制语句-when

playbook的逻辑控制语句 when 条件判断语句&#xff0c;类似if loop 循环语句&#xff0c;类似loop block 将几个任务组成一个代码块&#xff0c;便于针对一组操作的异常进行处理 when的基本用法 when的运算符操作 when关键字可以配合各种运算符进行操作&#xff0c;如下&…...

制造业物联网的十大用例

预计到 2026 年&#xff0c;物联网制造市场价值将达到 4000 亿美元。实时收集和分析来自联网物联网设备与传感器的数据&#xff0c;这一能力为制造商提供了对生产流程前所未有的深入洞察。物联网&#xff08;IoT&#xff09;有潜力彻底改变制造业&#xff0c;使工厂能够更高效地…...

InfiniBand与IP over InfiniBand(IPOIB):实现高性能网络通信的底层机制

在现代高性能计算(HPC)和数据中心环境中,网络通信的效率和性能至关重要。InfiniBand(IB)作为一种高性能的串行计算机总线架构,以其低延迟、高带宽和高可靠性而广泛应用于集群计算和数据中心。IP over InfiniBand(IPOIB)则是在InfiniBand网络上实现IP协议的一种方式,它…...

【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...

机器学习 | scikit-learn中分块拟合vs一次性拟合所有数据

Scikit-learn是一个广泛使用的机器学习Python库&#xff0c;提供了一系列分类、回归、聚类等算法。机器学习的关键挑战之一是处理无法一次性放入内存的大型数据集。本文探讨了使用scikit-learn将数据分块拟合与一次性拟合的策略&#xff0c;讨论了每种方法的优点和局限性。 大…...

两个同一对象targetList和 sourceList 去重

我现在需要解决的问题是从一个Java的源列表`sourceList`中移除所有在目标列表`targetList`中存在的数据,并且还要去除`targetList`中的重复数据。让我先理清楚这两个问题的思路。 首先,如何快速从`sourceList`中移除含有`targetList`的数据。这里的“含有”应该是指两个列表中…...

小游戏源码开发之可跨app软件对接是如何设计和开发的

专业小游戏开发的团队往往会面临跨领域和不同平台客户需要追加同一款游戏的需求&#xff0c;所以就要设计和开发一款可任意对接不同 App 软件的小游戏&#xff0c;那么针对这类需求小游戏开发团队早已有了成熟的解决方案&#xff0c;针对设计和开发可跨平台游戏对接大概流程简单…...

掌握正则表达式_模式匹配的艺术

当然,以下是《掌握正则表达式:模式匹配的艺术》文章内容,使用 Java 正则表达式,并包含丰富的代码示例: 1. 引言 1.1 正则表达式的定义与历史 正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于描述文本模式的强大工具。它最初由数学家 Stephen Kleene…...

FacePoke详细使用指南:如何利用开源AI工具优化照片人物表情

文章目录 前言1. 本地使用FacePoke1.1 整合包方式安装1.2 Docker方式部署 2. FacePoke功能演示3. 公网使用FacePoke3.1 创建远程连接公网地址 4. 固定远程访问公网地址 前言 在数字创意的世界里&#xff0c;一款名为FacePoke的工具正以其风趣而强大的功能吸引着无数创作者的目…...

本地部署【LLM-deepseek】大模型 ollama+deepseek/conda(python)+openwebui/docker+openwebui

通过ollama本地部署deepseek 总共两步 1.模型部署 2.[web页面] 参考官网 ollama:模型部署 https://ollama.com/ open-webui:web页面 https://github.com/open-webui/open-webui 设备参考 Mac M 芯片 windows未知 蒸馏模型版本:deepseek-r1:14b 运行情况macminim2 24256 本地…...

分发饼干(力扣455)

从这道题开始我们就进入贪心算法的学习了。这个算法没有固定的套路&#xff0c;甚至题目之间的联系也很少&#xff0c;基本上每一道题都要当新题来写。我们能做的只有见多识广&#xff0c;这样才有机会在考试中根据以往经验解决贪心的题目。贪心的本质上就是找到局部最优解&…...

信息收集-主机服务器系统识别IP资产反查技术端口扫描协议探针角色定性

知识点&#xff1a; 1、信息收集-服务器系统-操作系统&IP资产 2、信息收集-服务器系统-端口扫描&服务定性 一、演示案例-应用服务器-操作系统&IP资产 操作系统 1、Web大小写(windows不区分大小写&#xff0c;linux区分大小写) 2、端口服务特征(22就是linux上的服…...

建筑兔零基础自学python记录18|实战人脸识别项目——视频检测07

本次要学视频检测&#xff0c;我们先回顾一下图片的人脸检测建筑兔零基础自学python记录16|实战人脸识别项目——人脸检测05-CSDN博客 我们先把上文中代码复制出来&#xff0c;保留红框的部分。 ​ 然后我们来看一下源代码&#xff1a; import cv2 as cvdef face_detect_demo(…...

vue-点击生成动态值,动态渲染回显输入框

1.前言 动态点击生成数值&#xff0c;回显输入框&#xff0c;并绑定。 2.实现 <template><div style"display:flex;align-items: center;flex-direction:row"><a-input:key"inputKey"v-model"uploadData[peo.field]"placehold…...

Idea 插件 Quickly-Code-Toolkit

使用说明 &#xff08;一&#xff09;全局设置 Paging Wrapper Setting&#xff08;分页设置&#xff09; 功能&#xff1a;主要用于在方法写入时&#xff0c;为返回参数提供分页包装类。设置方式&#xff1a;需准确填写分页包装类的全限定名&#xff0c;例如&#xff1a;com…...

fun-transformer学习笔记-Task1——Transformer、Seq2Seq、Encoder-Decoder、Attention之间的关系

Transformer、Seq2Seq、Encoder-Decoder、Attention由这四者之间的关系可以从模型架构的发展脉络来理解&#xff1a; Seq2Seq 与 Encoder–Decoder 模型 “Seq2Seq”&#xff08;sequence‐to‐sequence&#xff09;是一类用于将一个变长序列映射为另一个变长序列的任务&#x…...

使用瑞芯微RK3588的NPU进行模型转换和推理

使用边缘设备进行算法落地时&#xff0c;通常要考虑模型推理速度&#xff0c;NVIDA系列平台可以使用TensorRT和CUDA加速&#xff0c;瑞芯微RK3588的板子上都是Arm的手机GPU&#xff0c;虽然没有类似CUDA的加速计算方式&#xff0c;但是提供了NPU进行加速推理&#xff0c;本文说…...

mysql读写分离与proxysql的结合

上一篇文章介绍了mysql如何设置成主从复制模式&#xff0c;而主从复制的目的&#xff0c;是为了读写分离。 读写分离&#xff0c;拿spring boot项目来说&#xff0c;可以有2种方式&#xff1a; 1&#xff09;设置2个数据源&#xff0c;读和写分开使用 2&#xff09;使用中间件…...

Vue笔记(九)

一、文章分类架子--PageContainer 学习PageContainer组件的封装&#xff0c;这一组件用于搭建页面基础结构&#xff0c;为后续内容展示提供统一布局。它可能包含通用的页面样式、导航栏、侧边栏等基础元素的结构搭建。 在Vue组件中&#xff0c; <template> 标签内定义基础…...

YOLO11框架使用

YOLO11 1. Frame Understanding2. What can YOLO11 do?3.如何训练自己数据集?3.1 配置环境3.2 制作自己数据集3.3 配置文件3.3.1 数据集配置文件3.3.2 网络模块配置文件4.修改训练参数配置文件5. 训练脚本编写6.结果展示1. Frame Understanding 2. What can YOLO11 do? Ult…...

RK3588视觉控制器与AI 算法:开启工业视觉检测新境界

在实际应用中&#xff0c;工业相机拍摄产品的图像&#xff0c;RK3588 迅速接收并进行预处理。AI 算法随即对图像进行深入分析&#xff0c;提取特征并与预设的标准进行对比&#xff0c;从而准确判断是否存在缺陷。 例如&#xff0c;在电子元件生产线上&#xff0c;RK3588 和 AI…...

C语言基础入门:2.5基础输入输出

【C语言基础】输入输出完全指南&#xff1a;从printf到缓冲区安全 文章目录 【C语言基础】输入输出完全指南&#xff1a;从printf到缓冲区安全一、格式化输出艺术&#xff1a;printf函数详解二、scanf输入安全与缓冲区处理三、字符级交互&#xff1a;getchar与putchar实战程序员…...

压缩stl文件大小

1、MeshLab下载界面&#xff0c;从MeshLab下载适合自己系统的最新版本。 2、打开 MeshLab软件&#xff0c;将stl文件拖入其中。 3、 4、Percentage reduction参数即为缩放比例&#xff0c;根据自身想要将文件压缩到多大来。 然后点击apply 5、CtrlE弹出窗口保存文件后&…...

二、交换机的vlan子设备接入

一、交换机的vlan设置-CSDN博客 二、交换机的vlan子设备接入-CSDN博客 接上篇的文章&#xff0c;本文接入了子设备 网络结构如下&#xff1a; 用路由器A和POE交换机B代替第一篇中的笔记本电脑&#xff0c;路由器A和交换机B都关闭DHCP服务&#xff0c;并分别接入一个IPC&#…...

KEPServerEX 的接口类型与连接方式的详细说明

目录 一、KEPServerEX 核心架构 二、KEPServerEX 支持的接口类型 三、KEPServerEX 支持的连接类型 1. 通用工业协议 2. 品牌专属协议 3. 行业专用协议 4. 数据库与文件接口 四、配置示例 1. 接口配置&#xff08;以OPC UA为例&#xff09; 2. 连接配置&#xff08;以…...

Stack(栈)

定义&#xff1a;在Java编程语言中&#xff0c;栈(Stack)是一种非常重要的数据结构&#xff0c;具有后进先出的特性&#xff0c;即最后入栈的元素最先出栈。栈通常用于存储临时性的数据&#xff0c;如方法调用过程中的局部遍历、操作数栈等。 图像理解&#xff1a; 我们在这里要…...

【Vue3 Computed 与 Watch 维护对比】

让我们从开发体验和维护性的角度深入对比 computed 和 watch&#xff0c;通过具体场景分析它们的差异&#xff1a; 一、维护成本对比 1. 依赖管理差异 // 原始代码 const productFilter computed(() > {return products.value.filter((p) > p.price > minPrice.val…...

在node.js环境中使用web服务器http-server运行html静态文件

http-server http-server是一个超轻量级web服务器&#xff0c;它可以将任何一个文件夹当作服务器的目录供自己使用。 当我们想要在服务器运行一些代码&#xff0c;但是又不会配置服务器的时候&#xff0c;就可以使用http-server就可以搞定了。 使用方法 因为http-server需要…...

详解电子邮箱工作原理|SMTP、POP3、IMAP、SPF、MIME

写在前面 电子邮件&#xff08;Email&#xff09;是一种通过互联网进行异步通信的技术&#xff0c;工作原理涉及多个协议、服务器和客户端协同工作。 接下来我们来介绍一下电子邮箱的工作原理 1. 电子邮件的核心组成部分 邮件客户端&#xff1a;用户直接交互的软件&#xf…...

算法学习笔记之并查集

简介 问题描述&#xff1a;将编号为1-N的N个对象划分为不相交集合&#xff0c;在每个集合中&#xff0c;选择其中的某个元素代表所在集合。 常见两种操作&#xff1a; 1.合并两个集合 2.查找某元素属于哪个集合 实现方法1 用编号最小的元素标记所在集合&#xff1b; 定义…...

【开源项目】ShowDoc适合IT团队的在线API文档、技术文档工具

1. 介绍 通过showdoc&#xff0c;可以方便地使用markdown语法来书写出美观的API文档、数据字典文档、技术文档、在线excel文档等等。还可以利用showdoc的自动化能力&#xff0c;从程序注释中自动生成API文档&#xff0c;或者从搭配的RunApi客户端&#xff08;类似postman的api…...