【问题标题】:Algorithm to align arrays对齐数组的算法
【发布时间】:2020-05-08 13:24:15
【问题描述】:

给定 2 个相同长度的双精度数组(“主”数组“A”和辅助“B”)。我想编写一个将 B 对齐到 A 的函数。

我定义了对齐方式,对于 A 的每个元素,如果 B 包含该元素,则该元素应放置在与 A 相同的索引处。

关于 A 和 B 的一些特殊性:

  • A 和 B 都经过初始排序。对齐后,B DON'T 不需要排序。
  • A 和 B 的长度相同。
  • A 和 B 中都没有重复项
  • A 和 B 相当小(最多 10 个元素,通常大约 3-5 个元素)。
  • A 不应该改变。
  • 我标记了问题 C#,因为这将是我的最终实现,但我可以调整答案
  • 该函数会被频繁调用(每秒 100k/1M),我需要一些高效的东西。

Ex1:
A = [10, 11, 12, 13]
B = [10, 12, 14, 16](初始)
= > [10, 16, 12, 14] B 最终([10, 14, 12, 16] 也是有效的,只有元素'10'和'12'的位置是相关的(其他元素是不在 A))

Ex2:
A = [10, 11, 12, 13]
B = [08, 09, 10, 11](初始)
= > [10, 11, 08, 09] B 决赛

我写了两种不同的方法:一种是使用字典来保留现有元素的位置,另一种是使用两个串联前进的指针。但是,我发现代码对于它应该做的事情相当复杂/混乱。

有人知道这方面的现有算法或干净有效的方法吗?

【问题讨论】:

  • 在您的第一个示例中,为什么 B 的最后 3 个数字位置从 12,14,16 更改为 16,12,14?
  • 为什么12和16在Ex1中换了位置?
  • @auburg 和 Wyck 是为了将 '12' 放在索引 3 处,因为 '12' 在 A 中的索引 3 处(元素 '14' 和 '16' 的位置无关紧要)

标签: c# algorithm


【解决方案1】:

这是一种方法。不是最优的,但代码还不错。

private static double[] align(double[] A, double[] B)
{
    var extras = B.Where(b => !A.Contains(b)).ToArray();
    int i = 0;
    var result = A.Select(a => B.Contains(a) ? a : extras[i++]).ToArray();
    return result;
}

【讨论】:

  • “where/contains”暗示了 n*n 的复杂性,即使(大多数时候)少量项目我也不喜欢。代码很干净,如果我没有找到更好的,我会试一试并准确查看性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多