平面上最近点对

 OJ:P1429 平面最近点对(加强版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

非常详细的博客:平面上最近点对 - 洛谷专栏 (luogu.com.cn)

更正式的文章:平面最近点对 - OI Wiki

这也是我们算法课的一个实验。不过我做的不好,我只会简单的分治,中间区域合并时用的还是蛮力QAQ。

分治学好后,难点其实在合并这里的处理。(直接想极端情况吧,所有点的x都相同)

————————

图解总思路:

1.分治:

————

2.中间处理部分:

(注意我们是用序号排的序,二分也是根据序号二分)

这个中线可以是“mid点”

理解:

其实极端情况就是存在更近点对且mid离他们很远。注意这两个点的x和y都是很近的,距离小于d,而他们离mid的x也绝对都小于d,所以是在范围内的。

所以这个2d其实可以再缩减,mid向右d 与 mid+1向左d 的交集 ,如果是mid或者mid+1能有更近点对,那么这个d是足够的,再远点x都大于d了。

————

3.中间合并部分

对于每个左边的点比如P,最多检查右边这六个点。

其实最多五个,右边三个距离肯定大于d了。

但如何做到高效比较呢,只能将中间部分左右的所有点排个序,一起比了。

根据y坐标排序,

每个点比后面的点,直到纵坐标之差超过d。

排序O(nlongn) , 比较O(5n)  (这里比较只比自己下面的,左边也可能下面也有一个d,见下图)

合并部分每次总的就是O(nlongn + n)

如果每次都这样的话,总的其实是 O( (nlogn+n) *  logn )

可以进一步优化:

前面排好,直接给后面用。 可能会多循环一些点,但是消耗远比排序小。

(这样做就不是先找点,排序,比较了,而是排序,合法点,比较。注意第一层循环和mid的x距离超了就不用比了,不在范围内)

合并部分每次就是O(n)了

总的合并部分就是O(n*logn)了

————

总的时间复杂度:

排序加上分治的时间复杂度结果为 2nlongn + n ,即 nlongn

参考代码:

其实全程跟mindis比就可以。

#define ll long long
#define endl "\n"
//#define int long long
#define PII pair<int,int>
const int maxn = 100000;

struct Point
{
	int x, y;
};

double mindis = DBL_MAX;

void distance(const Point& a, const Point& b)
{
	mindis = min(mindis,sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2)));
}

vector<Point>arr,arr2,tmp;
pair<Point, Point> closestPair;

void fmerge(int l, int r)
{
	double dis = DBL_MAX;

	if (l == r)
		return;
	else if (l + 1 == r)
	{
		if (arr2[l].y > arr2[r].y)
			swap(arr2[l], arr2[r]);

		return;
	}
	

	int m = l + ((r - l) >> 1);
	fmerge(l, m);
	fmerge(m + 1, r);

	int al = l, bl = m + 1,tot = l;
	while (al <= m && bl <= r)
	{
		if (arr2[al].y < arr2[bl].y)
			tmp[tot++] = arr2[al++];
		else
			tmp[tot++] = arr2[bl++];
	}
	while(al <= m)
		tmp[tot++] = arr2[al++];
	while(bl <= r)
		tmp[tot++] = arr2[bl++];
	for (int i = l; i <= r; i++)
		arr2[i] = tmp[i];


	for (int i = l; i < r; i++)
	{
		//mid
		if(abs(arr2[i].x - arr[m].x)<mindis)
		for (int j = i + 1; j <=r  && tmp[j].y - tmp[i].y <= mindis; j++)
		{
			distance(tmp[i], tmp[j]);
		}
	}

	return;
}

void findTwoPointsWithTheShortestDistance()
{
	int size = arr.size();
	sort(arr.begin(), arr.end(), [&](const Point& a, const Point& b) {
		if (a.x == b.x)
			return a.y < b.y;//return a.y <= b.y;
		return a.x < b.x;
		}
	);
	arr2 = arr;
	tmp = vector<Point>(arr.size());
	fmerge(0, size - 1);
}

void solve()
{
	int n;
	cin >> n;
	arr = vector<Point>(n);
	for (int i = 0; i < n; i++)
	{
		int a, b;
		cin >> a >> b;
		arr[i] = { a,b };
	}

	findTwoPointsWithTheShortestDistance();
	//cout << mindis << endl;
	printf("%.4lf", mindis);
}

signed main()
{

	//ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	solve();



	return 0;
}

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

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

相关文章

深圳比创达电子EMC|什么是人体静电

当人体与衣物或其他物体发生相互摩擦时&#xff0c;由于各种材料对电子的束缚能力不同&#xff0c;导致电子从一种物质转移到另一种物质。这种电子的转移现象使得人体带上了静电。 如果我们无法及时有效地释放身上积聚的电荷&#xff0c;静电就会在人体表面积聚。这通常发生在…

问题、目标与实现

这是2022年初写的。 目录 一、要点 二、难点 ​编辑 三、痛点 四、近点 五、远点 ​编辑 六、细点 6.1 裸机构建 6.1.1 资源、人员、工时 6.1.2 说明 6.2 文档整理 6.2.1 资源、人员、工时 6.2.3 说明 6.3 项目助理 6.4 独立测试环境、演示环境和压力测试 6.5 SC…

Vue3 组合式 API

Vue3 组合式 API&#xff08;Composition API&#xff09; 主要用于在大型组件中提高代码逻辑的可复用性。 传统的组件随着业务复杂度越来越高&#xff0c;代码量会不断的加大&#xff0c;整个代码逻辑都不易阅读和理解。 Vue3 使用组合式 API 的地方为 setup。 在 setup 中…

第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组

试题 C: 好数 时间限制 : 1.0s 内存限制: 256.0MB 本题总分&#xff1a;10 分 【问题描述】 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上 的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &…

ELK日志分析系统(下)

继上篇&#xff0c;继续对kibana进行部署实现&#xff01; 一、ELK Kibana 部署&#xff08;在 Node1 节点上操作) 1.1 安装 Kibana #上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 cd /opt rpm -ivh kibana-5.5.1-x86_64.rpm 1.2 设置 Kibana 的主配置文件 vim /etc/kib…

阿里云微调chatglm3-6b---只有一个python解释器但gradio要求版本不兼容怎么办

安装LLAMA参考博文http://t.csdnimg.cn/6yYwG 在用LLAMA微调大模型的时候总是出现connected error out并且出现这样的界面 这是由于LLMA所要求的gradio版本>4.0.0,<4.2.0&#xff0c;然而chatglm3-6b要求的gradio版本需要gradio3.39.0才能显示出web_demo_gradio.py渲染…

idea 中运行spring boot 项目报 Command line is too long的解决办法。

Command line is too long 在这里选择edit configures 选择shrten command line , 选择 jar manifest 运行即可。

解决程序化刷新EXCEL提示更新外部链接的弹窗问题

解决方法 【信任中心】-> 【消息栏】->勾选如下策略提示 2. 【信任中心】->【外部内容】->启用下面的三项链接 3. 【信任中心】->【宏设置】->启用所有宏

Keysight 86100D 示波器 针对光模块进行眼图测试

Keysight 86100D是一款高性能的宽带宽示波器&#xff0c;主要用于高速数字设计的精确和准确测量&#xff0c;其应用范围从50 Mb/s到超过80 Gb/s。该设备具有高模拟带宽、低抖动和低噪声的卓越性能&#xff0c;能够精确表征光和电气设计1920。86100D DCA-X是其主要型号&#xff…

贝锐蒲公英自研异地组网新技术:远程视频监控,流畅度、清晰度大幅提升

在远程视频监控过程中&#xff0c;若遇到网络带宽若遇到网络波动&#xff0c;如&#xff1a;丢包、高延迟等&#xff0c;往往会导致视频流传输时发生数据丢失或延迟现象&#xff0c;从而严重影响视频画面的清晰度和流畅度。 比如&#xff1a;在公司总部集中监看远程矿山或户外水…

milvus各组件的结构体分析

milvus各组件的结构体分析 各组件启动&#xff0c;需要构建各组件的结构体&#xff0c;一共8个。 runComponent(ctx, localMsg, wg, components.NewRootCoord, metrics.RegisterRootCoord) runComponent(ctx, localMsg, wg, components.NewProxy, metrics.RegisterProxy) run…

spark实验三-spark进阶编程

1&#xff0e;Spark编程统计各地区租房人数 实验目标&#xff1a; (1) 掌握在IntelliJ IDEA 中操作spark程序开发 (2) 打包程序提交集群运行 实验说明&#xff1a; 现有一份某省份各地区租房信息文件 house.txt&#xff0c;文件中共有8个数据字段&#xff0c;字段说明…

面试八股——Spring——AOP与事务

AOP的定义 事务的实现 事务的失效场景 异常捕获处理 下图中由于②导致异常&#xff1a; 原因&#xff1a; 解决办法&#xff1a;自己抛出一个非检查异常&#xff08;具体原因看“抛出检查异常”&#xff09;。 抛出检查异常 由于①出错&#xff0c;导致抛出了检查异常 原因&…

C语言——字符函数与字符串函数

正文开始&#xff1a;在编程过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语⾔标准库中提供了 一系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 1. 字符分类函数 C语⾔中有⼀系列的函数是专门做字符分类的&#…

康姿百德床垫抗干扰设计,保证你和伴侣睡眠不受影响

康姿百德官网价格公开透明&#xff0c;床垫价格合理质量安全可靠 在我们的一生中&#xff0c;睡眠的时间占据我们生活的大部分。在繁忙的一天结束时&#xff0c;没有什么比沉浸在舒适床垫的温柔拥抱中更让人期待的&#xff0c;让您在睡眠过程中释放一整天的疲惫。康姿百德床垫…

AI术语大全:AGI、LLM、GenAI、GPT、ChatGPT和AIGC是什么意思?

讲动人的故事,写懂人的代码 自2022年底ChatGPT在全球AI界闪亮登场以后,你是不是经常听到AGI、LLM、GenAI、GPT和AIGC这几个词,但总是分不清它们到底是什么意思? 今天,我就用简单的话来给你讲讲这些词到底是什么意思。 AI,人工智能(Artificial Intelligence),就是让机…

科技人才的养成之路

引言 在当今科技行业蓬勃发展的背景下&#xff0c;对于高素质科技人才的需求日益增加。科技人才的培养不仅仅是为了满足市场需求&#xff0c;更是为了推动社会的科技创新和发展。正是这些科技人才&#xff0c;推动着科技的边界不断拓展&#xff0c;创造出各种令人瞩目的技术和…

HDFS [MSST‘10] 论文阅读笔记

原论文&#xff1a;The Hadoop Distributed File System (MSST’10) HDFS关键技术要点概览 设计目标&#xff1a;HDFS旨在可靠地存储大型数据集&#xff0c;并以高带宽流式传输这些数据集到用户应用程序。它通过在大量服务器上分布存储和计算资源&#xff0c;使得资源可以随着…

【计算机网络】常用编码方式+例题(曼彻斯特编码、差分曼彻斯特编码...)

常用编码方式例题 常用编码方式练习画出四种编码20221题342015题342013题34 常用编码方式 练习 画出四种编码 20221题34 这个题目的考察是差分曼彻斯特编码。 差分曼彻斯特编码在每个码元的中间时刻电平都会发生跳变。与曼彻斯特编码不同的是&#xff1a;电平的跳变仅代表时钟…

电商技术揭秘二十四:无人仓储与自动化技术

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…