首页 > 编程语言 >【数据结构与算法】分治法

【数据结构与算法】分治法

时间:2024-08-16 20:53:08浏览次数:10  
标签:int 分治 mid 问题 算法 num array 数据结构

分治法目录

一.分治法的思想

将一个大问题,拆解成为若干个小问题,而且大问题与小问题的解决方法一样.
说到这里我们可以联想到递归,没错就是用递归的思想.

分:递归解决较小的问题
治:子问题的解构建原问题的解

二.分治法的步骤

  • 分解:将原问题分解若干个规模较小,相互独立,与原问题形式相同的子问题.
  • 解决:若子问题规模较小而容易被解决则直接解决,否则递归的解决各个子问题.
  • 合并:将各个子问题的解合并为原问题的解.

三.举个例子

我(你)是一个超级大帅哥,在相亲节目上被许多美女看上.
但是我想找一个身高跟我一样的美女.
于是节目组从低到高的给我排了10个妹子,但是有一堵墙,我看不到她们,只能问他她们.
节目组给我打包票里面有一位身高跟我一样,而且还是个国色天香.
但是只给我4次的询问机会,如果4次内找到就领回家,否则就答应节目组与翠花交往.
在这里插入图片描述

在这里插入图片描述
我想了一想,区区小事,何足挂齿,就答应了下来.

四.具体实现

假设这就是那10位美女的身高,而我的身高是192.
在这里插入图片描述
我心想,如果直接问未免有点太靠运气了吧,我可绝对不想与翠花交往.
那我就要保证4次内必须问到我的身高.

就在这时,我突然想到,既然是按顺序排的,那我何不从中间问起,一下就可以排除一半.
然后在剩下的一半中,我还是从中间问起,一下又可以排除一半.

哈哈哈,我来了
在这里插入图片描述
在这里插入图片描述
每次都是比较中间的,大就继续比较大的那部分中间,小就比较小的那部分中间.
运行结果:
在这里插入图片描述
最后用了三次就抱得美人归,可把翠花气坏了!

五.完整代码

#include <iostream>

using namespace std;

int BinarySearch(int* array, int min, int max, int num)
{
	if (min > max)
	{
		return -1;
	}
	int mid = (min + max) / 2;
	if (array[mid] == num)
	{
		return mid;
	}
	else if(array[mid]>num)
	{
		return BinarySearch(array, min, mid - 1, num);
	}
	else
	{
		return BinarySearch(array, mid+1, max, num);
	}
}

int main()
{
	int array[] = { 161,163,165,170,172,179,185,188,192,199};
	int length = sizeof(array) / sizeof(array[0]);
	cout << length << "位美女的身高分别为:" << endl;
	for (int i = 0; i < length; i++)
	{
		cout << array[i] << " ";
	}
	cout << endl;

	cout <<"192身高的下标为:";
	int index = BinarySearch(array, 0, 9, 192);
	cout << index << endl;

	system("pause");
	return 0;
}

2024年8月16日20:51:18

标签:int,分治,mid,问题,算法,num,array,数据结构
From: https://blog.csdn.net/qq_74047911/article/details/141268696

相关文章

  • 【数据结构与算法】A*算法——自动寻路
    这里写目录标题一.为什么用A*算法二.A*算法的实现原理三.A*算法的实现1.初始化地图2.格子初始化3.两个列表4.起点到终点的路径5.起点到终点的最佳路径★6.资源的释放四.完整代码1.Astar.h2.Astar.cpp3.main.cpp4.运行结果一.为什么用A*算法上节课我们已经讲了最短......
  • 常见的排序算法
    插入排序时间复杂度O(n^2)空间复杂度O(1)选择排序的工作原理是在0~i的索引范围内去进行排序,将新增的数arr[i]一个个放进来排序,个人感觉有点类似于冒泡排序,但是和冒泡排序不同是选择排序是在小范围内找出最大最小完成一个小范围的有序,而冒泡排序是在整个数组中每次找......
  • 快速排序算法详解及Python实现
    目录引言快速排序算法步骤快速排序的Python实现性能分析注意事项引言快速排序(QuickSort)是一种高效的排序算法,由C.A.R.Hoare在1960年提出。它的基本思想是:通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此......
  • 文献分享: DiskANN查询算法的复杂度下界
    文章目录0.写在前面0.1.预备知识0.2.一些记号0.3.本文的研究概述1.DiskANN\text{DiskANN}DiskANN回顾1.0.Intro1.1.......
  • Note - 树分治(点分治、点分树)
    陈年笔记,现在可能不会了。点分治Q1:基本思想是什么?将路径分为经过\(u\)和不经过\(u\)的两类,在每次分治中计算经过\(u\)的路径数量。Q2:如何统计?一般:遍历\(u\)的每个子节点\(v\),把\(v\)子树内的节点记录下来,得到答案并更新数组。容斥:把\(u\)子树内的节点都记录下......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(9)
    Preface最后一场HDU多校了,前期一直犯病但也堪堪签了前六题,但后期又是酣畅淋漓的后期三开三卡我写04,祁神写09,徐神写10,最后一个没调出来,赛后祁神和徐神都发现了很多修改点但因为题目还没公开、数据和题解也没法,就先坑着之后再来补了树异或价值首先不难发现\(k\)位这个限......
  • 基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
    目录1.算法运行效果图预览2.算法运行软件版本3.部分程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览(完整程序运行后无水印)将FPGA的仿真结果导入到MATLAB中,分别得到MATLAB的结果和FPGA的结果:2.算法运行软件版本vivado2019.2matlab2022a3.部分程序......
  • 算法笔记——可持久化线段树
    维护历史值当要修改一个节点时,把跟他有关的线段树中所有节点舍弃,并建立新节点连接.代码如下:#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+5;intn,m,a[N],root[N],top;structnode{ intl,r,val;}t[N*40];intclone(intx)//新建节点{ top++; t......
  • 力扣面试经典算法150题:找出字符串中第一个匹配项的下标
    找出字符串中第一个匹配项的下标今天的题目是力扣面试经典150题中的数组的简单题:找出字符串中第一个匹配项的下标题目链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/?envType=study-plan-v2&envId=top-interview-......
  • 数据结构(C++版)——顺序表
    一、顺序表有关的基本操作1、InitList(&L):初始化线性表,构造一个空的线性表L2、DestroyList(&L):销毁线性表L3、ClearList(&L):将线性表L重置为空表4、ListEmpty(L):若L为空表,则返回TURE,否则返回FALSE5、GetElem(L,i,&e):用e返回L中第i个数据元素的值6、LocateElem(L,e):在线性......