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

C++算法专题学习:模拟算法

        本篇内容我们将学习C++算法的下一个主要算法思想:模拟。

        很多人将「模拟算法」误解为最简单的“照着做”,从而忽视了其背后蕴含的深刻计算机科学思想——建模。事实上,每一次成功的模拟,都是一次出色的建模过程。

        它要求我们首先在脑中或纸上建立一个清晰的、无二义性的逻辑模型,这个模型需要精准地反映题目的所有规则和约束。然后,我们再用编程语言的数据结构(如数组、链表、状态机)和控制流(循环、分支)将这个抽象模型“实例化”。这个过程,与软件工程中的系统设计何其相似!本文将与你一同探讨,如何超越机械的代码翻译,从建模的高度去思考和解决模拟问题,从而提升你的整体编程与设计能力。

        接下来我们将就这个专题进行深入的算法学习

        相关代码已经上传至作者的个人gitee:CPP 学习代码库: C++代码库新库,旧有C++仓库满员了,喜欢请点个赞谢谢

目录

基本概念

核心技术要素

典型应用场景

工业领域

军事领域

医疗领域

实施步骤

发展趋势

1、替换所有的问号

2、提莫攻击

3、Z字形变换

        1、模拟:

        2、找规律

4、外观数列

5、数青蛙​编辑


基本概念

        模拟(Simulation)是指通过构建模型来复现现实系统或过程的行为特征,从而进行分析、预测或训练的技术。现代模拟技术已广泛应用于科学研究、工程设计、军事训练和商业决策等多个领域。

核心技术要素

  1. 建模方法

    • 物理建模:基于物理定律构建数学模型
    • 数据驱动建模:利用机器学习算法从历史数据中学习系统行为
    • 混合建模:结合物理定律与数据驱动方法
  2. 仿真引擎

    • 离散事件仿真
    • 连续系统仿真
    • 实时仿真系统
  3. 验证与确认

    • 模型验证(Verification):确保模型实现正确
    • 模型确认(Validation):确保模型准确反映现实系统

典型应用场景

工业领域

  • 制造系统模拟:优化生产流程,预测产能瓶颈
  • 产品性能模拟:汽车碰撞测试、飞机气动特性分析
  • 工艺过程模拟:化学反应过程仿真

军事领域

  • 战场环境模拟:用于战术训练和作战计划评估
  • 武器装备模拟:导弹飞行轨迹预测
  • 指挥决策模拟:战争推演系统

医疗领域

  • 手术模拟训练:使用虚拟现实技术培训外科医生
  • 药物作用模拟:预测新药在人体内的代谢过程
  • 流行病传播模拟:预测疾病传播趋势

实施步骤

  1. 明确目标:确定模拟要解决的具体问题
  2. 系统分析:研究实际系统的关键特性和边界条件
  3. 模型构建:选择合适的建模方法和工具
  4. 参数设置:确定模型参数和初始条件
  5. 仿真运行:执行模拟计算
  6. 结果分析:验证数据有效性并得出结论
  7. 优化迭代:根据分析结果改进模型

        以上部分建议先在演草纸上模拟流程然后将其转换为代码

发展趋势

  1. 高性能计算:利用GPU加速和分布式计算处理大规模仿真
  2. 数字孪生:构建物理实体的虚拟镜像,实现实时交互
  3. AI增强:结合机器学习提高模拟精度和效率
  4. 云仿真平台:提供按需使用的仿真服务
  5. 多学科协同仿真:整合不同领域的模拟系统

1、替换所有的问号

       

class Solution {
public:string modifyString(string s) {int n=s.size();for(int i=0;i<n;i++){if(s[i]=='?'){for(char ch='a';ch<='z';ch++){if((i==0||ch!=s[i-1])&&(i==n-1||ch!=s[i+1])){s[i]=ch;break;}}}}return s;}
};

2、提莫攻击

        算法原理:

        

class Solution {
public:int findPoisonedDuration(vector<int>& timeSeries, int duration) {int n=timeSeries.size();int sum=0;for(int i=0;i<n-1;i++){if(timeSeries[i+1]-timeSeries[i]>=duration){sum+=duration;}else {sum+=(timeSeries[i+1]-timeSeries[i]);}}sum+=duration;return sum;}
};

3、Z字形变换

        算法思想:

        1、模拟:

代码思路

  1. 特殊情况处理:如果行数 numRows 为 1 或者大于等于字符串长度,直接返回原字符串,因为不需要变换。

  2. 计算周期:一个完整的 Z 字形周期(向下和斜向上)的长度为 t = 2 * numRows - 2

  3. 计算列数:根据周期数计算所需的列数,每个周期占用 numRows - 1 列。

  4. 初始化矩阵:创建一个 numRows 行 c 列的矩阵,所有元素初始化为空字符(ASCII 0)。

  5. 填充矩阵:遍历字符串中的每个字符,根据当前在周期中的位置决定移动方向(向下或斜向上),并将字符放入矩阵的对应位置。

  6. 构建结果字符串:按行遍历矩阵,将非空字符拼接成结果字符串

    class Solution {
    public:string convert(string s, int numRows) {int n = s.length(), r = numRows;// 特殊情况处理:如果行数为1或行数超过字符串长度,直接返回原字符串if (r == 1 || r >= n) {return s;}// 计算一个周期的长度:向下移动r行,斜向上移动r-2行(总移动次数为2r-2)int t = r * 2 - 2;// 计算需要的列数:周期数向上取整乘以每个周期的列数(r-1)// (n + t - 1) / t 是周期数的向上取整int c = (n + t - 1) / t * (r - 1);// 初始化矩阵:r行c列,所有元素初始化为0(空字符)vector<string> mat(r, string(c, 0));// 遍历字符串,填充矩阵// x和y表示当前字符在矩阵中的行和列坐标for (int i = 0, x = 0, y = 0; i < n; ++i) {mat[x][y] = s[i]; // 将当前字符放入矩阵// 判断当前在周期中的位置:如果当前索引在一个周期内的位置小于r-1,则向下移动if (i % t < r - 1) {++x; // 向下移动,行号增加} else {--x; // 斜向上移动,行号减少++y; // 列号增加}}// 按行遍历矩阵,将非空字符拼接成结果字符串string ans;for (auto &row : mat) {for (char ch : row) {if (ch) { // 如果字符不是空(即ASCII值不为0),则添加到结果ans += ch;}}}return ans;   }
    };

        2、找规律

        n=1的时候特别处理一下

class Solution {
public:string convert(string s, int numRows) {//处理边界情况if(numRows==1) return s;string ret;int d=numRows*2-2,n=s.size();//处理第一行for(int i=0;i<n;i+=d){ret+=s[i];}//中间行for(int k=1;k<numRows-1;k++)//枚举每一行{for(int i=k,j=d-k;i<n||j<n;i+=d,j+=d){if(i<n) ret+=s[i];if(j<n) ret+=s[j];}}//处理最后一行for(int i=numRows-1;i<n;i+=d){ret+=s[i];}return ret;}
};

4、外观数列

        算法思路:模拟+双指针

class Solution {
public:string countAndSay(int n) {string ret="1";//解释n-1次for(int i=1;i<n;i++){string tmp;//双指针int len=ret.size();for(int left=0,right=0;right<len;){while(right<len&&ret[right]==ret[left]) right++;tmp+=to_string(right-left)+ret[left];left=right;}ret=tmp;}return ret;}
};

5、数青蛙

        算法思想:模拟+哈希表

        找前驱字符是否存在于哈希表中。

        如果存在在哈希表中--,当前字符++;如果不存在,返回-1

        遍历到c的时候找最后一个字符是否在哈希表中。

        如果存在让最后一个字符个数--,当前字符++;如果不存在,当前字符++

class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {string t="croak";int n=t.size();vector<int>hash(n);//数组模拟哈希表unordered_map<char,int>index;//存储对应下标for(int i=0;i<n;i++)index[t[i]]=i;for(auto& x:croakOfFrogs){if(x=='c'){if(hash[n-1]!=0) hash[n-1]--;hash[0]++;}else{int i=index[x];if(hash[i-1]==0)  return -1;hash[i-1]--;hash[i]++;}}for(int i=0;i<n-1;i++)if(hash[i]!=0)return -1;return  hash[n-1];}
};

        本期学习内容到这里就结束了,喜欢请点个赞谢谢。

http://www.dtcms.com/a/366060.html

相关文章:

  • 写C++十年,我现在怎么设计类和模块?(附真实项目结构)
  • 66这才是真正懂C/C++的人,写代码时怎么区分函数指针和指针函数?
  • 技术方案之Mysql部署架构
  • 极空间打造 “超级中枢”,从书签笔记到聊天分享,一键全搞定!
  • 【单片机day02】
  • Swift 解法详解:LeetCode 370《区间加法》
  • C++ 5
  • 硬件基础与c51基础
  • 【Linux】分离线程
  • 如何下载免费的vmware workstation pro 17版本?
  • 小游戏公司接单难?这几点原因与破局思路值得看看
  • Pytorch笔记一之 cpu模型保存、加载与推理
  • AI隐私保护:当大模型遇上“隐身术”——差分隐私+同态加密,让模型“看不见原始数据”
  • LoRA微调分词器 应用模板(75)
  • test命令与参数
  • Python基础(⑧APScheduler任务调度框架)
  • 数据结构从青铜到王者第十九话---Map和Set(2)
  • git之分支
  • 如何创建交换空间
  • 【音视频】视频秒播优化实践
  • 无穿戴动捕如何深度结合AI数据分析,实现精准动作评估?
  • 代码随想录刷题Day48
  • Linux 字符设备驱动框架学习记录(三)
  • 数学建模-非线性规划(NLP)
  • STM32HAL 快速入门(十七):UART 硬件结构 —— 从寄存器到数据收发流程
  • DOM常见的操作有哪些?
  • Day34 UDP套接字编程 可靠文件传输与实时双向聊天系统
  • 信号调制与解调 matlab仿真
  • 异常处理机制与debug
  • 复写零(双指针)