当每个元素属于集合

时间:2016-07-26 08:11:28

标签: algorithm performance

问题:您将获得一个自然数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)空间。如果你有更好的,请发布。 没有重复案例,我无法找到一个好的解决方案。

1 个答案:

答案 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