Algorithm 如何为每个n构造一个无算术置换?

Algorithm 如何为每个n构造一个无算术置换?,algorithm,permutation,Algorithm,Permutation,对于某些固定整数N,如果 A是{1,…,N}的置换;及 对于每个1≤ i

对于某些固定整数
N
,如果

  • A是
    {1,…,N}
    的置换;及
  • 对于每个
    1≤ i
    ,元素
    A[i]
    A[j]
    A[k]
    (按顺序)不构成算术运算 进展这意味着,
    A[j]-A[i]=--A[k]-A[j]

  • 给出一个算法,给定
    N
    ,该算法返回
    O(N logn)
    时间中大小
    N
    的无算术排列。保证所有正整数
    N
    都存在无算术置换

    为下一个最高的二次幂构造一个函数,并去掉不属于该函数的数字。有几种方法可以在O(n logn)时间内完成此操作。如果这是家庭作业,我不打算写一个正式的证明,但总的想法是看看a[I],a[j]和a[k]不完全相同的最低阶位,并观察到两个一致的是相邻的。

    这是一个很好的答案

    a
    b-a=c-b
    。然后

    2 * b = a + c
    
    由于
    2*b
    始终是偶数,为了打破任何级数,
    a
    c
    必须具有不同的奇偶性。但是,将赔率分成一边和另一边是相等的是不够的,因为如果我们有4个以上的数字,我们可以在其中一组中生成算术级数

    在这里,我们可以使用本文中的递归思想来打破它。我理解的一种方法是考虑如果我们有一个数组大小<代码> n>代码>的解决方案,因为算术级数取决于数字之间的差异,我们可以用算术函数将给定的解映射到相同的效果:

    if [a, b, c, d] works,
    
    then [2*a, 2*b, 2*c, 2*d] works too
    
    and so does [2*a - 1, 2*b - 1, 2*c - 1, 2*d - 1]
    
    因此,我们所需要做的就是将一个较小的解决方案一次映射到偶数,一次映射到赔率,并将它们分别分组。(分组将问题限制在打破每组的算术级数,因为如我们所示,没有级数,
    (a,b,c)
    ,将依赖于不同的平价的
    a
    c
    。)

    N1 -> [1]
    
    N2 -> even map N1 + odd map N1
          [2*1] + [2*1 - 1]
          [2, 1]
    
    N3 -> even map N1 + odd map N2
          [2*1] + [2*2 - 1, 2*1 - 1]
          [2, 3, 1]
    ...
    
    N6 -> even map N3 + odd map N3
          [2*2, 2*3, 2*1] + [2*2 - 1, 2*3 - 1, 2*1 - 1]
          [4, 6, 2, 3, 5, 1]