在Julia中对具有固定和的整数数组进行迭代

时间:2019-03-18 22:25:35

标签: algorithm iterator julia

我正在寻找一种算法来迭代长度为n的所有数组,该数组的条目为0到d之间的整数,且总和为k * d。如果有一种内置的Julia函数和迭代器可以做到这一点,那就更好了。该算法应该是非递归的,并且内存效率高,因为我希望将其用于n的合理值。

对于n,d和k的较小值,我按字典顺序记下了所有此类数组,但是我无法提供用于遍历所有此类数组的代码。

1 个答案:

答案 0 :(得分:2)

我认为这应该可行,但是需要Combinatorics.jlResumableFunctions.jl

using Combinatorics, ResumableFunctions
@resumable function gen_all(n, k, d)
    for x in partitions(k*d + n, n)
        x = x .- 1
        if all(x .<= d) 
            ys = Set(permutations(x))
            for y in ys
                @yield y
            end
        end
    end
end


for ga in gen_all(5, 2, 2)
    println(ga)
end

给予

[2, 0, 0, 2, 0]
[2, 0, 0, 0, 2]
[0, 0, 2, 2, 0]
[0, 2, 2, 0, 0]
[2, 0, 2, 0, 0]
[0, 2, 0, 2, 0]
[2, 2, 0, 0, 0]
[0, 0, 0, 2, 2]
[0, 0, 2, 0, 2]
[0, 2, 0, 0, 2]
[0, 2, 0, 1, 1]
[0, 1, 1, 0, 2]
[0, 1, 2, 0, 1]
[0, 1, 1, 2, 0]
[2, 1, 1, 0, 0]
[2, 1, 0, 0, 1]
[0, 0, 1, 1, 2]
[1, 2, 1, 0, 0]
[1, 2, 0, 0, 1]
[0, 1, 2, 1, 0]
[0, 1, 0, 1, 2]
[1, 0, 0, 1, 2]
[0, 2, 1, 1, 0]
[2, 0, 0, 1, 1]
[1, 0, 2, 0, 1]
[1, 2, 0, 1, 0]
[0, 1, 0, 2, 1]
[2, 0, 1, 0, 1]
[0, 2, 1, 0, 1]
[1, 0, 1, 2, 0]
[0, 0, 1, 2, 1]
[1, 0, 0, 2, 1]
[2, 1, 0, 1, 0]
[1, 1, 0, 0, 2]
[1, 0, 2, 1, 0]
[1, 0, 1, 0, 2]
[1, 1, 0, 2, 0]
[0, 0, 2, 1, 1]
[2, 0, 1, 1, 0]
[1, 1, 2, 0, 0]
[1, 1, 1, 0, 1]
[1, 1, 0, 1, 1]
[1, 0, 1, 1, 1]
[1, 1, 1, 1, 0]
[0, 1, 1, 1, 1]