从给定的数字对中查找不成对的数字

时间:2012-08-27 17:23:49

标签: c# algorithm math

是否有任何算法可以从给定的配对数列表中找到不成对的数字。例如在{(1,2),(2,3),(3,4)}中,对(1,3)和( 2,4)从未配对。

2 个答案:

答案 0 :(得分:4)

您可以按照以下方式执行此操作:

  1. 迭代所有对,并建立一组出现在集合中的所有数字。
  2. 构造所有可能的数字对,将结果存储在不同的集合中。
  3. 迭代原始列表中的所有对,并从所有对中删除您找到的每一对。
  4. 现在您剩下的所有配对都没有出现在原始设置中。
  5. 当然,这假设您只关心原始集合中的值对。例如,对(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);
}