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,因为我希望奇偶校验定义得很好。