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

【数据结构】分治策略

现场保护和现场恢复

文章目录

  • 分治策略
    • 分治法解决问题有以下四个特征:
    • 分治法步骤:
  • 递归:
    • 解决以下问题:
      • 倒序输出整数
      • 求最大公约数(递归和非递归)
      • 菲波那切数列

不要尝试间接
要使用直接递归(自己调用自己)

分治策略

分治法解决问题有以下四个特征:

  1. 该问题的规模小到一定程度就容易解决。
  2. 把大问题分解成小问题,是将问题的规模变小,而不是将问题变小
  3. 使用小规模的解,可以合并,该问题原规模的解
  4. 该问题所分解的各个子模块是相互独立的。

分治法步骤:

在分治策略中递归地求解一个问题,在每层递归中有如下解决步骤:
分解:递归地求解子问题,子问题地形式与原问题一样,只是规模更小。
解决:递归地求解子问题,如果子问题地规模足够小,则停止递归,直接求解
合并:将小规模地解组合成原规模地解

递归函数分为 递推递归两个过程
每当调用发生:就要分配新的栈帧(形参数据,现场保护,局部变量);而与普通函数调用不同,由于递推是一个逐层调用的过程,因此存在一个连续的分配栈帧的过程,直至遇到递归终止条件时,才开始回归,这时才会释放栈帧空间,返回到上一层,直到返回到主调函数。

  • 简单的函数调用过程:
    请添加图片描述

请添加图片描述

递归:

空间复杂程度位S(n),每次都要开辟栈帧
必要的情况才使用递归(如树形)
不存在死递归的概念(因为栈帧基本就1M,不断开辟栈帧,资源就损耗完了)
循环占用的cpu资源。因此存在死循环。

请添加图片描述

解决以下问题:

请添加图片描述

请添加图片描述
下面程序:

倒序输出整数

Print(int n ){if(n != 0){                         ----->printf("%d ",n%10);  54321Print(n/10);   1235123121 0  开始回归printf("%d ",n%10);Print(n/10); printf("%d ",n%10);12345<----}return;}

求最大公约数(递归和非递归)

int fun(int a, int b)
{       //求最大公约数if (b != 0)   //退出递归的条件{return fun(b,a%b); }  return a;}
int fun1(int a, int b)
{       //求最大公约数while (b != 0)   {int c  = a%b;a = b;b = c;}  return a
}

请添加图片描述
错误1:请添加图片描述

菲波那切数列

后一个数为前两个之和。
打印

int main()
{const int n = 10;int arr[n] = {1,1};for(int i =2;i<n;i++){arr[i] = arr[i-1]+arr[i-2];}
}

非递归

int fac(int n)
{int  a = 1,b=1,c=1;  //当n<=3的时候,打印的值均为1也就是前两位for(int i = 3;i<=n;i++){c = a+b;a = bb =c;}return c;
}

递归
时间复杂程度:2^n ,跑法是一颗二叉树。
空间复杂程度最大深度是S(n) 。因为递推时开辟栈帧,回归时,销毁栈帧
请添加图片描述
1.判断退出条件
2.分析最后需要的结果

int fac(int n) 
{int  c = 1;if(n > 2){return fun(n - 1)+fun(n - 2);}else{return c;}}

请添加图片描述
请添加图片描述
查询:递归和非递归(边界检查)
递归

int FindValue(int* br, int n, int val)
{//assertint pos = n-1;if(pos >= 0 && br[pos] != val  ){return  FindValue(br,pos,val);}return pos;
}

非递归

int FindValue(int* br, int n, int val)
{//assertint pos = n-1;if(pos >= 0 && br[pos] != val  ){pos++;}return pos;
}

递归:

int FindValue(int* br, int n, int val)
{//assert//n<1 比 n<=0要好,因为这里的n是规模,1—n的数,而<=0,又有下标的含义if (n < 1&& br[n-1] != val){return n-1;}return  FindValue(br, n-1, val);
}

二分查询:(要求数据是有序的,并且数据在内存中的存储是连续的)
如果数据量小不用考虑下面问题,数据量大,必须考虑下面问题。
所以采用(right-left)/2 + left
例如 1,2,3,4,5 ,6,7,8,9 (8-0)/2 = 4 4+0 = 4,即4号下标
由于存放是以2进制存放,所以左移一位,就相当于除以二
((right-left)>> 1) +left
请添加图片描述

int BinaryFind_Value(int *br,int len,int val)
{//assertint left = 0, right = len - 1;int pos = -1;int mid = -1;while (left < right){   //如果是left+right/2mid = (right - left) / 2 + left;//(right - left) >>1 + left;if (br[mid] < val){left = mid + 1;}else if(br[mid] > val){right = mid; //mid不能加一,因为left<right//加一有最右边的元素访问不到。}else{pos = mid;break;}}return pos;
}
  • int ar[] = {11 ,11, 11, 11, 11, 11, 12, 12, 13, 14, 15}
    查最左边的11
    请添加图片描述
int BinaryFind_Value(int* br, int len, int val)
{//assertint left = 0, right = len - 1;int pos = -1;int mid = -1;while (left <= right){   //如果是left+right/2mid = (right - left) / 2 + left;//(right - left) >>1 + left;if (br[mid] < val){left = mid + 1;}else if (br[mid] > val){right = mid - 1; //mid不能加一,因为left<right//加一有最右边的元素访问不到。}else{                              //可以比较下一个标的值while (mid > left && br[mid -1 ] == val){//pos = mid;  每次都赋值,浪费时间mid--;}pos = mid;break;}}return pos;
}

求ar[1,2,3,]所有子集
ar[0,0,0,0]
0,0,0,1
0,0,1,0
0,0,1,1

1,1,1,1
如何降时间复杂程度?

相关文章:

【数据结构】分治策略

现场保护和现场恢复 文章目录 分治策略分治法解决问题有以下四个特征&#xff1a;分治法步骤: 递归&#xff1a;解决以下问题&#xff1a;倒序输出整数求最大公约数&#xff08;递归和非递归&#xff09;菲波那切数列 不要尝试间接 要使用直接递归&#xff08;自己调用自己&am…...

【PLC一体机】PLC一体机中如何实现触摸屏和PC电脑的通讯

博主今天准备把之前买的PLC一体机拿出来玩一下&#xff0c;翻看以前的博文&#xff0c;发现没有记录分享PLC一体机中如何实现触摸屏程序下载的内容。 如之前博文介绍的那样&#xff0c;PLC一体机由PLC和触摸屏两部分集成的设备&#xff0c;因此设备内部已经做好了PLC和触摸屏之…...

如何保证订单异步回调的幂等性

保证订单异步回调的幂等性是非常重要的&#xff0c;因为异步通知可能会由于网络问题、支付系统重试或其他原因导致多次发送同一个支付结果通知。以下是一些保证订单异步回调幂等性的常用方法&#xff1a; 接口设计幂等性&#xff1a; 在设计异步通知的接口时&#xff0c;考虑让…...

Linux下vim命令详解

vim #创建或编辑新的文件 #这将在当前目录下创建一个名为fi.txt的新文本文件。如果文件已经存在&#xff0c;将会编辑现有文件。 [rootsever ~]#vim fi.txt #对于普通的文本编辑操作&#xff0c;可以使用以下键盘命令&#xff1a; - i&#xff1a;进入插入模式&#xff…...

机器学习6-逻辑回归

逻辑回归是机器学习中一种常用于二分类问题的监督学习算法。虽然名字中包含“回归”,但实际上它用于分类任务,特别是对于输出为两个类别的情况。逻辑回归通过使用 logistic 函数将输入映射到一个在0,1范围内的概率值,然后根据这个概率值进行分类。 以下是逻辑回归的基本概念…...

关于Clone

关于Clone 一般情况下&#xff0c;如果使用clone()方法&#xff0c;则需满足以下条件。 1、对任何对象o&#xff0c;都有o.clone() ! o。换言之&#xff0c;克隆对象与原型对象不是同一个对象。 2、对任何对象o&#xff0c;都有o.clone().getClass() o.getClass()。换言之&a…...

【C++入门学习指南】:函数重载提升代码清晰度与灵活性

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、函数重载1.1 函数重载的概念1.2 函数重载的作用1.3 C支持函数重载的原理1.4 扩展 &…...

MySql主从同步,同步SQL_ERROR 1032解决办法

1.登录从库 mysql -u root -p 2.输入命令查看状态 SHOW SLAVE STATUS\G; 3.找到对应的错误数据位置 Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB: app_push_centerReplicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Tabl…...

Webpack的性能优化

减少构建时间&#xff1a;使用webpack的缓存功能&#xff0c;通过配置cache: true来利用缓存&#xff0c;减少重复构建时间。 使用多线程或并行构建&#xff0c;可以利用webpack的parallel-webpack或HappyPack插件来实现。 充分利用硬件资源&#xff0c;例如利用多核CPU或者SSD…...

PyTorch中tensor.backward()函数的详细介绍

backward() 函数是PyTorch框架中自动求梯度功能的一部分&#xff0c;它负责执行反向传播算法以计算模型参数的梯度。由于PyTorch的源代码相当复杂且深度嵌入在C底层实现中&#xff0c;这里将提供一个高层次的概念性解释&#xff0c;并说明其使用方式而非详细的源代码实现。 在P…...

Linux 驱动开发基础知识——内核对设备树的处理与使用(十)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…...

编程笔记 html5cssjs 077 Javascript 关键字

编程笔记 html5&css&js 077 Javascript 关键字 一、关键字二、Javascript关键字注意 在计算机编程语言中&#xff0c;关键字&#xff08;Keyword&#xff09;是指那些被编程语言赋予特殊含义、具有预定义用途的保留字。这些词汇不能用作变量名、函数名或其他标识符&…...

LeetCode_19_中等_删除链表的倒数第N个结点

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 计算链表长度2.2 栈 1. 题目 给你一个链表&#xff0c;删除链表的倒数第 n n n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a; h e a d [ 1 , 2 , 3 , 4 , 5 ] , n…...

C++泛编程(3)

类模板基础 1.类模板的基本概念2.类模板的分文件编写3.类模板的嵌套 &#xff08;未完待续...&#xff09; 在往节内容中&#xff0c;我们详细介绍了函数模板&#xff0c;这节开始我们就来聊一聊类模板。C中&#xff0c;类的细节远比函数多&#xff0c;所以这个专题也会更复杂。…...

python基于django的公交线路查询系统mf383

1.个人信息的管理&#xff1a;对用户名&#xff0c;密码的增加、删除等 2.线路信息的管理&#xff1a;对线路的增加、修改、删除等 3.站点信息的管理&#xff1a;对站点的增加、修改、删除等 4.车次信息的管理&#xff1a;对车次的增加、修改、删除等 5.线路查询、站点查询 …...

ElementUI 组件:Container 布局容器实例

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 el-container-example.vue&#xff08;Container 布局容器实例&#xff09;页面效果图 项目里el-container-example.vue代码 <script> export default {name: el_cont…...

【数据结构 09】哈希

哈希算法&#xff1a;哈希也叫散列、映射&#xff0c;将任意长度的输入通过散列运算转化为固定长度的输出&#xff0c;该输出就是哈希值&#xff08;散列值&#xff09;。 哈希映射是一种压缩映射&#xff0c;通常情况下&#xff0c;散列值的空间远小于输入值的空间。 哈希运…...

理解和管理Linux文件权限

理解和管理Linux文件权限 文件权限的基本概念和表示方式 文件权限管理在Linux系统中是非常重要的&#xff0c;它决定了谁可以访问、读取、写入或执行文件。文件权限以及所有者、所属组等属性可以通过 ls -l 命令查看。 在 ls -l 命令的输出中&#xff0c;文件的权限通常表示…...

爬虫(二)

1.同步获取短视频 1.只要播放地址对Json数据解析&#xff0c;先把列表找出&#xff1a; 2.只想要所有的播放地址&#xff0c;通过列表表达式循环遍历这个列表拿到每个对象&#xff0c;再从一个个对象里面找到Video,再从Video里面找到播放地址(play_addr),再从播放地址找到播放…...

Flink实战四_TableAPISQL

接上文&#xff1a;Flink实战三_时间语义 1、Table API和SQL是什么&#xff1f; 接下来理解下Flink的整个客户端API体系&#xff0c;Flink为流式/批量处理应用程序提供了不同级别的抽象&#xff1a; 这四层API是一个依次向上支撑的关系。 Flink API 最底层的抽象就是有状态实…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...