algorithm - 给定两个数组,找到两个数组之间距离最近的排列
问题描述
假设我有两个长度相同的数组n
,分别命名为A
和B
。
这两个数组包含实数值。我们将两个数组之间的距离定义为均方距离。
dist(A,B) = sqrt( sum((A - B)2) )
我想找到A
给出最小距离的排列B
。天真的方法是尝试每个排列A
并记录最小距离。然而,这种方法的复杂度为 O(n!)。
是否有复杂度小于 O(n!) 的算法?
解决方案
您可以同时对 A 和 B 进行排序。在这种情况下,欧几里得距离是最小的。
如果 B 必须保持固定,那么您只需反转排序 B 所需的排列并将其应用于 A 的排序版本。
该解决方案确实假设您只想找到一个排列而不是最简单的排列(因为通过排列进行排序和取消排序不会非常有效)。
证明: 令 S,T 为我们的数组对。我们可以假设 S 已排序而不失一般性,因为重要的是两组元素之间的映射。
令 T 为最小化两个数组之间距离的排列,令 d 为该距离。
假设 T没有排序。那么存在元素 i,j st T_i > T_j
S_i + k1 = S_j
T_i = T_j + k2
where k1,k2 > 0
令 x 为除 i 和 j 之外的所有元素的总距离。
d = x + (S_i - T_i)^2 + ((S_i + k1) - (T_i - k2))^2
如果我们交换 T_i 和 T_j 的顺序,那么我们的新距离是:
d' = x + (S_i - (T_i - k2))^2 + ((S_i + k1) - T_i)^2
因此:d - d' = 2 * k1 * k2,这与我们假设 T 是最小化距离的排列相矛盾,因此必须对这样做的排列进行排序。
可以使用多种方法在 O(n log n) 中对两个数组进行排序。
推荐阅读
- javascript - 在 JavaScript 中记忆任何给定的递归函数
- javascript - React - 在发布请求中发送存储的状态值 - 格式错误的数据
- sql - 如何在 Hive 中阻止多行代码?
- java - 向 RecyclerView 项目添加波纹效果时“可能过度绘制”
- cordova - 与cordova插件一起删除源
- svg - 防止带有 alpha 通道的重叠图形相互着色?
- java - Java中的PostFix押韵词查找器,缺少功能和数据结构
- amazon-cognito - AWS cognito - 添加 acr_values 参数以在调用 OIDC 提供商时授权 Cognito 提供的 URL
- qt - 我正在尝试使用 webdriver-io 连接到 qt 应用程序
- excel - 使用 Excel-VBA 宏从工作簿复制时出现运行时错误“1004”