You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现关联Tuple<int, int>数对的分组合并操作?

问题描述

你定义了一个Tuple<int, int>类型的列表:

List<Tuple<int, int>> pairs = new List<Tuple<int, int>>();

并添加了以下数对:

  • pairs.Add(Tuple.Create<int, int>(1, 2));
  • pairs.Add(Tuple.Create<int, int>(3, 4));
  • pairs.Add(Tuple.Create<int, int>(3, 5));
  • pairs.Add(Tuple.Create<int, int>(5, 6));
  • pairs.Add(Tuple.Create<int, int>(10, 11));
  • pairs.Add(Tuple.Create<int, int>(2, 3));

你希望将这些数对按关联性分组合并,最终得到:

  • result[0] = {1, 2, 3, 4, 5, 6}
  • result[1] = {10, 11}

请问是否有简便的实现方法?


解决方案:使用并查集(Union-Find)

这是处理这类“关联元素合并”问题最高效且简洁的方案,核心思路是用一个轻量数据结构跟踪每个元素的父节点,快速判断两个元素是否属于同一集合,并完成集合合并,完美匹配你要的分步关联逻辑。

第一步:实现并查集工具类

public class UnionFind
{
    private Dictionary<int, int> _parent;

    public UnionFind()
    {
        _parent = new Dictionary<int, int>();
    }

    // 查找元素的根节点,附带路径压缩优化(让后续查找更快)
    public int Find(int x)
    {
        if (!_parent.ContainsKey(x))
            _parent[x] = x;
        
        if (_parent[x] != x)
            _parent[x] = Find(_parent[x]);
        
        return _parent[x];
    }

    // 合并两个元素所在的集合
    public void Union(int x, int y)
    {
        int rootX = Find(x);
        int rootY = Find(y);
        
        if (rootX != rootY)
            _parent[rootY] = rootX;
    }
}

第二步:处理数对并生成最终结果

// 初始化你的数对列表
List<Tuple<int, int>> pairs = new List<Tuple<int, int>>
{
    Tuple.Create(1, 2),
    Tuple.Create(3, 4),
    Tuple.Create(3, 5),
    Tuple.Create(5, 6),
    Tuple.Create(10, 11),
    Tuple.Create(2, 3)
};

var uf = new UnionFind();

// 遍历所有数对,执行关联合并
foreach (var pair in pairs)
{
    uf.Union(pair.Item1, pair.Item2);
}

// 按根节点分组,整理成最终的集合列表
var groups = new Dictionary<int, List<int>>();
foreach (var num in uf._parent.Keys)
{
    int root = uf.Find(num);
    if (!groups.ContainsKey(root))
        groups[root] = new List<int>();
    groups[root].Add(num);
}

// 转换为你需要的List<List<int>>格式
var result = groups.Values.Select(g => g.OrderBy(n => n).ToList()).ToList();

// 验证输出
foreach (var group in result)
{
    Console.WriteLine($"{{{string.Join(", ", group)}}}");
}

逻辑说明

  1. 路径压缩:Find方法会把元素直接指向根节点,后续查找操作的时间复杂度几乎是O(1),处理大量数据时优势明显。
  2. 合并逻辑:Union方法通过找到两个元素的根节点,将其中一个根节点挂载到另一个上,轻松完成集合合并,完全对应你描述的分步关联规则。
  3. 结果整理:遍历所有元素,按根节点分组后排序,就能得到你想要的关联性集合。

这种方法比手动遍历判断合并要简洁得多,而且扩展性极强,就算后续添加更多数对也能高效处理。


内容的提问来源于stack exchange,提问作者José Luis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:28:40