algorithm - 高效重复分拣

标签 algorithm sorting

我在由 (x,y) 坐标定义的图形上有一组 N 个点,还有一个包含它们成对距离的表格。我正在寻找生成一个表格,其中包含他们的相对“亲密度排名”,例如如果 closeness[5][9] == 4,则节点 9 是相对于节点 5 第四近的项目。

这样做的明显方法是生成索引列表并根据 d[i][j] < d[i][k] 对每个 i (1->n) 对它们进行排序,然后转换表知道 sorted[5][4] == 9 意味着 closeness[5][9] == 4。

这需要 O(n² log n) 时间。我觉得可能有更有效的方法。有什么想法吗?

最佳答案

好的,我会尝试尝试一下。

背景知识:这个问题跟k-nearest neighbor有点关系。我不确定你是如何生成成对距离的,但 k-d 树非常擅长解决这类问题。

现在,即使你使用 k-d 树,它也会有所帮助(你只查询你需要的,而不是对所有点进行排序):在 O(N log N) 时间内构建树,然后为 K 个最近的您要查询的点,每个点都需要 O(log N) 时间。最后,您看到的是 O(N log N) + O(NK log N)。

好的,现在是真正的启发式部分。这将取决于您的数据,您可能想看看它们是靠得很近还是相距很远。但是,您可以尝试分而治之的方法,将飞机分成多个箱子。当您需要找到最近的点时,找出您正在处理的点属于哪个 bin,然后您只处理相邻的 bin,并在需要更多点时探索更多相邻的 bin。

希望这对您有所帮助,祝您好运。

关于algorithm - 高效重复分拣,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842164/

相关文章:

algorithm - 选择幂集的随机元素

algorithm - 如何计算条件语句和循环的时间复杂度

java - java中有argsort函数吗?

c - 插入排序运行时错误

java - Java中如何直接或间接找到另一个表达式变量中使用的所有变量

javascript - 不使用图表 [算法] 的卡方 p 值计算

azure - 在 Azure API for FHIR 中搜索资源时的默认排序是什么?

angularjs - Angular UI-Grid 3 - 如何以编程方式排序?

ios - 按与当前位置的距离对数组进行排序

algorithm - 通过选择 A 中的一个集合,然后反转该集合并将该集合插入到 A 的开头,将排列序列 A 转换为 B