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