本来2维平面内的最接近点对问题是有O(nlogn)的算法的,但那个分治算法实用性不强
盾盾想到了一个十分飘逸的算法:
随机旋一下系,按x排序然后直接裸找+break即可
通常情况下直接按x排序裸找是会被某些数据卡到的(某些无聊的同学就不要说按y排之类的话了)
但是,为什么会被卡到?无非就是点全排在一排上就break不动了嘛!
那我们随机旋系不就随便数据怎么搞都不容易被卡到了吧!
因此该算法有O(快排+k*n)的复杂度,实际测试中该算法的成绩也相当不错,求3维空间内最接近点对,n=1000000都可以5s之内出解(由于有实数运算的存在,拖大了常数)
不仅如此,该算法的可扩展性是非常好的,任意维空间内都是可以这样做的,而且编程复杂度极其之低(差不多一个快排就可以了)
具体实现的时候其实不必真正去旋转坐标系,只要随机一个向量,然后按所有点在这个向量上的投影长度(用点积)为关键字排序即可
附代码(求三维空间内最接近点对,距离的定义就是欧式距离不开根号):