c# - 对齐数组的算法
问题描述
给定 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中))
例 2:
A = [10, 11, 12, 13]
B = [08, 09, 10, 11](初始)
= > [10, 11, 08, 09] B 最终
我写了两种不同的方法:一种是用字典来保存现有元素的位置,另一种是用两个串联的指针。但是,我发现代码对于它应该做的事情相当复杂/混乱。
有人知道这方面的现有算法或干净有效的方法吗?
解决方案
这是一种方法。不是最优的,但代码还不错。
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;
}