218-C++最接近点对问题

本文探讨了一维空间中最接近点对问题的解决方案,并介绍如何使用分治策略来解决二维和三维空间中的类似问题。通过中位数划分数据,将时间复杂度降至O(nlogn),并详细解释了如何找到最小距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.寻找最小差值问题(最接近点对问题)

在一维空间中,可以通过从小到大排序,然后分别算出s1-s0,s2-s1,s3-s2,…,sn-sn-1,分别比较它们的大小,可以得出最小值,但是它只适用于一维空间中,不适用于二维(平面)和三维(空间),所以可以采用分治策略的思想

算法:按照中位数划分成s1和s2区域,就可以使两边的区域的数据个数基本相当,从而使时间复杂度最小(O(nlogn)),在s1、s2中分别找到最小值(d1、d2),还需要找到s1区域的最大值Max,s2区域的最小值Min,然后求d1、d2、Min-Max三者中的最小值

int Paritition(int* br, int left, int right)
{
   
	int tmp = br[left];
	while (left < right)
	{
   
		while (left < right && br[right] > tmp)
		{
   
			--right;
		}
		if (left < right)
		{
   
			br[left] = br[right];
		}
		while (left < right && br[left] <= tmp)
		{
   
			++left;
		}
		if (left < right)
		{
   
			br[right] = br[left];
		}
		br[left] =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值