【发布时间】:2013-08-19 22:52:16
【问题描述】:
背景:
我正在编写一个程序来处理与各种规则形状的顶点网络相关的大量数据。我有一个工作生成器,它根据一系列用户输入参数生成与所述形状的顶点相对应的笛卡尔坐标列表。然后将数据传递给过滤器,过滤器清除重复条目、对数据进行排序和各种其他功能,从那里将清理后的数据馈送到画布模块,该模块循环并绘制顶点。
问题:
我需要实现一个有效循环坐标的新过滤器,将每一对与其他每一对进行比较,即(x1,y1)->(x2,y2) 到(x1,y1)->(xn,yn),(x2,y2)->@对于所有条目,987654328@ 到 (x2,y2)->(xn,yn) 等,例如,如果 (x1,y1) 和 (x5,y5) 之间的关系适合 [(x5-x1)^2+(y5-y1)^2]=vertex_spacing^2,那么这两组坐标然后与它们各自的列表配对条目号并附加到一个新列表中,其中一个条目的形式为:例如[(x1,y1), (x5,y5), 0, 4]。实现这一目标的最有效方法是什么?
我的尝试:
我在此处和各种指南中查看了很多处理列表的方法。我尝试过嵌套的“for”和“if”循环,但发现虽然这种方法可以工作,但它会导致运行时间过长,并试图将问题分解为许多较小的 for 循环。
补充说明:
这样做的最终目的是将生成的坐标用于前端界面元素,并根据需要进行保存和导入。 [(x1,y1), (x5,y5), 0, 4] 中的列表位置 0 和 4 的作用是使界面能够对坐标进行分组,以供以后在画布对象中使用。该方法应该能够处理潜在的数千个坐标。
提前感谢您的帮助,我当然愿意改进我提供的措辞/信息和/或添加示例代码,如果不清楚我的要求是什么 - 我还是新手到这个! :)
【问题讨论】:
-
恭喜您提出了一个很好的问题!问题是天真的方法(将每一对与所有其他对进行比较)会导致二次运行时间。你的积分分布如何?如果它们都在一个相对较小的空间中(很小的顺序是
vertex_spacing),这将是一个难题,否则您可以做一些简单的优化(我将根据分布将它们作为答案发布)。 -
谢谢! :) 我注意到情况确实如此,并且我知道它会发生,尽管我想不出解决这个问题的方法。 vertex_spacing 本身的值默认设置为 60,但由于它是用户定义的,理论上它可以是任何大小。数据也是使用 vertex_spacing 基于倍数和三角恒等式计算的。本质上,vertex_spacing 是我数据中的基本单位。希望我能理解你的意思,谢谢你的帮助!
-
这是个好问题。我在想一个决策树是要走的路,我查看了维基百科条目中的“最近的点对问题”,因为这似乎是该问题的扩展(?)对于背景,它看起来像一个好的决策树可以得到你 O (n log n)。在这种情况下是真的吗? en.wikipedia.org/wiki/Closest_pair_of_points_problem
-
"我有一个工作生成器,它根据一系列用户输入参数生成与所述形状的顶点相对应的笛卡尔坐标列表" 听起来你是生成这些形状 - 您是否可以只存储有关哪些顶点是边缘邻居的数据?而不是以后计算?只是一个想法。
-
@erewok a kd-tree 在分区谓词中可能更有用。
标签: python algorithm list python-2.7 coordinates