今天的算法课上主要讲了最近点对的问题,在老师的讲解下对这个问题有了一个基础的认识和了解,这里就先对这个问题做一个简单的总结吧。
最近点对问题介绍:
最近点对问题说来其实很简单,主要就是在二维平面内的n个点中,找出(欧式)距离最近的两个点来。
问题解决思路:
- 计算出二维平面内所有点对(任意两点的组合)之间的距离
- 逐一比较这些距离的大小,找出其中的最短的距离,则这两点即为所求的“最近点对”
分治策略简介:
这里简单介绍一下分治策略的思想:
分治策略求解问题的过程一般可以分为如下三个步骤:
- 分解问题(Divide):
这个步骤将一个问题划分成若干个子问题(注:这些子问题的规模最好是差不多的),这些子问题在形式上和原问题是一样的,只是规模相对来说更小,方便解决。
例如在我国,要对全国总计约13亿的人口进行一次普查是一个相当复杂且麻烦的问题,但是如果将这个问题的规模由“全国”这一范围依次划分成对各省级单位、市级单位、县区级……进行人口普查,那么,同样是人口普查,但是难度上就小了许多了。所以对问题进行分解,往往是解决一个问题的开始。
- 解决问题(Conquer):
这个步骤需要做的工作是“递归地求解出子问题”。这个步骤是要和上一步骤中的分解问题共同进行的。
还是上面的那个例子,当我们接到任务说要对全国人口进行一次普查时,我们首先将这一问题分解成对全国各个省份的人口进行普查,然后尝试着来解决;可是我们会发现,即使是按省份来普查人口,这个范围还是太大了,于是我们只好继续分解问题,按城市、按县区级来划分都还是没有将问题的规模缩小到足以让我们在短期内能够普查完这种划分下的所有人口,那么说明问题还是没有被分解到“足够小”,所以我们还需要将这种“递归思想”继续下去,直至我们将人口普查的范围缩小到了街道或者村级这样的范围,我们差不多就可以进行这一范围内的人口普查工作了。当然,问题规模也不要太小,例如小到一个家庭的这种程度,这样统计起来虽然快,但未免有些太浪费资源了……
上面的