蛮力算法求解最近对

蛮力算法最近对

问题描述
一个包含n个点的集合中,找出距离最近的两个点。
问题分析:
假设所考虑的点是以标准的笛卡尔坐标形式( x ,y )给出的,两个点pi = ( xi ,yi )和 pj =( xj,yj )之间的距离是标准的欧几里得距离

在这里插入图片描述
显然求解该问题的蛮力算法应该是:分别计算每一对点之间的距离,然后找出距离最小的那一堆。当然为了提高算法的效率,我们并不希望同一对点计算两次距离,所以我们只考虑 i < j 的那些对( pi , pj)。
算法
BruteForceClosePoints( p )
//使用蛮力算法求平面中距离最近的两个点
//输入:一个 n (n >= 2)个点的列表 p , p1 = ( x1,y1 ),… pn = ( xn, yn )
//输出:两个最近点的距离
d <-- ∞
for i <–1 to n -1 do
for j <-- i + 1 to n do
d <-- min( d, sqrt( xi - xj )² + ( yi - yj )²
return d

算法优化
该算法的基本操作就是计算平方根,,整数的平方根大多是无理数,只能对它们近似求解,而计算这些近似数也不是一件轻松的事。实际上,我们可以避免求平方根,只比较其值的本省。因为如果被开方数越小,它的平方根也越小,平方根函数是严格递增的
核心代码

void FindClosest(Postion P[], int n){
	double min = 10000;
	double  d;
	for(int i = 0; i < n - 1; i++){
		for(int j = i + 1; j < n; j++){
			d = (P[i].x - P[j].x)*(P[i].x - P[j].x) + (P[i].y - P[j].y)*(P[i].y - P[j].y);
			if(d < min){
				min = d;
			}
		}
	}
}

代码实现

/*最近对问题*/ 
#include<stdio.h>

struct Postion{
	double x;
	double y;
}P[100];

void BruteForceClosePoints(Postion P[], int n, int *index1, int *index2){
	double min = 10000;
	double  d;
	for(int i = 0; i < n - 1; i++){
		for(int j = i + 1; j < n; j++){
			d = (P[i].x - P[j].x)*(P[i].x - P[j].x) + (P[i].y - P[j].y)*(P[i].y - P[j].y);
			if(d < min){
				min = d;
				*index1 = i;
				*index2 = j;
				
			}
		}
	}
	printf("第%d个点到%d个点距离最短为%lf", *index1 + 1, *index2 + 1, min);
}

int main(){
	int n, index1,index2;
	printf("请输入点个数\n");
	scanf("%d", &n);
	for(int i = 0; i < n; i++){
		printf("请输入第%d个点的xy值\n", i+1);
		scanf("%lf%lf", &P[i].x, &P[i].y);
	} 
	BruteForceClosePoints(P, n, &index1, &index2);
} 

运行结果
在这里插入图片描述
代码分析
算法的时间复杂度为 C(n)= O(n²)
虽然加快了算法执行内层循环的速度,但对算法运行时间的提升只是微乎其微的,并不能改变其渐进效率类型。

总结
写博客是为了一是整理所学知识,亲生写代码的经验,而是为了总结经典算法,三是督促自己努力,懂得越多,越知道自己知识的浅薄,四是希望和他人多多交流,有什么不对的地方大佬们多多指点

  • 11
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
蛮力求解01背包问题的算法思路如下: 1. 枚举所有可能的物品组合。 2. 对于每一个物品组合,计算它们的总重量和总价值。 3. 如果这个物品组合能够放入背包中,且它的总价值比之前的组合更高,就更新最优组合。 4. 最终选出能够放入背包且价值最大的物品组合。 具体实现时,可以使用递归或循环的方式枚举所有可能的物品组合。在每一次枚举的过程中,需要判断这个物品组合是否能够放入背包中。如果能够放入背包中,就计算它们的总重量和总价值,并与之前的组合进行比较,更新最优组合。 以下是使用递归方式实现蛮力求解01背包问题的伪代码: ``` function brute_force_01_knapsack(weights, values, capacity, index, total_weight, total_value, best_value) if total_weight > capacity then return end if total_value > best_value then best_value = total_value end if index >= weights.size() then return end brute_force_01_knapsack(weights, values, capacity, index+1, total_weight+weights[index], total_value+values[index], best_value) brute_force_01_knapsack(weights, values, capacity, index+1, total_weight, total_value, best_value) end best_value = 0 brute_force_01_knapsack(weights, values, capacity, 0, 0, 0, best_value) print(best_value) ``` 其中,`weights` 表示物品的重量数组,`values` 表示物品的价值数组,`capacity` 表示背包的容量,`index` 表示当前考虑的物品的下标,`total_weight` 表示当前物品组合的总重量,`total_value` 表示当前物品组合的总价值,`best_value` 表示当前最优组合的总价值。函数的作用是枚举所有可能的物品组合,并计算它们的总重量和总价值,最终选出能够放入背包且价值最大的物品组合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望北i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值