用详细实例说明和典型案例实现对分治法进行全面分析 | C++

news2024/11/19 6:22:10

第一篇    分治法


目录

第一篇    分治法

●前言

●一、分治法是什么?

1.简要介绍

2.生活实例

●二、分治法的典型案例——硬币问题

1.具体问题

2.代码展示(C++)

3.程序代码结果展示

●总结


前言

        简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。


一、分治法是什么?

1.简要介绍

        分治法是一种很重要的算法,我们可以用分治法去逐一拆解复杂的问题,使复杂问题简单化。它的核心思想就是将一个难以直接解决的复杂问题依照相同的概念将其分为多个子问题,从而各个击破解决问题。

2.生活实例

        ① 如果有一幅画它由八部分组成,但是如果直接把这八块看成一个整体的话是很难直接画出实现的,所以我们可以先将其分为2组各四幅来完成。如果还是比较复杂,就再将其分成4组各两幅画去完成...... 直到最终画出每一幅画再将其拼接完整即可

        ②一个部门被公司去委派去做一个项目规划,这个规划需要8个章节的主题,如果只靠一个人去完成,不仅耗费较长的时间还可能会因为没有去集思广益,从而最终导致项目没有什么亮点而失败。这时我们去用到分治法的核心思想,部门经理将这个大项目分给两个子项目负责人去完成。不过,为了让这个规划更快完成,又能去找到合适的分类,每个子项目负责人再分别将其分派给两个小团队,小团队从而分配给不同的成员去完成。通过这种方法,我们将所需时间缩减到原先一个人独立完成时间的1/8,项目每个章节主题内容也集思广益,从而为企业创造了更大的价值。

二、分治法的典型案例——硬币问题

1.具体问题

        在下面我们将硬币分为1和0两个值,1为真硬币,0为假硬币。分两种情况,偶数枚硬币和奇数枚硬币,并将其随机排成一列,其中有一个假硬币(假硬币位置随机),用分治算法寻找出这枚假硬币所在的位置,如下图所示。

① 当硬币个数为偶数时(10枚):

 ② 当硬币个数为奇数时(13枚):

2.代码展示(C++)

        用程序代码去实现一个功能:输入20枚硬币,其中有一枚假硬币并且位置随机,用分治法的核心思想去找到该枚假硬币所在的位置。

#include<iostream>
using namespace std;
#define maxsize 20  //硬币的数目
class fenzhi {
public:
	int falsecoin(int low, int high);
	void showresult();
	int num;
	int coin[maxsize];
	int result;
};
int fenzhi::falsecoin(int low, int high)
{
	int sum1=0;
	int sum2=0;
	int sum3=0;
	if (low + 1 == high)  //只有两枚硬币
	{
		if (coin[low] < coin[high])
		{
			result = low + 1;
			return result;
		}
		else
		{
			result = high + 1;
			return result;
		}
	}	
	//分治算法
	 if((high-low+1)%2==0)  //n是偶数
	{ 
		for (int i = low; i <= low+(high-low)/2; i++)
		{
			sum1 += coin[i];//前半段和
		}
		for (int j = low + (high - low) / 2+1; j <= high; j++)
		{
			sum2 += coin[j];//后半段和
		}
		if (sum1 > sum2)
		{
			result = falsecoin(low + (high - low) / 2 + 1, high); //递推后半段
			return result;
		}
		else if(sum1 < sum2)
		{
			result = falsecoin(low, low + (high - low) / 2); //递推前半段
			return result;
		}
	}
	 else  //n是奇数
	{
		for (int i = low;i<=low+(high-low)/2-1;i++)
		{
			sum1 += coin[i];   //中位数的前半段和
		}
		for (int j = low + (high - low) / 2+1; j <= high; j++)
		{
			sum2 += coin[j];   //中位数的后半段和
		}
		sum3 = coin[low + (high - low) / 2];   //中位数
		if (sum1 > sum2)      //前半段和大于后半段和
		{
			result = falsecoin(low + (high - low) / 2 + 1, high);//递推后半段
			return result;
		}
		else if (sum1 < sum2)   //前半段和小于后半段和
		{
			result = falsecoin(low, low + (high - low) / 2 - 1);//递推前半段
			return result;
		}
		if (sum1 + sum3 == sum2 + sum3)    //前半段和加中位数等于后半段和加中位数,所以中位数为目标寻找值
		{
			result = low + (high - low) / 2+1;
			return result;
		}
	}
}
void fenzhi::showresult()
{
	cout << "假币所在的位置:" << this->result << endl;
}
void text()
{
	fenzhi fz;
	cout << "输入硬币的总数目:" << endl;
	cin >> fz.num;
	cout << "请输入硬币的真假(1真/0假):" << endl;
	for (int i = 0; i < fz.num; i++)
	{
		cin >> fz.coin[i];
	}
	fz.falsecoin(0, fz.num - 1);
	fz.showresult();
}
int main()
{
	text();
}

3.程序代码结果展示


总结

        通过分治法可以让原来无序、复杂的问题变成一个规则、简单,数量少,速度快并且更容易解决的小问题。其实任何一种可以用程序来求解的问题,所需的计算时间都与其规模和复杂度有关,问题规模越小,越容易直接去进行求解,从而可以去不断分解问题,使子问题规模去不断缩小,让这些子问题简单到可以直接解决,   最终进行合并从而解决整个问题。    

                                               <您的三连和关注是我最大的动力>

                       🚀 文章作者:Keanu Zhang        分类专栏:算法之美(C++系列文章)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

菲中工商贸投资合作签约活动在京举办

2023年1月3日至5日&#xff0c;中菲两国元首亲切会谈后&#xff0c;共同发布了成果丰硕的二十八条内容的联合声明。1月3日至9日&#xff0c;由菲律宾菲中人民友好促进会与中国联合国采购促进会在京联合举办了“菲中工商贸投资合作签约仪式”及“中菲合作项目对接洽谈周”活动。…

FPGA:逻辑函数的代数法化简

文章目录逻辑函数的最简形式逻辑函数的代数化简法并项法吸收法消去法配项法示例1示例2逻辑函数的最简形式 1&#xff0e;化简逻辑函数的意义 LABAˉBAˉBˉ(AAˉ)BAˉBˉ1⋅BAˉBˉBAˉ\begin{aligned} L & A B\bar{A} B\bar{A} \bar{B} \\ & (A\bar{A}) B\bar{A} \ba…

PELT——Per Entity Load Tracking

0. 前言&#xff1a; 今天写第一篇Linux内核调度子系统的文章&#xff0c;首先整理PELT负载追踪方法&#xff0c;之前的基础知识在后续的文章中share出来。文章的写成基本上是在几位内核大佬的文章基础之上完成的&#xff0c;有些地方的文字是直接引用的&#xff0c;但本文只用…

SpringBoot上传文件到Minio服务器

前言 本文主要介绍如何使用SpringBoot上传到minio服务器。 没什么可多说的&#xff0c;公司用什么咱们开发研究什么就完事了。直接分享核心代码。 核心代码 minio依赖 <!-- minio依赖 --><dependency><groupId>io.minio</groupId><artifactI…

ArcGIS基础实验操作100例--实验91栅格欧式分配

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验91 栅格欧式分配 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

第01讲:什么是kubernetes

一、什么是k8s&#xff1f; kubernetes&#xff0c;简称 K8s&#xff0c;是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源 的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes 的目标是让部署容器化的 应用简单并且高效(powerful),Kubern…

马蹄集 时刻求和

时刻求和 难度&#xff1a;白银 0时间限制&#xff1a;1秒 巴占用内存&#xff1a;64M 输入正整数N和M,空格分隔。把他们看作在12小时制的时刻&#xff08;小时&#xff09;求 和并输出&#xff0c;输出最小列宽为3列。 #include<bits/stdc.h> using namespace std; int…

linux篇【14】:网络http协议

目录 一.HTTP协议 1.认识URL &#xff08;1&#xff09;域名->必须被转化成为IP &#xff08;2&#xff09;URL中可以省略的部分 ①端口号可缺省 ②登录信息可以省略 ③当我们访问自己的服务器时&#xff0c;https可省略&#xff0c;端口号不可省 &#xff08;3&#x…

6.2、客户/服务器方式(C/S)对等方式(P2P方式)

网络应用程序运行在处于网络边缘的不同的端系统上&#xff0c;通过彼此间的通信来共同完成某项任务。 开发一种新的网络应用首先要考虑的问题就是网络应用程序在各种端系统上的组织方式和它们之间的关系。\color{red}网络应用程序在各种端系统上的组织方式和它们之间的关系。网…

设计模式_创建型模式 -《建造者模式》

设计模式_创建型模式 -《建造者模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造&#…

Golang.org/x库初探2——text库

Golang有一个很有意思的官方库&#xff0c;叫golang.org/x&#xff0c;x可能是extends&#xff0c;experimental&#xff0c;总之是一些在官方库中没有&#xff0c;但是又很有用的库。最近花点时间把这里有用的介绍一下。 Golang.org/x库初探1——image库Golang.org/x库初探2—…

原创,探店,混剪,带货,获客,发布,更新,呆头鹅批量剪辑软件

一天轻松剪辑2000条&#xff0c;视频批量生成工具&#xff0c;短视频带货&#xff0c;电商卖家&#xff0c;媒体运营多场景应用视频剪辑分镜音频合成&#xff0c;一次解决&#xff01; 对于广大自媒体玩家最关心的话题&#xff0c;用了这个AI全自动呆头鹅批量视频剪辑软件做出来…

骑电动车不戴头盔识别抓拍系统 yolov7

骑电动车不戴头盔识别抓拍系统通过Python基于YOLOv7网络深度学习技术&#xff0c;对现场画面中骑电动车不戴头盔识别抓拍包括骑乘人员和带乘人员。YOLOv7 在 5 FPS 到 160 FPS 范围内&#xff0c;速度和精度都超过了所有已知的目标检测器&#xff0c;并在V100 上&#xff0c;30…

如何设置等高线坐标系并输出

如何设置等高线坐标系并输出发布时间&#xff1a;2018-01-17 版权&#xff1a;投影设置及数据导出矢量等高线生成完成后&#xff08;详细生成过程参加上一章节&#xff1a;矢量等高线生成&#xff09;,我们就能够设置投影和导出等高线数据。投影设置我们生成等高线默认的坐标是…

Rust之错误处理(一):无法恢复的错误panic!

开发环境 Windows 10Rust 1.66.1VS Code 1.74.3项目工程 这里继续沿用上次工程rust-demo 错误处理 错误是软件生活中的一个事实&#xff0c;所以Rust有一些处理出错情况的功能。在许多情况下&#xff0c;Rust要求你承认错误的可能性&#xff0c;并在你的代码编译前采取一些…

Google结构化数据

为什么要向网页添加结构化数据&#xff1f; 添加结构化数据可让您获得对用户更有吸引力的搜索结果&#xff0c;并可能会鼓励用户与您的网站进行更多互动&#xff0c;这就是富媒体搜索结果。 以下是一些为网站实现了结构化数据的案例研究&#xff1a; Rotten Tomatoes 为 10 万…

【学习笔记之Linux】工具之gdb

背景知识&#xff1a; 首先我们要知道&#xff0c;程序的发布一共有两种模式&#xff0c;一种是debug模式&#xff0c;是我们程序员自己编写代码的模式&#xff0c;可以进行调试&#xff0c;这个模式下编译出来的程序是包含调试信息的&#xff1b;一种是release模式&#xff0c…

AntV G6 组织图使用(后端渲染数据)

一、业务场景&#xff1a; 点击按钮&#xff0c;跳转页面并显示该数据的组织架构图&#xff08;类似于粒子效果&#xff09; 二、问题描述&#xff1a; 初始写死的数据能显示&#xff0c;但是从接口请求到的数据赋上值 渲染不了 三、具体实现步骤&#xff1a; &#xff08;1&…

python GUI And Tkinter 01

目录 一、基础介绍 二、创建窗口 1、创建完窗口后还需要知道窗口的相关属性 2、widget相关控件 3、原本tkinter有的Widget。 4、widget的共同属性 1. Configuration 2. Event Processing 3. Event callbacks 4. Alarm handlersafter(time,callback)&#xff1a;间隔指定时间后调…

Python logging 库的『完整教程』

前言 本文的标题是『完整』。所谓『完整』&#xff0c;大意是想表达&#xff1a;提炼出一组最小的经验组合&#xff0c;并且能够快速应用于工程中&#xff0c;能 work&#xff0c;甚至能完美地 work。这篇文章就是想要做到『如何能完美地work』。 初衷 最原始的初衷就是&…