簡體   English   中英

從給定的數字對中查找未配對的數字

[英]Finding Unpaired Numbers From Given Number Pairs

是否有任何算法可從給定的成對數字列表中查找未成對數字。例如,在{(1,2),(2,3),(3,4)}中,成對(1,3)和(2,4 )從未配對過。

您可以按照以下步驟進行操作:

  1. 遍歷所有對,並建立一組出現在集合中的所有數字。
  2. 構造所有可能的數字對,將結果存儲在不同的集合中。
  3. 遍歷原始列表中的所有對,然后從所有對的集合中刪除找到的每個對。
  4. 現在,您將剩下未出現在原始集中的所有對。

當然,這假定您只關心原始集中的值對。 例如,在您的示例中也不存在(1,5)對。 兩者都不是(貓,狗)。

這在時間O(n 2 )中運行,其中n是原始對對中表示的數字數。

希望這可以幫助!

使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM