Arrays 给定n,生成大小小于0.5n的所有置换
给定一个整数Arrays 给定n,生成大小小于0.5n的所有置换,arrays,algorithm,optimization,julia,permutation,Arrays,Algorithm,Optimization,Julia,Permutation,给定一个整数n,我希望尽可能高效地将大小小于或等于0.5n的所有整数排列生成一个向量 例如,对于n=7,这将是: 15-element Array{Array{Int64,1},1}: [1] [2] [3] [1, 2] [1, 3] [2, 1] [2, 3] [3, 1] [3, 2] [1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1] using Combinatorics Iterato
n
,我希望尽可能高效地将大小小于或等于0.5n
的所有整数排列生成一个向量
例如,对于n=7
,这将是:
15-element Array{Array{Int64,1},1}:
[1]
[2]
[3]
[1, 2]
[1, 3]
[2, 1]
[2, 3]
[3, 1]
[3, 2]
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
using Combinatorics
Iterators.flatten(permutations.(powerset(1:3,1)))
我目前的想法是生成大小k
小于0.5n
的所有排列并附加它们:
using Combinatorics
function generate_half_perm(n)
half_n = floor(Int, n/2)
result = []
for l in 1:half_n
for c in permutations(1:half_n, l)
push!(result, c)
end
end
return result
end
generate_half_perm(7)然后给出这篇文章的第一个实例。我认为该代码目前高于O(2^(n/2).n)
这是代码的复杂性,没有生成组合所需的代码,组合(1:half\n,l)
我想知道,鉴于我的
n可能会超过100
我有使用的想法,但是product函数被弃用了,应该用它来替换,现在这对我来说开始变得复杂了
如果您在算法上有更好的想法,没有Julia实现,我很乐意尝试:)
小编辑:我意识到我想要的是:
collect(Iterators.flatten(permutations.(powerset(1:7,0, floor(Int, 7/2)))))
感谢@Przemyslaw Szufel让我找到了它:)对于你的值“N的一半”等于3,这将是:
15-element Array{Array{Int64,1},1}:
[1]
[2]
[3]
[1, 2]
[1, 3]
[2, 1]
[2, 3]
[3, 1]
[3, 2]
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
using Combinatorics
Iterators.flatten(permutations.(powerset(1:3,1)))
请注意,这是非分配的,因此,如果您想查看结果,则需要collect
:
julia> collect(Iterators.flatten(permutations.(powerset(1:3,1))))
15-element Array{Array{Int64,1},1}:
[1]
[2]
[3]
[1, 2]
[2, 1]
[1, 3]
[3, 1]
[2, 3]
[3, 2]
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
谢谢!如果不是的话,我会花很长时间去发现:)好吧,我意识到我想要的是:
collect(迭代器。flatte(置换)(powerset(1:7,0,floor(Int,7/2‘)'))
(这实际上是第一段中要求的,但在实例和代码中描述得很糟糕)但是你让我在你的答案中找到它,所以我不会编辑我的问题,也不会取消勾选你的答案,再次感谢:)此命令还将生成一个空集[]
。如果你想避免它,就把1
作为起始值,而不是零。对于n=100,这些值太多了,无法存储在地球上所有的内存中。如果n=100,则有~3e64大小的n/2个。@dmuir,是的,您是对的!我将尽我所能运行我的项目,永远不会达到100:)