分治算法——平面点问题(使用数组实现)

分治法-最接近点对问题 背景: 计算机应用中经常采用点、圆等简单的几何对象表示物理实体,常需要了解其邻域中其他几何对象的信息 例如:在空中交通控制中,若将飞机作为空间中的一个点来处理,则具有最大碰撞危险的两架飞机所处的点对,就是这个空间中距离最接近的一对点。 这类问题是计算几何学中研究的基本问题之一。 我们着重考虑平面上的最接近点对问题。 最接近点对问题: 给定平面上的n个点,找出其中的一对点,使得在n个点组成... 阅读详情

目录

题目:二维最接近点对问题

暴力算法:

算法原理:

算法复杂度:

分治算法:

第一版:

算法原理:

算法复杂度:

C代码:

第二版:

算法原理:

算法复杂度:

C代码:


题目:二维最接近点对问题

【问题描述】

给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。

【输入形式】

第一行一个整数n,表示点的个数。

接下来n行,每行两个整数x,y,表示一个点的行坐标和列坐标。

1<=n<=1e5,0<=x,y<=1e9。

【输出形式】

仅一行,一个实数,表示最短距离,四舍五入保留2位小数。

【样例输入】

4
0 0
0 1
1 0
1 1

【样例输出】

1.00

老师要求:递归算法里不可以出现排序!!!!!!!!!!!!

暴力算法:

算法原理:

求出每两个点之间的距离,选出最小的

算法伪码:

输入:点集P()(一个二维数组,例:P[0][0]代表第一个点的x,P[0][1]代表第一个点的y)

1.定义最小距离dist为第一个点到第二个点的距离

2.两层for循环遍历更新dist的值

3.返回dist

算法复杂度:

时间复杂度:O(n^{2})

空间复杂度:C_{n}^{2} 由于本题n<1e5,C_{n}^{2}<C_{1e5}^{2}=4,999,950,000 

double baoli(double a[][2],int n) {//暴力算法
	
	int dist = getdist(a[0],a[1]);
	for (int i = 0; i < n; i++) {
		for (int j = i+1; j < n; j++) {
			dist =smaller( dist,getdist(a[i], a[j]));
		}
		
	}
	return dist;
}

分治算法:

这里转载一篇个人讲的蛮好的文章:平面点对问题(分治法的经典问题)_给定n个点,其坐标为 ( xi,yi ) ( 0£i£n-1 ) ,要求使用分治策略求解,设计算-优快云博客

第一版:

算法原理:

把点集P划分为L和R(L、R大小相等),分别计算L和R中最近点对的距离,计算L和R中距离最近点对的距离。

算法伪码:

Mindistance(P,l,r)

输入:点集P(二维数组,P[i][0]代表第i个点的x,P[i][1]代表第i个点的y), l和r分别为点集P(数组)的左下标和右下标

输出:最近点对的距离d

1.if 点少于三个 直接计算并比较

2.根据X值的大小对P进行排序(个人选用)

3.做中垂线m(m=(l+r)/2),把点集P划分为L和R(L、R大小相等)

4.d1=Mindistance(P,m,r)

5.d2=Mindistance(P,l,m)

6.d=d1和d2中较小的值

7.计算m两侧不超过d范围内的点(理论上不会超过6个 )之间的最近距离d3。若d3小于d,更新d=d3。

算法复杂度:

时间复杂度:O(nlogn)                                                                                                                 

空间复杂度:O\left ( n\right )

试了好多遍,老是有一个测试用例不过,于是放出第二个纠错大招,输出数据,以查看其变化过程。我错的是感叹号部分。提醒一下自己注意细节!!!!!

C代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <cmath> 
using namespace std; 

int Partition(double a[][2], int l, int r) {//初始化待划分区间
	int i = l, j = r;
	double pivot0 = a[l][0];//挖坑法  pivot坑
	double pivot1 = a[l][1];
	//cout<< "in Partition1" << endl;///////////
	//for (int i = l; i <= r ; i++) {
	//	cout<< "a[" << i << "][0]:" << a[i][0] << " " << "a[" << i << "][1]:" << a[i][1] << endl;////////////////////
	//}
	while (i < j)
	{		//右侧扫描
		while (i < j && a[j][0]>= pivot0)
		{
			j--;//找到小的
		}
		if (i < j)//左小于右
		{
			double tempx = a[i][0];
			a[i][0] = a[j][0];
			a[j][0] = tempx;
			double tempy = a[i][1];
			a[i][1] = a[j][1];
			a[j][1] = tempy;			
			i++;
		}

		while (i < j && a[i][0] <= pivot0)
		{
			i++;
		}
		if (i < j)
		{
			double tempx = a[i][0];
			a[i][0] = a[j][0];
			a[j][0] = tempx;
			double tempy = a[i][1];
			a[i][1] = a[j][1];
			a[j][1] = tempy;
			j--;
		}
	}
	//cout<< "in Partition2" << endl;////////////////////
	//for (int i = l; i <= r ; i++) {
	//	cout<< "a[" << i << "][0]:" << a[i][0] <<" "<< "a[" << i << "][1]:" << a[i][1] << endl;////////////////////
	//	//cout << "a[i][0]: " << a[i][0] << " " << "a[i][1]: " << a[i][1] << endl;////////////
	//}
	a[i][0] = pivot0;
	a[i][1] = pivot1;
	//cout << "in Partition3" << endl;/////////////////
	//for (int i = l; i <= r ; i++) {
	//	cout << "a[" << i << "][0]:" << a[i][0] << " " << "a[" << i << "][1]:" << a[i][1] << endl;////////////////////
	//}
	return i;
}

//进行快速排序
void qst(double a[][2], int l, int r) {	

	//cout << "in qst1" << endl;////////////////////
	//for (int i = l; i <= r; i++) {
	//	cout << "a[" << i << "][0]:" << a[i][0] << " " << "a[" << i << "][1]:" << a[i][1] << endl;////////////////////
	//}
	if (l < r)
	{
		double pivot = Partition(a ,l, r);
		qst(a, l, pivot - 1);
		qst(a, pivot + 1, r);
	}
}

double smaller(double a,double b) {
	return a<b ? a : b;
}
double getdist(double a[], double b[]) {
	double ans = sqrt(pow(a[0] - b[0], 2) + pow(a[1] - b[1], 2));
	return ans;
}
double MinDistance(double a[][2],int l ,int r ) {
	int n = r+1 - l;//右+1-左
	int m = (l+r)/2;
	double distance = 0.0;//
	 if (n == 2) {//两个点
		distance = getdist(a[0], a[1]);
	}
	else if (n == 3) {//三个点
		double d1= getdist(a[0], a[1]);//点0,1
		double d2= getdist(a[2], a[1]);//点2,1
		double d3= getdist(a[0], a[2]);//点0,2
		double d4 = smaller(d1, d2);
		distance = smaller(d4, d3);
	}
	else { //划分
		int lb=m,rb=m;
		double e1 = MinDistance(a,l,m );
		double e2 = MinDistance(a,m,r);
		distance = smaller(e1, e2);
		while (lb>=l && abs(a[lb][0]-a[m][0])<distance) { //从中垂线向两边找区间
			lb--;//m--
		}
		while (rb<=r && abs(a[rb][0] - a[m][0]) < distance) {
			rb++;//m++
		}
		lb += 1;
		rb -= 1;
		for (int i = lb; i <= rb-1; i++) {
			for (int j = i + 1; j <= rb;j++) {
				if (a[i][1] - a[j][1] <=distance) {//德尔塔y<mindistance
					distance = smaller(getdist(a[i], a[j]), distance);
				}
			}
		}
	}
	return distance;
}
int main() {     //
	int n;
	double d = 0.0;
	double a[100000][2] = { 0 };//a[][0]x,a[][1]是y
	cin >> n;
	for (int i = 0; i < n; i++) {
		scanf("%lf %lf",&a[i][0],&a[i][1]);
	}
	
	qst(a,0,n-1);//n元素个数 !!!!!!!!!!n-1
	//for (int i = 0; i < n; i++) {
	//	cout << "a[" << i << "][0]:" << a[i][0] << " " << "a[" << i << "][1]:" << a[i][1] << endl;////////////////////
	//}
	//cout << endl;///////////////////////////
	d=MinDistance(a, 0, n-1);
	printf("%.2f\n", d);
	
	return 0;
}


第二版:

算法原理:

把点集P划分为L和R(L、R大小相等),分别计算L和R中最近点对的距离,计算L和R中距离最近点对的距离。

算法伪码:

Mindistance(P,l,r)

1.输入:点集P(二维数组,P[i][0]代表第i个点的x,P[i][1]代表第i个点的y,P[i][2]代表第i个点按Y值大小排序的顺序), l和r分别为点集P(数组)的左下标和右下标,并将P[i][2]赋值为i

2.将数组P按照x的大小进行升序排序(使用快排)

3.将数组P按照y的大小进行升序排序(使用快排)得到的顺序保存在P[i][2]

4.调用Mindistance

if 点少于三个 直接计算并比较

做中垂线m(m=(l+r)/2),把点集P划分为L和R(L、R大小相等)

d1=Mindistance(P,m,r)

d2=Mindistance(P,l,m)

d=d1和d2中较小的值

从m分别向左和向右找距离m两侧不超过d的点,得到左边界lb和右边界rb

遍历,用数组b有序存放中线右边的y,

遍历中线左边的点,定义lk为b索引,初始化为0,以b[lk]做索引,遍历m和rb之间的点(由原理可知,符合条件右边点的数目小于6,遍历次数小于6),计算中线左边的点和右边点之间的距离d3。若d3小于d,更新d=d3。

输出:最近点对的距离d

算法复杂度:

时间复杂度:O\left ( nlog n\right )                                                                                                                 

空间复杂度:O\left ( n\right )

C代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <cmath> 
using namespace std; 
void swap(double& a, double& b) {
	double temp = a;
	a = b;
	b = temp;
}
int Partition1(double a[][3], int l, int r) {//初始化待划分区间
	int i = l, j = r;
	double pivotx = a[l][0];//挖坑法  pivot坑简化版
	double pivoty = a[l][1];
	
	
	while (i < j)
	{		//右侧扫描
		while (i < j && a[j][0]>= pivotx)
		{
			j--;//找到小的
		}
		if (i < j)//左小于右
		{
			swap(a[i][0], a[j][0]);
			swap(a[i][1], a[j][1]);
			i++;
		}

		while (i < j && a[i][0] <= pivotx)
		{
			i++;
		}
		if (i < j)
		{
			swap(a[i][0], a[j][0]);
			swap(a[i][1], a[j][1]);
			j--;
		}
	}
	a[i][0] = pivotx;
	a[i][1] = pivoty;

	

	return i;
}


//进行快速排序
void qst1(double a[][3], int l, int r) {	

	
	if (l < r)
	{
		double pivot = Partition1(a ,l, r);
		qst1(a, l, pivot - 1);
		qst1(a, pivot + 1, r);
	}
}
int Partition2(double a[][3], int l, int r) {//初始化待划分区间
	int i = l, j = r;
	double pivot = a[l][1];//第一个数的Y
	int index = a[l][2];//a[][3]记录按Y排序的点顺序,最左边数的Y顺序
	
	

	while (i < j)
	{		//右侧扫描
		while (i < j && a[j][1] >= pivot)
		{
			j--;//找到小的
		}
		if (i < j)//左小于右
		{
			swap(a[i][2], a[j][2]);
		}

		while (i < j && a[i][1] <= pivot)
		{
			i++;
		}
		if (i < j)
		{
			swap(a[i][2], a[j][2]);
		}
	}
	a[i][2] = index;

	

	return i;
}
//进行快速排序
void qst2(double a[][3], int l, int r) {

	
	if (l < r)
	{
		double pivot = Partition2(a, l, r);
		qst2(a, l, pivot - 1);
		qst2(a, pivot + 1, r);
	}
	//cout << "in qst2" << endl;////////////////////
	//for (int i = l; i <= r; i++) {
	//	cout << "a[" << i << "][2]:" << a[i][2] << endl;////////////////////
	//}
}
double smaller(double a,double b) {
	return a<b ? a : b;
}
double getdist(double a[], double b[]) {
	double ans = sqrt(pow(a[0] - b[0], 2) + pow(a[1] - b[1], 2));
	return ans;
}
double MinDistance(double a[][3],int l ,int r ) {
	int n = r+1 - l;//右+1-左
	int m = (l+r+1)/2;
	double distance = 0.0;//
	 if (n == 2) {//两个点
		distance = getdist(a[0], a[1]);
	}
	else if (n == 3) {//三个点
		double d1= getdist(a[0], a[1]);//点0,1
		double d2= getdist(a[2], a[1]);//点2,1
		double d3= getdist(a[0], a[2]);//点0,2
		double d4 = smaller(d1, d2);
		distance = smaller(d4, d3);
	}
	else { //划分
		int lb=m,rb=m;
		double e1 = MinDistance(a,l,m );
		double e2 = MinDistance(a,m,r);
		distance = smaller(e1, e2);
		while (lb>=l && abs(a[lb][0]-a[m][0])<distance) { //从中垂线向两边找区间
			lb--;//从m--
		}
		while (rb<=r && abs(a[rb][0] - a[m][0]) < distance) {
			rb++;//从m++
		}
		lb += 1;
		rb -= 1;

		int inde = 0;
		int* b = new int[rb - m + 1];
		for (int i = 0; i < n; i++) {
			if (a[i][2] >= m && a[i][2] <= rb) {
				b[inde] = a[i][2];//b有序存放中线右边的y
				inde++;
			}
		}
		for (int i = lb; i < m; i++) {// 遍历中线左边的点
			int lk = 0;//lk:y的排序 0-rb - lb + 1
			while (abs(a[b[lk]][1] - a[i][1]) > distance && lk < rb - m + 1) {
				lk++;
			}
			int t = 0;
			while (lk < rb - m + 1 && t < 6) {
				distance = smaller(getdist(a[i], a[b[lk]]), distance);
				lk++;
				t++;
			}
		
		}
		
		delete[] b;
		
	}
	return distance;
}
int main() {     //
	int n;//元素个数
	double d = 0.0;
	double a[100000][3] = { 0 };//a[][0]x,a[][1]是y
	cin >> n;
	for (int i = 0; i < n; i++) {//输入
		scanf("%lf %lf",&a[i][0],&a[i][1]);
		a[i][2] = i;
	}
	
	qst1(a, 0, n - 1);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!n-1
	qst2(a, 0, n - 1);

	//for (int i = 0; i < n; i++) {
	//	cout<<"all:" << endl;
	//	cout << "a[" << i << "][0]:" << a[i][0] << " " << "a[" << i << "][1]:" << a[i][1] << " a[" << i << "][2]:" << a[i][2] <<endl;////////////////////
	//}
	//cout << endl;///////////////////////////

	d=MinDistance(a, 0, n-1);
	printf("%.2f\n", d);
	return 0;
}

平面最近点对 平面上的分治法 题目链接: https://www.luogu.org/problemnew/show/P1429 题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n;2≤n≤200000 接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。 输出格式: 仅一行,一个实数,表... 阅读详情

相关推荐

最接近点对-分治法-C++实现

算法思想 本实验使用了分治法的算法思想,所谓分治,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 因此使用分治法解决问题一般有以下三个步骤: 分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。 解决:递归的求解子问题,当子问题的规模足够小时,停止递归直接求解。 合并:将子问题...

lxx909546478的博客 3387

[分治]平面最近点对(加强版) 洛谷P1429

题目描述 给定平面上 n 个点,找出其中的一对点的距离,使得在这 n 个点的所有点对中,该距离为所有点对中最小的 输入格式 第一行:n ,保证 2≤n≤200000 。 接下来 n 行:每行两个实数:x y ,表示一个点的行坐标和列坐标,中间用一个空格隔开。 输出格式 仅一行,一个实数,表示最短距离,精确到小数点后面 4 位。 输入输出样例 输入 #1 3 1 1 1 2 2 2 输出 #1 1.0000 说明/提示 数据保证 0≤x,y≤109 题意: 显而易见,这道题需要

Cloth的博客 2741

超详细的凸包问题的分治算法说明及C++实现

题目要求: 输入数字, 再输入点(x,y); 以顺时针方向输出最外侧的点, 使外侧的点组成的多边形能包含所有的输入点参考: &lt;算法设计与分析&gt; 第122-123页准备步骤: 首先, 将输入点按x轴从小到大排序, 如果x相同,则按y排序这时候, 我们就能得到p[0]和p[n-1]的直线, 将求解凸包问题分解为求解上凸包和下凸包两个问题.这里以上凸包为例, 我们要找到一个点Pmax, 使三...

EcsoBaby 1万+

分治算法解决最短距离问题

分治算法解决最短距离 题目:题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入格式 第一行:n;2≤n≤200000 接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。 输出格式 仅一行,一个实数,表示最短距离,精确到小数点后面4位。 输入输出样例 输入 #1 3 1 1 1 2 2 2 输出 #1 1.0...

JobinXin的博客 5239

【算法导论学习】分治法求最大子数组

最大子数组分治法问题分析方向对时间复杂度的分析样例分析问题分析分解问题解决问题合并问题对代码的设想中间部分的处理递归部分完整代码 分治法 所谓分治法,就是把问题不断分割变小,常见的是把数组分割为两部分,然后分别计算,将大问题变成小问题。 问题分析方向 这一类问题主要用的是递归的方法,所以时间复杂度普遍为O(nlogn) 对时间复杂度的分析 样例分析 接下来分析最大子数组问题 问题分析 分解问题...

Alivorth的博客 6720

计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

本文全文原创 转载请注明出处 http://blog.youkuaiyun.com/lytning/article/details/25370169 平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 {     double ans; //answer     0)    调用前的预...

Lytning's Blog 1万+

java最近点对分治算法_分治算法——最近点对问题

#include#include#includeusing namespacestd;/*存储点的结构*/typedefstruct{float x,y; //点的x,y坐标}POINT;/*辅助的点结构*/typedefstruct{int index; //点在X数组中的下标float x, y; //点的x,y坐标}A_POINT;/*对点进行递增顺序排序的比较*...

weixin_39544101的博客 407

平面最近点对问题分治算法解答,C++实现

平面最近点对问题分治算法解答,C++实现,代码整洁规范。

Tree 园丁的烦恼 (CDQ分治+树状数组)

很久很久以前,在遥远的大陆上有一个美丽的国家。统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草。有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思索一个问题,如果我们把花坛摆成六个六角形,那么……” “那么本质上它是一个深度优先搜索,陛下”,园丁深深地向国王鞠了一躬。 “嗯……我听说有一种怪物叫九头蛇,它非常贪吃苹果树……” “是的,显然这是一道经典的动态...

永夜莫明的博客 328

Doris + Iceberg 实现高效数据湖分层:架构解析与最佳实践

本文深入解析了如何利用Doris与Iceberg构建高效的数据湖冷热分层架构。通过将高频访问的热数据存储在Doris中以实现毫秒级查询,同时将历史冷数据归档至低成本的Iceberg存储,该方案在保障查询性能的同时显著降低了总体拥有成本。文章详细阐述了从架构设计、自动化迁移到统一查询的最佳实践,为应对海量数据下的成本与性能平衡提供了实战指南。

weixin_29207533的博客 135

LTSPICE使用教程:导入第三方库模型进行仿真

LTSPICE导入第三方SPICE模型进行仿真,以英飞凌的第三方.lib模型为实例进行详解

焊武大帝的专栏 3万+

天使玩偶(CDQ分治+最小曼哈顿距离)

天使玩偶 题意:有两种操作: 给二维平面上加入一个点 询问二维平面上到某个点最近的一个点(用曼哈顿距离来表示) 思路:标准的CDQ分治,离线处理两种操作 当想到CDQ分治后本题的重点在于如何处理曼哈顿距离,毕竟看到绝对值都头疼 我们最希望的是能去掉绝对值!这里有一种处理方法:我们只考虑每个询问点左下角的点,则显然可以去掉绝对值,用普通的CDQ分治,按照xxx坐标排序,按照yyy坐标将x+yx...

UniverseofHK的博客 514

随机森林模型及案例(Python)

1 集成模型简介 集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。 集成学习模型的常见算法有Bagging算法和Boosting算法两种。 Bagging算法的典型机器学习模型为随机森林模型,而Boosting算法的典型机器学习模型则为AdaBoost、GBDT、XGBoost和LightGBM模型。 1.1 Bagging算法简介 Bagging算法的原理类似投票,每个弱学习器都有一票,最终根据所有弱学习器的投

qq_42433311的博客 4万+

【题解】Radio stations Codeforces 762E CDQ分治

虽然说好像这题有其他做法,但是在问题转化之后,使用CDQ分治是显而易见的 并且如果CDQ打的熟练的话,码量也不算大,打的也很快,思维难度也很小 没学过CDQ分治的话,可以去看看我的另一篇博客,是CDQ分治的入门教程 下面是正文: 首先整理一下条件: 每个点有三个属性,x,r,f 统计有多少对点i,j满足 min(ri,rj) >= |xi-xj| 且 |fi-fj| <= ...

weixin_34186931的博客 207

芯片测试中的DC与AC模式详解:如何选择最适合你的测试方案?

本文深入解析了芯片测试中DC(直流)与AC(交流)模式的核心差异与互补性。DC测试关注静态电气特性,如固定型故障;而AC测试则聚焦于芯片在额定工作速度下的动态时序行为。文章从VLSI设计、电路模块、成本约束、可测试性设计和应用场景五大维度,提供了如何根据工艺节点、工作频率及具体需求,在testMode配置、时钟复位策略和输入输出接口设计中,平衡两种测试模式以制定最优方案的决策框架。

bb456的博客 1086

多模型对抗性审查:用AI辩论提升技术文档质量

在软件工程领域,技术文档是团队协作和项目成功的关键基础。传统的文档评审依赖人工经验,存在盲区和效率瓶颈。通过引入多模型对抗性审查机制,不同大语言模型从各自视角对文档进行批判性分析,模拟现实中的专家评审过程。这种技术方法的核心价值在于利用模型间的思维差异,自动发现单个视角容易忽略的边界情况、逻辑漏洞和隐含假设。在应用场景上,特别适合产品需求文档和技术规格书这类需要多角度审视的复杂文档。adversarial-spec工具通过Claude协调多模型辩论,实现从概念到实现的完整文档质量保障,显著提升文档的完整性和

weixin_42531579的博客 379

算法之分治法解决平面最近点对问题

问题描述: 给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小。严格地说,最接近点对可能多于1对。为了简单起见,这里只限于找其中的一对。 思路: 设S中的点为平面上的点,它们都有2个坐标值x和y。为了将平面上点集S线性分割为大小大致相等的2个子集S1和S2,我们选取一垂直线l:x=m来作为分割直线。其中m为S中各点x坐标的中位数。由此将S分割为S1={p∈S|px≤m}和...

阿宁的博客 3413

MicroPython跨平台移植实战:从源码解析到STM32+FreeRTOS部署

本文详细解析了MicroPython的跨平台移植实战,重点介绍了如何将其从源码开始,成功部署到STM32微控制器并运行于FreeRTOS实时操作系统。内容涵盖源码结构解析、编译环境搭建、内存管理协调、FreeRTOS任务集成、数学库(math)启用与优化,以及自定义模块开发等核心步骤,为开发者提供了一套完整的、可操作的嵌入式Python移植方案。

vodka的博客 1014

分治法的应用--平面点对最小距离问题

问题描述:一个二维平面内有一些随机分布的点,求这些点之间距离最短的两个点。(问题和图片均出自于清华大学网课) 看到这个问题首先想到的应该是暴力解法,即对于每个点,遍历其他所有点求距离。把平面中任意两点的距离都求出来后,取其中的最小值。但是这个算法的时间复杂度为O(n^2),当数据量较大时是无法接受的。 于是我们想到了分治法,可不可以将问题化简为求几个规模减小的子问题呢,答案是可以的,我们可以根据平面中的点的x坐标或y坐标将它们分为数目大致相等的两部分。这里我们以x坐标举例,如图: 我们可以在分治之

m0_54123999的博客 4709

YOLO26改进策略【Neck】| 关键点检测:SDFM 表层细节融合模块,利用通道-空间注意力机制,实现深层与浅层特征融合,抑制噪声干扰

本文记录的是利用SDFM 模块改进 YOLO26 的颈部融合部分,专门用于关键点检测。SDFM模块(Surface Detail Fusion Module,表层细节融合模块) 通过在特征提取网络的浅层引入通道-空间注意力机制,动态生成深层与浅层特征融合权重。该模块可自适应保留不同模态中的独特信息,抑制背景噪声与光照干扰,实现低层细节的精准对齐与互补增强,为后续检测提供高保真度的底层特征表示,从而提升模型在复杂场景下的目标检测鲁棒性与定位准确性。Rethinking the necessity of ima

Limiiiing的博客 175

2025年CSP-J初赛真题及答案解析(完整版)

2025年CSP-J初赛真题及答案解析(完整版)

王老师青少年编程 1万+

【算法设计与分析】分治法解决平面点集最接近点对问题(学习笔记)

步骤 用数组X存放平面点集中的元素,数组Y用作辅助数组。 (1)预处理步骤 如果X中的元素个数n小于2,直接返回;否则,转步骤2. 按x坐标的递增顺序排列X中元素;令X中的第一个元素下标为low,最后一个元素的下标为high。 把X中的元素及该元素在X中的位置复制到Y数组中,按y坐标递增的顺序排列Y中元素。 以Y为辅助数组,调用分值算法,计算X中下标为low~high的元素的最接...

勤勉233的博客 3434

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【算法学习】分治篇:分治算法的类型和解题详解

【算法学习】分治篇:关于分治算法的详细讲解,欢迎各位大佬到访!!

2301_80220607的博客 3116

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

分治法求解平面最近点对问题

平面最近点对问题描述分治求解 问题描述 给出一个平面内的若干个点,问这些点两两之间的最近距离是多少 弱数据题目链接 暴力自不必说,两个forforfor挨个看,时间复杂度是O(n2)O(n^2)O(n2),可以通过数据较小的测试 分治求解 数据加强题目链接 这里我们可以回忆一下归并排序是怎么做的,如何达到O(nlogn)O(nlogn)O(nlogn)的时间复杂度,采用的即是分治思想,也就是把一组数据对半分成两部分,继续划分,直至最小,排序拼回原数组,再排序,再拼回,直至全部排序完成 那么借助这个想法

ComingLiu的博客 1595

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

算法第三周:平面最近点对(分治算法)

平面最近点对(分治算法),给定 n 个平面上的点,求最近两个点的编号分治思想: 将P平⾯划分为点个数⼤致相等的两个平⾯ 。把所有点按照x轴坐标升序排序,然后在正中间的位置画一条线,把点分成两个子集P1​和P2,P1和P2分别位于线的左侧和右侧

qq_26952443的博客 7648

【算法】最接近点对问题(递归与分治)

【算法】最接近点对问题(递归与分治) 题目 【问题描述】给定二维平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。使用递归与分治策略求解二维平面上的最接近点对问题。假设所有点的集合为S,m为S中所有点的x坐标的中位数,垂直线x=m将集合S均匀分割为左右两个子集合S1和S2。 【输入形式】在屏幕上输入点的个数,以及所有点的x和y坐标。 【输出形式】第一次分割时,将所有点集合S分割为左右两个子集合S1和S2,分别输出左右子集合S1和S2,以及所有点集合S的最接近点对的距离以及最接近

Lenard404的博客 3654
上一篇: 判断出栈序列是否合法Java
下一篇: Java类和对象实验
fqq3
博客等级 码龄4年 114粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值