1
1
下面的C++函数确实是您需要的,但是顺序与示例中的顺序不同:
|
2
2
如果生成所有子集,最终将生成2 n 长度列表的子集 n .一种常见的方法是迭代所有的数字 我 从0到2 n -1并使用设置的位 我 确定哪些项目在 我 TH子集。这是因为在任何特定的子集中都存在或不存在任何项,所以通过迭代 n 在2中迭代的位 n 子集。 例如,要生成(1、2、3)的子集,您需要迭代数字0到7:
在您的问题中,您可以生成每个子集及其补集,以获得互斥的子集对。当您这样做时,每对都会重复,因此您只需要重复最多2次 n - 1 -1然后停止。
要处理重复项,可以生成列表索引的子集,而不是列表项的子集。与列表(1,2,2,3)一样,生成列表(0,1,2,3)的子集,然后将这些数字用作(1,2,2,3)列表的索引。基本上,添加一个间接级别。 下面是一些Python代码,将这一切结合在一起。
输出:
|
3
1
有点Erlang代码,问题是当您有重复的元素时,它会生成重复的元素,所以结果列表仍然需要过滤…
在伪代码中,这意味着:
|
4
0
我的建议是… 首先,计算每个值中有多少个,可能在哈希表中。然后计算要考虑的组合总数-计数的乘积。 重复这个数量的组合。 在每个组合中,复制循环计数(x),然后通过哈希表项开始一个内部循环。 对于每个哈希表项,使用(x modulo count)作为第一个列表中哈希表键的实例数。在重复内部循环之前,将x除以计数。 如果您担心组合的数量可能会溢出整数类型,那么这个问题是可以避免的。使用一个数组,其中每个项(每个hashmap键一个)从零开始,通过组合“count”将每个数组项视为一个数字(因此整个数组表示组合数),但每个“digit”具有不同的基数(对应的计数)。也就是说,要“递增”数组,首先递增项0。如果它溢出(等于其计数),则将其设置为零并增加下一个数组项。重复溢出检查,直到溢出继续超过数组末尾,您就完成了。 我认为sergdev使用的方法与第二种方法非常相似,但是使用std::map而不是hashtable(std::unordered_map应该可以工作)。对于大量的项目,哈希表应该更快,但不会以任何特定的顺序提供值。不过,每个循环通过哈希表中的键的顺序应该是一致的, 除非 添加/删除键。 |
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
Manny · 如何比较Perl中的字符串? 2 年前 |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |