贪心算法解决最少圆覆盖最多点问题
海面上有一些船需要与陆地进行通信,需要在海岸线上布置一些基站。现将问题抽象为,在x轴上方,给出N条船的坐标 ,在x轴上安放的基站可以覆盖半径为d的区域内的所有点,问在x轴上至少要安放几个点才可以将x轴上方的点都覆盖起来。试设计一个算法求解该问题,并分析算法的正确性。
解:
设计思路:
首先将所有的点按横坐标升序排序。
点集非空时,每次取出横坐标最小的点,将该点视做左半圆周上的点,取距离该点横坐标为d的x轴上的点作为圆心,从圆心处以d为半径作圆(圆心坐标在该点坐标右侧),然后去除掉包含在该圆内的点。然后继续选出剩下点中横坐标最小的点,重复以上操作,直至将所有点包括到圆中,表示所有点都被覆盖,此时得出的圆的个数就是该问题的最优解。
先把点按X轴排序 求出能覆盖每条船的点在X轴上的区间。从最左边的点开始,如果下一个点的左区间比现在的右区间还大,就要新的基站;如果下一个的右区间小于现在的右区间,需要将现在的右区间更新为小的,因为必须覆盖所有点。
如果新圆心的坐标在前一个圆心坐标左侧,那么就舍弃前一个圆心坐标,相反,则表明该圆心成立,通过这种方法,可以使一个圆尽可能覆盖周围的点,局部最优,重复每次操作,则满足全局最优