经典算法:最短点对

news2024/12/24 9:21:47

                                                                          软件架构师何志丹

说明

旧文新发,改了错别字,死链等。尽量保持“原汁原味”。

难点

如何测试。我的解决方式是:a,三种解法,看结果是否一致。b,小数据(100个点),人工排查。第一种方法,暴力法适合小数据。第二种方法:我的改进型。第三种方法:经典方法(分治法)。实验证明1000万数据时,我的算法有优势。

改进


暴力算法,O(n2)。我的改进型要点:先对所有数据按Y排序。只比较y距离小于等于已知最小距离的点对。经典方法:按Y排序,分成两部分,递归调用。合并时只比较距离分界线不超过已知最小距离的点对。
实际证明500万数据以下,我的改进算法明显优于经典算法;1000万数据时,略强于经典算法。

核心源码节选:

double Dis(const CPT& pt1,const CPT& pt2)
{
	return sqrt((double) (pt1.x-pt2.x)*(pt1.x-pt2.x)+(pt1.y-pt2.y)*(pt1.y-pt2.y)+(pt1.z-pt2.z)*(pt1.z-pt2.z) );
}

void InitData(CPT* pts,int iNum)
{
	srand(time(NULL));

	for( int i = 0 ; i < iNum ; i++)
	{
		pts[i].x = rand()%10000;
		pts[i].y = rand()%10000;
		pts[i].z = rand()%10000;
	}
}

double Fun1(CPT* pts,const int iNum)
{
	 double dMinDis = 10000*10000 ;
	for(int i = 0 ; i < iNum ; i++ )
		for( int j = i+1 ; j < iNum ; j++ )
		{
			const double d = Dis(pts[i] , pts[j]);
			if( d < dMinDis)
			{
				dMinDis = d ;
			}
		}
		return dMinDis;
}

class CCmpY
{
public:
	bool operator()(const CPT& pt1,const CPT& pt2)
	{
		return pt1.y < pt2.y ;
	}
};

double Fun2(CPT* pts,const int iNum)
{
	std::sort(pts,pts+iNum,CCmpY() );

	double dMinDis = 10000*10000 ;
	for(int i = 0 ; i < iNum ; i++ )
		for( int j = i+1 ; j < iNum ; j++ )
		{
			const double d = Dis(pts[i] , pts[j]);
			if( d < dMinDis)
			{
				dMinDis = d ;
			}
			if( abs(pts[i].y - pts[j].y )> dMinDis )
			{
				break;
			}
		}
		return dMinDis;
}

double Fun3(CPT* pts,const int iNum)
{
	std::sort(pts,pts+iNum,CCmpY() );

	if( iNum < 100 )
	{
		return Fun1(pts,iNum);
	}

	const int iMid = iNum/2 ;
	const double dMin1 = Fun3(pts,iMid);
	const double dMin2 = Fun3(pts+iMid,iNum-iMid);
	double dMinDis = min(dMin1,dMin2) ;
	for(int i = iMid-1 ; i >= 0 ; i-- )//左集合
	{
		if( abs(pts[i].y - pts[iMid].y ) > dMinDis )
		{
			break;
		}
		for( int j = iMid ; j < iNum ; j++ )//右集合
		{
			const double d = Dis(pts[i] , pts[j]);
			if( d < dMinDis)
			{
				dMinDis = d ;
			}
			if( abs(pts[i].y - pts[j].y )> dMinDis )
			{
				break;
			}
		}
	}
		return dMinDis;
}

测试环境

似乎是WinXP VS2005(VC8)

下载

可通过以下链接下载测试数据,exe,源码(VS2005,VC8)
https://download.csdn.net/download/he_zhidan/10887801

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

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

相关文章

【数据结构】—超级详细的归并排序(含C语言实现)

​ 食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f525;这就不得不推荐此专栏了&#xff1a;C语言 ♈️今日夜电波&#xff1a;斜陽—ヨルシカ 0:30━━━━━━️&#x1f49f;──────── 3:20 …

baichuan2 chat模型sft指令微调数据格式分析

一、前言 百川官网&#xff1a;https://www.baichuan-ai.com/ 模型权重&#xff1a;https://huggingface.co/baichuan-inc/Baichuan2-13B-Chat 记录一下 baichuan 2 的 tokenizer 及 chat 数据构建格式。 二、数据处理代码 根据官方 github 的 finetune 代码&#xff0c;将其…

民企再续“助学故事”,恒昌公益两所“云杉校园”如何聚木成林?

撰稿|多客 来源|贝多财经 “生物世界丰富多彩、五花八门、琳琅满目&#xff0c;可谓大千世界芸芸众生”……这是遵义市正安县安场镇光明完全小学图书馆收藏的一本名为《闯入生物世界》书中所写景象。 在这所学校&#xff0c;课外书籍按照年级及类别进行划分&#xff0c;如一…

M1/M2 Parallels Desktop 19虚拟机安装Windows11教程(超详细)

引言 在Window上VMware最强&#xff0c;在Mac上毫无疑问Parallels Desktop为最强&#xff01; 今天带来的是最新版Parallels Desktop 19虚拟机安装Windows11的教程。 1. 安装Parallels Desktop 19虚拟机 https://blog.csdn.net/weixin_52799373/article/details/133316608 …

RocketMQ 事务消息发送

目录 事务消息介绍 应用场景 功能原理 使用限制 使用示例 使用建议​ 事务消息介绍 在一些对数据一致性有强需求的场景&#xff0c;可以用 RocketMQ 事务消息来解决&#xff0c;从而保证上下游数据的一致性。 应用场景 分布式事务的诉求 分布式系统调用的特点为一个核…

【数据结构】深度剖析最优建堆及堆的经典应用 - 堆排列与topk问题

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;数据结构 &#x1f525;该文章分别探讨了向上建堆和向下建堆的复杂度和一些堆的经典应用 - 堆排列与topk问题。 ❗️该文章内的思想需要用到…

排序学习总结

取每个对象的内接矩形框&#xff0c;然后再排序&#xff0c;根据排序的结果确定原对象顺序。 inner_rectangle1(RegionAffineTrans1, Row1, Column1, Row2, Column2) gen_rectangle1(Rect,Row1, Column1, Row2, Column2) sort_region(Rect,RectSort,character,true, row)count…

Oracle物化视图(Materialized View)

与Oracle普通视图仅存储查询定义不同&#xff0c;物化视图&#xff08;Materialized View&#xff09;会将查询结果"物化"并保存下来&#xff0c;这意味着物化视图会消耗存储空间&#xff0c;物化的数据需要一定的刷新策略才能和基表同步&#xff0c;在使用和管理上比…

【嵌入式】使用嵌入式芯片唯一ID进行程序加密实现

目录 一 背景说明 二 原理介绍 三 设计实现 四 参考资料 一 背景说明 项目程序需要进行加密处理。 考虑利用嵌入式芯片的唯一UID&#xff0c;结合Flash读写来实现。 加密后的程序&#xff0c;可以使得从芯片Flash中读取出来的文件&#xff08;一般为HEX格式&#xff09;不能…

C#WPF命令Command使用实例

本文实例演示C#WPF命令使用实例 定义: 命令(Command):命令表示一个任务单元,并且可跟踪该任务的状态,实际上是实现了ICommand接口的类。然而,命令实际上可以包括任务执行的逻辑代码,也可以不包括从而仅作为联系命令源与命令目标的媒介。比如,WPF 默认的接口实现类Ro…

el-collapse 嵌套中 el-checkbox作为标题,选中复选框与el-tree联动

<el-drawertitle"应用授权":visible.sync"menuDrawer"><el-collapse accordion style"padding: 15px"><el-collapse-item v-for"item in platList"><template slot"title"><el-checkbox v-model…

PostMan、ApiFox等工具Post请求中@RequestParam和@RequestBody的混合使用如何传参

方法签名 PostMapping("/mms/sendAudit")public R sendAudit(RequestParam("mmsId") Long mmsId,RequestParam("ecId") Long ecId,RequestBody(required false) SignMatchRule signMatchRule) {以ApiFox为例子 RequestParam的Params的参数正常…

基于51单片机0.001s精度秒表9.999s仿真设计(源码+仿真+原理图+PCB+报告+器件清单+讲解)

基于51单片机0.001s精度秒表9.999s仿真设计&#xff08;源码仿真原理图PCB报告器件清单讲解 讲解视频1 功能说明&#xff1a;2 仿真电路&#xff1a;3 原理图&#xff1a;4 PCB&#xff1a;5 程序&#xff1a;6 资料清单&&下载链接&#xff1a; 基于51单片机0.001s精度…

2023年【煤气】报名考试及煤气免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 煤气报名考试根据新煤气考试大纲要求&#xff0c;安全生产模拟考试一点通将煤气模拟考试试题进行汇编&#xff0c;组成一套煤气全真模拟考试试题&#xff0c;学员可通过煤气免费试题全真模拟&#xff0c;进行煤气自测…

什么是图像翻译

域(Domain)&#xff1a;一系列具有相同风格的图像集合。 图像翻译(Image Translation)&#xff1a;从一张图像到另一张图像的变换&#xff0c;也是域迁移。 &#xff08;风格迁移、图像上色、图像分割...&#xff09; 图像翻译GAN模型分类 根据作用区域&#xff1a;…

Qt学习_13_可执行文件.exe添加图标/logo

本文简单记录一下如何给Qt生成的exe&#xff08;可执行&#xff09;文件&#xff0c;添加图标/logo 第一步 去选一个你喜欢的图标&#xff0c;下载下来 ByteDance IconPark (oceanengine.com) iconfont-阿里巴巴矢量图标库 第二步 用第一步下载的图片&#xff0c;在线生成一…

python 绘制 graphviz

dot 绘图 python 绘制 graphviz 环境 上一节中在本地安装了 graphviz&#xff0c; python 要想使用还需安装 pip 包 pip install graphvizpython 使用 dot Digraph(comment"My Graph") # 添加一些节点 dot.node("A", "Node A") dot.node(&q…

杭州亚运会开幕式惊现数字人火炬手,动捕设备迸发动画制作新动能

在第十九届亚运会开幕式上&#xff0c;首次出现了“数字人”点火形式&#xff0c;打造了亚运史上首个数字点火仪式&#xff0c;这种点火方式是一种颠覆性创作的同时&#xff0c;这也是裸眼3D技术、现实增强和AI人工智能技术的完美结合。 此次数字火炬手的背后是采用了动捕设备&…

九、完整打印立方体贴图的一个面

从上一节可以看出&#xff0c;打印出来的图片是有背景色的&#xff0c;也就是摄像机位置不对。那应该放在哪里呢&#xff1f; 答案是&#xff1a;给定投影矩阵的 fov 为 90 度以捕捉整个面&#xff0c;且摄像机距离该面的距离是立方体边长的一半。 即、 这里我用的立方体是长度…

it运维监控运维方案主要应用在哪些场景

公司越来越依赖IT基础设施。为了保证业务的高效运行&#xff0c;IT运维监控已经成为公司不可或缺的一部分。本文将详细介绍IT运维监控方案&#xff0c;以及如何优化运维效率&#xff0c;并将其应用于各种场景。 IT运维监控方案 监视系统 监控系统是IT运维监控的基础&#xff…