当前位置:编程学习 > C#/ASP.NET >>

计算最小距离

一个dataTable里面的第一列为x坐标,第二列为y坐标,有若干条记录,计算每个点到其他点最小距离放在第三列,怎样让计算速度跟快?现在10000条数据7分多钟。要求控制在30秒内。 --------------------编程问答-------------------- 对于无规律的数据,估计你只有遍历了,能优化的就是你计算的地方 --------------------编程问答-------------------- 就是因为遍历涉及到数学计算 所以速度很慢 --------------------编程问答-------------------- 可以参考下最短路径算法
。Dijkstra算法 --------------------编程问答-------------------- 把数据拆成10组,每组有1000行数据, 开10个线程同时运行遍历比较,分别取出最小的距离,然后10个距离继续比较最小的...纯理论,多线程应该能提高点效率...虽然10个线程有点多了.... --------------------编程问答-------------------- 多线性不能提高效率。只是不会让ui线程假死。 --------------------编程问答--------------------
引用 5 楼 sinodzh 的回复:
多线性不能提高效率。只是不会让ui线程假死。


多线程不能提高效率?开玩笑吧,你的意思多线程就只是为了让UI不假死? --------------------编程问答-------------------- 有几个想法,也许可以帮助提升搜索速度

1.这些点一定是成对出现的,A点的最近点是B的话,B点的最近点也是A。 然后A和B就一定不是C点的最近点。
可以利用这个特点排除掉已经配对的,这样数据就越来越少

2.不需要遍历整个集合,首先将数据按第一顺序x坐标,第二顺序y坐标排序。
对第一个点A点,从第二个点B点开始计算,由于A点到B点的距离是斜边,所以AB间的距离小于两点X坐标差和Y坐标差之和,AB < ∆x + ∆y. 同理,点C,AC之间的距离大于A点和C点X坐标差并且大于Y坐标差。AC > ∆x` and AC > ∆y` .如果AC之间的X坐标差大于已知最近点的X坐标差Y坐标差之和,即 ∆x` > ∆x + ∆y . 那么从C点之后就不用查找了,那些肯定不是。

所以,由算法2找到第一个点的匹配点后,将这对点从数据源移除,然后继续 --------------------编程问答-------------------- 其实对于这种坐标数据,一般都会有空间索引,其实就是把点分成小区域,比如把这些点按X轴10等分Y轴10等分,这样你的点就落在了100个小方块之内,你可以优先在本区域和邻近区域查找,我想了下好像不是很严格,你也可以考虑下这个思路 --------------------编程问答-------------------- 首先将数据排序,按X升序排序,X相同的按Y升序排序。计算的时候,先查找范围(X+/-Z,Y+/-Z)内是否有点,有的话,计算距离。如果距离D小于Z,那距离D就是最小的距离,如果距离D大于Z则将查找范围扩大一倍(X+/-2*Z,Y+/-2*Z)。范围Z根据这些无序值的范围合理设置。 --------------------编程问答-------------------- 难道你任务

引用 6 楼 ckhker 的回复:
引用 5 楼 sinodzh 的回复:多线性不能提高效率。只是不会让ui线程假死。

多线程不能提高效率?开玩笑吧,你的意思多线程就只是为了让UI不假死?


再多的线程也只是用到一个核。系统还得给你的线程分配单元片。你以为还真的快了。这个是指在一台机器上的。当然你的线程去调用其他的资源。比如sql,网络,串口等 结果你懂的。 --------------------编程问答-------------------- 什么是两点间的距离? 欧式距离吗?
如果是,感觉是典型的floyd算法应用。
速度很快。
http://www.cnblogs.com/davidluo/articles/1799811.html
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,