1
2
3
1,2
1,3
2,3
1,2,3
每行代表一个整数列表。输出指示第一个列表的索引(偏移量为1),而不是值。因此,1,2表示索引0和1处的元素是幂集的元素。
我对c不熟悉,那么哪些数据结构是让c#可以访问返回数据的最佳选择?
提前感谢您。
更新
非常感谢大家迄今为止的评论。以下是问题性质的一些背景信息。
计算集合的幂集的迭代方法非常简单。实际上只需要两个循环和一些位操作即可。它被频繁调用(事实上,如果集合大小足够大,它会被调用数十亿次)。
我认为使用c(正如人们指出的c++)可以更好地进行性能调优。直接移植可能不会提供任何增加,但它为获得更多速度提供了更多参与的方法。即使每次迭代只有小幅度增加,也会导致可衡量的增加。
我的想法是先移植一个直接的版本,然后努力提高它的性能。然后随着时间的推移进行重构(在SO的所有人的帮助下)。
更新2
jalf提出了另一个合理的观点,我不必使用列表或等效物。如果有更好的方法,我愿意听取建议。使用列表的唯一原因是每组结果的大小不同。
到目前为止的代码...
public List<List<int>> powerset(List<int> currentGroupList)
{
_currentGroupList = currentGroupList;
int max;
int count;
//Count the objects in the group
count = _currentGroupList.Count;
max = (int)Math.Pow(2, count);
//outer loop
for (int i = 0; i < max; i++)
{
_currentSet = new List<int>();
//inner loop
for (int j = 0; j < count; j++)
{
if ((i & (1 << j)) == 0)
{
_currentSetList.Add(_currentGroupList.ElementAt(j));
}
}
outputList.Add(_currentSetList);
}
return outputList;
}
正如您所看到的,这并不是很复杂。它只是一直在循环!
我知道创建和构建列表可能不是最有效的方法,但我需要一种以可管理的方式提供结果的方法。
更新2
感谢所有的输入和实现工作。为了澄清一些问题:我不需要输出按照“自然顺序”,而且我对返回空集不是那么感兴趣。
hughdbbrown的实现很有趣,但我认为我需要在某个时候存储结果(或至少其中的一个子集)。听起来内存限制将在运行时间成为真正问题之前应用。
部分原因是这样,我认为我可以使用字节而不是整数,从而提供更多的存储空间。
问题真正在于:我们已经达到了C#计算的最大速度吗?非托管代码的选项是否提供了更多的余地。我知道在许多方面,答案是徒劳无功的,因为即使我们减少了运行时间,也只能允许原始集合中的额外值。