问题:您将获得一个自然数N和一组大小为M的元素。您的任务是生成所有可能的大小为N的列表的值每个元素属于集合M(有或没有重复)。
示例:设N = 2且M =< 0,1>。
重复: N = [0,1]或N = [1,0]或N = [0,0]或N = [1,1]
不重复: N = [1,0]或N = [0,1]
我提出了解决方案(编辑 - 这是错误的),重复如下。 它是伪代码,因此不会在没有语言知识的情况下对任何人产生偏见。
Let I be an auxillary list of size N.
Let l denote the last value changed in I initialized as value N.
Fill I with value 1.
while l != 0
for i = 1 to N
N[i] = M[I[i]]
do_something(N)
if I[l] != M
I[l] += 1
elseif l == 1
break // So that it does not become not defined in else clause
else
l -= 1
I[l] += 1
需要O(N ^ 2 * M)时间和O(N + M)空间。如果你有更好的,请发布。 没有重复案例,我无法找到一个好的解决方案。
答案 0 :(得分:0)
如果您在某些非常简单的情况下尝试过它,您会看到您的算法存在问题,例如您实际给出的那个,其中M = N = 2。 (为什么你不首先这样做?)它不会生成列表1 0
。
为什么呢?因为在递减l
并递增新I[l]
之后,您永远不会减少I[]
中的任何后续(进一步向右)值。所以例如对于N = 5,您只会生成排列
0 0 0 0 0
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
0 1 1 1 1
1 1 1 1 1