gpt4 book ai didi

c# - 从对列表创建邻接列表类型结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:07:50 29 4
gpt4 key购买 nike

在 C# 中,我有

class Pair{

int val1;
int val2;
}

我有一个来自以下来源的对列表:-

List<Pair> sList = new List<Pair>();

1 | 2
2 | 3
1 | 4
4 | 6

我需要将它转换成以下类型的结构:-

 [1, [2, 3, 4, 6]]  
[2, [3]]
[3, [2]]
[4, [1,6]]
[6, [4]]

解决此问题的最佳方法是什么(不使用 LINQ)?

最佳答案

我会选择 ILookup<int, int> ,但您还需要包括反向关联:

var result = sList.Union(sList.Select(p => new Pair { val1 = p.val2, val2 = p.val1 }))
.ToLookup(p => p.val1, p => p.val2);

不用 Linq 也可以得到类似的结果:

var dict = new Dictionary<int, List<int>>();
foreach(var pair in sList)
{
if (!dict.ContainsKey(pair.val1))
{
dict[pair.val1] = new List<int>();
}
if (!dict.ContainsKey(pair.val2))
{
dict[pair.val2] = new List<int>();
}

dict[pair.val1].Add(pair.val2);
dict[pair.val2].Add(pair.val1);
}

以上两种方法都会产生 Adjacency List ,但是从您的评论来看,您更像是想做的事 Connected Component Labeling

var groups = new List<HashSet<int>>();
foreach (var p in sList)
{
var merge = new List<HashSet<int>>();
foreach(var g in groups)
{
if (g.Contains(p.val1) || g.Contains(p.val2))
{
merge.Add(g);
}
}

if (merge.Count == 0)
{
var h = new HashSet<int>();
groups.Add(h);
merge.Add(h);
}

merge[0].Add(p.val1);
merge[0].Add(p.val2);
for(int i = 1; i < merge.Count; i ++)
{
foreach(int v in merge[i])
{
merge[0].Add(v);
}

groups.Remove(merge[i]);
}
}

当输入是

sList = 
1 | 2
4 | 6
2 | 3
1 | 4
9 | 10

这将产生输出:

groups = 
[ 1, 2, 3, 4, 6 ]
[ 9, 10 ]

然后将其转换为您想要的格式并不难:

var dict = new Dictionary<int, List<int>>();
foreach(var g in groups)
{
foreach(var v in g)
{
var list = new List<int>(g);
list.Remove(g);
dict.Add(v, list)
}
}

使用前面的例子:

dict =
1 | [ 2, 3, 4, 6 ]
2 | [ 1, 3, 4, 6 ]
3 | [ 1, 2, 4, 6 ]
4 | [ 1, 2, 3, 6 ]
6 | [ 1, 2, 3, 4 ]
9 | [ 9 ]
10 | [ 10 ]

关于c# - 从对列表创建邻接列表类型结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17355435/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com