gpt4 book ai didi

c# - 获取集合的所有子集

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

我正在尝试创建一个将返回集合的所有子集的方法。

例如,如果我有集合10,20,30,我想得到以下输出

        return new List<List<int>>()
{
new List<int>(){10},
new List<int>(){20},
new List<int>(){30},
new List<int>(){10,20},
new List<int>(){10,30},
new List<int>(){20,30},
//new List<int>(){20,10}, that substet already exists
// new List<int>(){30,20}, that subset already exists
new List<int>(){10,20,30}
};

因为集合也可以是字符串集合,例如我想创建一个泛型方法。这是我算出来的based on this solution .

    static void Main(string[] args)
{
Foo<int>(new int[] { 10, 20, 30});
}

static List<List<T>> Foo<T>(T[] set)
{

// Init list
List<List<T>> subsets = new List<List<T>>();

// Loop over individual elements
for (int i = 1; i < set.Length; i++)
{
subsets.Add(new List<T>(){set[i - 1]});

List<List<T>> newSubsets = new List<List<T>>();

// Loop over existing subsets
for (int j = 0; j < subsets.Count; j++)
{
var tempList = new List<T>();
tempList.Add(subsets[j][0]);
tempList.Add(subsets[i][0]);
var newSubset = tempList;
newSubsets.Add(newSubset);
}

subsets.AddRange(newSubsets);
}

// Add in the last element
//subsets.Add(set[set.Length - 1]);
//subsets.Sort();

//Console.WriteLine(string.Join(Environment.NewLine, subsets));
return null;
}

编辑

抱歉,这是错误的,我仍然得到重复...

    static List<List<T>> GetSubsets<T>(IEnumerable<T> Set)
{
var set = Set.ToList<T>();

// Init list
List<List<T>> subsets = new List<List<T>>();

subsets.Add(new List<T>()); // add the empty set

// Loop over individual elements
for (int i = 1; i < set.Count; i++)
{
subsets.Add(new List<T>(){set[i - 1]});

List<List<T>> newSubsets = new List<List<T>>();

// Loop over existing subsets
for (int j = 0; j < subsets.Count; j++)
{
var newSubset = new List<T>();
foreach(var temp in subsets[j])
newSubset.Add(temp);

newSubset.Add(set[i]);


newSubsets.Add(newSubset);
}

subsets.AddRange(newSubsets);
}

// Add in the last element
subsets.Add(new List<T>(){set[set.Count - 1]});
//subsets.Sort();

return subsets;
}

然后我可以调用该方法:

enter image description here

最佳答案

这是一个基本算法,我用下面的技术制作了一个单人拼字游戏(报纸上的)。

让你的集合有 n 个元素。递增一个从 0 到 2^n 的整数。对于每个生成器编号位掩码整数的每个位置。如果整数的第 i 个位置是 1,则选择集合中的第 i 个元素。对于从 02^n 的每个生成的整数,执行上述位图和选择将为您提供所有子集。

这是一个帖子:http://phoxis.org/2009/10/13/allcombgen/

关于c# - 获取集合的所有子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10374419/

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