julia中的奇偶排序
假设我有以下数组:julia中的奇偶排序,julia,Julia,假设我有以下数组: [6,3,3,5,6], 是否有一种已经实现的方法来对数组进行排序,并返回它必须通过算法进行排序的排列数 例如,我必须用6向右移动3次,这样它才能被订购,这将给我奇偶校验-1 一般的问题是对一个任意数组进行排序,所有的整数都有重复的索引!,并了解排序数组的算法执行的奇偶校验 a=[6,3,3,5,6] sortperm(a) - [ 1:size(a)[1] ] 导致 3-element Array{Int64,1}: 1 1 1 -3 0 sortperm显示
[6,3,3,5,6],
是否有一种已经实现的方法来对数组进行排序,并返回它必须通过算法进行排序的排列数
例如,我必须用6向右移动3次,这样它才能被订购,这将给我奇偶校验-1
一般的问题是对一个任意数组进行排序,所有的整数都有重复的索引!,并了解排序数组的算法执行的奇偶校验
a=[6,3,3,5,6]
sortperm(a) - [ 1:size(a)[1] ]
导致
3-element Array{Int64,1}:
1
1
1
-3
0
sortperm显示每个第n个索引应该进入的位置。我们使用1:sizea[1]将早期索引与其原始索引进行比较
导致
3-element Array{Int64,1}:
1
1
1
-3
0
sortperm显示每个第n个索引应该进入的位置。我们使用1:sizea[1]将早期索引与其原始索引进行比较。如果数组很小,可以计算置换矩阵的行列式
function permutation_sign_1(p)
n = length(p)
A = zeros(n,n)
for i in 1:n
A[i,p[i]] = 1
end
det(A)
end
通常,你可以将排列分解为循环的乘积,
计算偶数周期数,并返回其奇偶性
function permutation_sign_2(p)
n = length(p)
not_seen = Set{Int}(1:n)
seen = Set{Int}()
cycles = Array{Int,1}[]
while ! isempty(not_seen)
cycle = Int[]
x = pop!( not_seen )
while ! in(x, seen)
push!( cycle, x )
push!( seen, x )
x = p[x]
pop!( not_seen, x, 0 )
end
push!( cycles, cycle )
end
cycle_lengths = map( length, cycles )
even_cycles = filter( i -> i % 2 == 0, cycle_lengths )
length( even_cycles ) % 2 == 0 ? 1 : -1
end
置换的奇偶性也可以从
反转次数。
它可以通过稍微修改合并排序算法来计算。
因为它也用于计算Kendall的tau check lesscorkendall,
已经有了一个实现
using StatsBase
function permutation_sign_3(p)
x = copy(p)
number_of_inversions = StatsBase.swaps!(x)
number_of_inversions % 2 == 0 ? +1 : -1
end
在您的示例中,这三个函数给出了相同的结果:
x = [6,3,3,5,6]
p = sortperm(x)
permutation_sign_1( p )
permutation_sign_2( p )
permutation_sign_3( p ) # -1
如果数组很小,可以计算置换矩阵的行列式
function permutation_sign_1(p)
n = length(p)
A = zeros(n,n)
for i in 1:n
A[i,p[i]] = 1
end
det(A)
end
通常,你可以将排列分解为循环的乘积,
计算偶数周期数,并返回其奇偶性
function permutation_sign_2(p)
n = length(p)
not_seen = Set{Int}(1:n)
seen = Set{Int}()
cycles = Array{Int,1}[]
while ! isempty(not_seen)
cycle = Int[]
x = pop!( not_seen )
while ! in(x, seen)
push!( cycle, x )
push!( seen, x )
x = p[x]
pop!( not_seen, x, 0 )
end
push!( cycles, cycle )
end
cycle_lengths = map( length, cycles )
even_cycles = filter( i -> i % 2 == 0, cycle_lengths )
length( even_cycles ) % 2 == 0 ? 1 : -1
end
置换的奇偶性也可以从
反转次数。
它可以通过稍微修改合并排序算法来计算。
因为它也用于计算Kendall的tau check lesscorkendall,
已经有了一个实现
using StatsBase
function permutation_sign_3(p)
x = copy(p)
number_of_inversions = StatsBase.swaps!(x)
number_of_inversions % 2 == 0 ? +1 : -1
end
在您的示例中,这三个函数给出了相同的结果:
x = [6,3,3,5,6]
p = sortperm(x)
permutation_sign_1( p )
permutation_sign_2( p )
permutation_sign_3( p ) # -1
谢谢你的回复,我也在看sortperm。也许这个问题现在更完整了。问题是要找到订购具有重复索引的链所需的排列总数。感谢您的回复,我也在查看sortperm。也许这个问题现在更完整了。问题是要找到排序具有重复索引的链所需的排列总数。您想要排列的符号,即单个数字,还是数组中每个元素的奇偶校验?在第一种情况下,一旦有了置换sortperm,就可以将其分解为循环的乘积,并查看其长度,如-中所示,但是如果原始数组中有重复的值,则置换的符号没有得到很好的定义。是的,奇偶校验就是我想要的。我想我们可以用一个规则来定义奇偶性,你必须对一个数进行排列,才能发现它是相等的。在我给出的例子中,我写到奇偶校验是3,因为我希望奇偶校验定义得很好。你想要排列的符号,也就是一个数字,还是数组的每个元素都有奇偶校验?在第一种情况下,一旦有了置换sortperm,就可以将其分解为循环的乘积,并查看其长度,如-中所示,但是如果原始数组中有重复的值,则置换的符号没有得到很好的定义。是的,奇偶校验就是我想要的。我想我们可以用一个规则来定义奇偶性,你必须对一个数进行排列,才能发现它是相等的。在我给出的例子中,我写到奇偶校验是3,因为我希望奇偶校验定义得很好。