【任意维空间内最接近点对问题】随机旋转坐标系法、期望O(n)

本来2维平面内的最接近点对问题是有O(nlogn)的算法的,但那个分治算法实用性不强

盾盾想到了一个十分飘逸的算法:

   随机旋一下系,按x排序然后直接裸找+break即可

通常情况下直接按x排序裸找是会被某些数据卡到的(某些无聊的同学就不要说按y排之类的话了)

但是,为什么会被卡到?无非就是点全排在一排上就break不动了嘛!

那我们随机旋系不就随便数据怎么搞都不容易被卡到了吧!

因此该算法有O(快排+k*n)的复杂度,实际测试中该算法的成绩也相当不错,求3维空间内最接近点对,n=1000000都可以5s之内出解(由于有实数运算的存在,拖大了常数)

不仅如此,该算法的可扩展性是非常好的,任意维空间内都是可以这样做的,而且编程复杂度极其之低(差不多一个快排就可以了)

具体实现的时候其实不必真正去旋转坐标系,只要随机一个向量,然后按所有点在这个向量上的投影长度(用点积)为关键字排序即可

附代码(求三维空间内最接近点对,距离的定义就是欧式距离不开根号):

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值