是否有任何算法可以从给定的配对数列表中找到不成对的数字。例如在{(1,2),(2,3),(3,4)}中,对(1,3)和( 2,4)从未配对。
答案 0 :(得分:4)
您可以按照以下方式执行此操作:
当然,这假设您只关心原始集合中的值对。例如,对(1,5)也不在您的示例中。 (猫,狗)都不是。
这在时间O(n 2 )中运行,其中n是原始对中表示的数字的数量。
希望这有帮助!
答案 1 :(得分:0)
使用LINQ和对称技巧利用(1,3)和(3,1)相同的事实,所以忽略第二个数字大于第一个数字的情况:
public static IEnumerable<Tuple<int, int>> GetUnpairedNumbers(IEnumerable<Tuple<int, int>> existingPairs ) {
var uniqueNumbers = existingPairs.SelectMany(p => new[] {p.Item1, p.Item2}).Distinct().ToList();
var isUsed = uniqueNumbers.ToDictionary(n => n, n => uniqueNumbers.Where(inner => n < inner).ToDictionary(inner => inner, inner => false));
foreach(var currentPair in existingPairs) {
isUsed[currentPair.Item1][currentPair.Item2] = true;
}
return isUsed.Keys.SelectMany(n => isUsed[n].Where(kvp => !kvp.Value).Select(kvp => Tuple.Create(n, kvp.Key)));
}
public static void Main(string[] args) {
var unpairedNumbers = GetUnpairedNumbers(new[] { P(1, 2), P(2, 3), P(3, 4) });
}
private static Tuple<int, int> P(int a, int b) {
return Tuple.Create(a, b);
}