【数据结构】分治策略

现场保护和现场恢复

文章目录

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

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

分治策略

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

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

分治法步骤:

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

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

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

请添加图片描述

递归:

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

请添加图片描述

解决以下问题:

请添加图片描述

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

倒序输出整数

Print(int n )
   {
    if(n != 0)
    {                         ----->
         printf("%d ",n%10);  54321
           Print(n/10);   1235
                          123
                          12
                          1 
                          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 = b
      b =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)
{
	//assert
	int pos = n-1;
	if(pos >= 0 && br[pos] != val  )
	{
		return  FindValue(br,pos,val);
	}
	return pos;
}

非递归

int FindValue(int* br, int n, int val)
{
	//assert
	int 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)
{
  //assert
	int left = 0, right = len - 1;
	int pos = -1;
	int mid = -1;
	while (left < right)
	{   //如果是left+right/2
		mid = (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)
{
	//assert
	int left = 0, right = len - 1;
	int pos = -1;
	int mid = -1;
	while (left <= right)
	{   //如果是left+right/2
		mid = (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
如何降时间复杂程度?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/364142.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

创建与删除数据库(四)

创建与删除数据库&#xff08;四&#xff09; 一、创建数据库 1.1 使用DDL语句创建数据库 CREATE DATABASE 数据库名 DEFAULT CHARACTER 示例&#xff1a; 创建一个test 的数据库&#xff0c;并查看该数据库&#xff0c;以及该数据库的编码。 创建数据库&#xff1a; cre…

MATLAB Fundamentals>>>Centering and Scaling

MATLAB Fundamentals>Common Data Analysis Techniques>Polynomial Fitting>Centering and Scaling 数据导入 This code sets up the activity. yr 2000:2007 penguins [5.49 7.03 7.73 7.70 9.29 9.21 11.89 10.85] 附加练习 How does the model look?…

嵌入式——数字/模拟转换模块(DAC)

目录 一、初识DAC 1. 介绍 2. DAC主要特性 3. DAC的特性参数 二、相关寄存器 1. 控制寄存器&#xff08;DAC_CR&#xff09; 2. DAC通道1 的12位右对齐数据保持寄存器&#xff08;DAC_DHR12R1&#xff09; 3. 通道1数据输出寄存器&#xff08;DAC_DOR1&#xff09; 三…

C# .Net Framework Swagger

1.安装 Swagger 在NuGet程序包中安装以下文件 Swashbuckle: Swagger&#xff1a; Swagger.Net: 2.在项目APP_Start 文件夹下面找到 SwaggerNet.cs文件 1.注释掉这两行代码 2.将PreStart方法的内容修改为以下 public static void PreStart() {RouteTable.Routes.MapHttpRoute(…

Message Queue --- RabbitMQ

MessageQueue Intro 什么是MQ为什么使用MQ常见的MQ 什么是MQ MQ全称是Message Queue&#xff0c;消息的队列&#xff0c;因为是队列&#xff0c;所以遵循FIFO 先进先出的原则&#xff0c;它是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff0c;M…

Win搭建PalWorld服务器,幻兽帕鲁开服联机教程,0基础保姆级教程

Windows系统搭建幻兽帕鲁私服&#xff0c;PalWorld开服联机教程&#xff0c;零基础保姆级教程。 最近这游戏挺火&#xff0c;很多人想跟朋友联机&#xff0c;如果有专用服务器&#xff0c;就不需要房主一直开着电脑&#xff0c;稳定性也好得多。 视频教程&#xff1a;https:/…

vue-cli组件的使用

一、前言 ​ 本文介绍 vue-cli组件的使用&#xff0c;基于已经搭建好的基础项目。关于 vue-cli 构建项目的详细流程&#xff0c;可参考博文&#xff1a;使用vue脚手架构建项目 二、使用步骤 1、创建Header.vue组件 在components 目录下创建 Header.vue 编写Header.vue <…

figure方法详解之清除图形内容

figure方法详解之清除图形内容 一 clf():二 clear():三 clear()方法和clf()方法的区别&#xff1a; 前言 Hello 大家好&#xff01;我是甜美的江。 在数据可视化中&#xff0c;Matplotlib 是一个功能强大且广泛使用的库&#xff0c;它提供了各种方法来创建高质量的图形。在 Mat…

SSE长连接( SpringBoot整合SSE(Server-Sent Events)可以实现后端主动向前端推送数据)

Demo代码分享 依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.or…

Java编程练习之类的封装2

1.封装一个股票&#xff08;Stock&#xff09;类&#xff0c;大盘名称为上证A股&#xff0c;前一日的收盘点是2844.70点&#xff0c;设置新的当前值如2910.02点&#xff0c;控制台既要显示以上信息&#xff0c;又要显示涨跌幅度以及点数变化的百分比。运行效果如下&#xff1a;…

【2024美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文

【2023美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文 引言 题目将于2024年2月2日6:00发布。我们团队将会在8点前准时更新问题分析&#xff0c;逐步更新数学模型和实现代码&#xff0c;最后发布完整的论文。 更新进展&#xff1a; &#xff08;…

朋友,我在项目挺好的

2024年&#xff0c;是优橙教育成立第7年。过去6年&#xff0c;我们迎来送往&#xff0c;曾与一届届网优人并肩作战。 今天&#xff0c;我们不问所在何处&#xff1f;只想遥问曾在优橙的每一个你 嘿&#xff01;朋友&#xff0c;最近过得怎么样&#xff1f;现在的你和曾经的自…

IEC 104电力规约详细解读(二) - 总召唤

1功能简述 总召唤功能是在初始化以后进行&#xff0c;或者是定期进行总召唤&#xff0c;以刷新主站的数据库。总召唤时请求子站传送所有的过程的变量实际值。定期进行总召唤的周期的是一个系统参数&#xff0c;可以是15分钟或者更长的时间。 总召唤的内容包括子站的遥信、遥测…

【软件设计师笔记】计算机系统基础知识考点

&#x1f413; 计算机系统组成 计算机系统是由硬件和软件组成的&#xff0c;它们协同工作来运行程序。计算机的基本硬件系统由 运算器、控制器、存储器、输入设备和输出设备5大部件组成。运算器、控制器等部件被集成 在一起统称为中央处理单元&#xff08;Central Processing …

springboot+AOP+自定义注解+RBAC自定义操作权限管理02

springbootAOP自定义注解RBAC自定义操作权限管理02!经过上一次的凑话部署&#xff0c;我们这一次&#xff0c;增加了一个后端管理系统菜单栏的访问权限的数据表。用角色表&#xff0c;和这张菜单栏的数据表进行映射。不同的角色&#xff0c;可以看见不同的菜单栏目。 这个就是菜…

Maya------创建多边形工具

配合导入图像使用 Tab键可以删除一个点&#xff01; 模型不能超过4边面&#xff01;多切割工具进行连接&#xff01; 15.maya常用命令5.创建多边形工具 反转 双显 挤出_哔哩哔哩_bilibili

不做烧钱买卖,2025年实现双百万量产!奇瑞和大卓智能「不客气」了

随着造车从技术思维向用户思维转变&#xff0c;车企的自研边界逐渐清晰。 一方面&#xff0c;前两年各车企围绕高阶智驾制定的目标&#xff0c;基本都没有达到预期。尤其是疯狂烧钱堆料&#xff0c;并没能换来销量暴涨和C端消费者的满意度&#xff0c;也让部分车企也开始反思&…

电子电器架构——车载网关转发buffer心得汇总

电子电器架构——车载网关转发buffer心得汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力…

leetcode-704.二分查找

题目 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9输出: 4 解释: 9 …

Unity使用反向遮罩实现镂空shader

实现步骤&#xff1a; 1&#xff0c;创建两个材质球&#xff0c;遮罩层的属性如下&#xff1a; 被遮罩层的属性如下&#xff1a; 2&#xff0c;使用两张image&#xff0c;遮罩层在父节点&#xff0c;被遮罩层在子节点&#xff0c;然后分别添加材质球与镂空图片 实现效果如下&a…