Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 给定n,生成大小小于0.5n的所有置换_Arrays_Algorithm_Optimization_Julia_Permutation - Fatal编程技术网

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:)