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

大家好,这里是国中之林!
❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←

一.分治法的思想

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

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

二.分治法的步骤

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

三.举个例子

我(你)是一个超级大帅哥,在相亲节目上被许多美女看上.
但是我想找一个身高跟我一样的美女.
于是节目组从低到高的给我排了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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值