给定一个包含唯一对象的数组和另一个包含第一个数组中对象的数组,我需要一个索引数组,其中包含第一个数组中每个对象的索引。
示例:
var a = new MyClass(1);
var b = new MyClass(2);
var c = new MyClass(3);
MyClass[] firstArray = {a, b, c}; // these all are unique
MyClass[] secondArray = {b, a, a, c, b};
在这种情况下,输出将为{2, 1, 1, 3, 2}
显然可以通过比较嵌套循环中的每个对象来完成,但这会导致O(n * m)复杂度。这个问题有更优化的解决方案吗?
答案 0 :(得分:1)
循环遍历第一个数组并构建一个Dictionary<T, int>
,其中包含每个项目的索引。
循环遍历第二个数组并查找字典中的每个项目。
O(n + m)
。
答案 1 :(得分:0)
var dict = firstArray.Select((x, i) => new { x, i }).ToDictionary(x => x.x, x => x.i);
var result = secondArray.Select(x => dict[x]).ToArray();
它为您提供 O(n + m),因为Dictionary
查找在 O(1)中运行。
答案 2 :(得分:0)
您在这里想要做的是Join
,从概念上讲,它将完成大部分工作。我们只需要首先将第一个序列投影到也包含其索引的序列,将实际项目用作连接键,并将索引作为结果。
var indexes = from second in secondArray
join first in firstArray.Select((item, i) => new { item, i })
on second equals first.item
select first.i;