贪心算法解决最少圆覆盖最多点问题

     贪心算法解决最少圆覆盖最多点问题  

     海面上有一些船需要与陆地进行通信,需要在海岸线上布置一些基站。现将问题抽象为,在x轴上方,给出N条船的坐标 ,在x轴上安放的基站可以覆盖半径为d的区域内的所有点,问在x轴上至少要安放几个点才可以将x轴上方的点都覆盖起来。试设计一个算法求解该问题,并分析算法的正确性。


解:

设计思路:

首先将所有的点按横坐标升序排序。

点集非空时,每次取出横坐标最小的点,将该点视做左半圆周上的点,取距离该点横坐标为d的x轴上的点作为圆心,从圆心处以d为半径作圆(圆心坐标在该点坐标右侧),然后去除掉包含在该圆内的点。然后继续选出剩下点中横坐标最小的点,重复以上操作,直至将所有点包括到圆中,表示所有点都被覆盖,此时得出的圆的个数就是该问题的最优解。

先把点按X轴排序 求出能覆盖每条船的点在X轴上的区间。从最左边的点开始,如果下一个点的左区间比现在的右区间还大,就要新的基站;如果下一个的右区间小于现在的右区间,需要将现在的右区间更新为小的,因为必须覆盖所有点。

如果新圆心的坐标在前一个圆心坐标左侧,那么就舍弃前一个圆心坐标,相反,则表明该圆心成立,通过这种方法,可以使一个圆尽可能覆盖周围的点,局部最优,重复每次操作,则满足全局最优

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值