cycle leader iteration algorithm是一种通过将所有偶数条目移动到前面并且将所有奇数条目移动到后面同时保持它们的相对顺序来混洗阵列的算法。例如,给定此输入:
a 1 b 2 c 3 d 4 e 5
输出将是
a b c d e 1 2 3 4 5
该算法在O(n)时间内运行,仅使用O(1)空间。
算法的一个不寻常的细节是它通过将数组分成大小为3 k +1的块来工作。显然,这对于算法正常工作至关重要,但我不知道为什么会这样。
为什么算法中选择3 k + 1?
谢谢!
答案 0 :(得分:2)
以下是templatetypedef中缺少的大部分数学参数 回答。 (其余的比较无聊。)
引理:对于所有整数k >= 1
,我们有
2^(2*3^(k-1)) = 1 + 3^k mod 3^(k+1)
。
证明:通过k
上的归纳。
基本情况(k = 1
):我们有2^(2*3^(1-1)) = 4 = 1 + 3^1 mod 3^(1+1)
。
归纳案例(k >= 2
):如果2^(2*3^(k-2)) = 1 + 3^(k-1) mod 3^k
,
然后q = (2^(2*3^(k-2)) - (1 + 3^(k-1)))/3^k
。
2^(2*3^(k-1)) = (2^(2*3^(k-2)))^3
= (1 + 3^(k-1) + 3^k*q)^3
= 1 + 3*(3^(k-1)) + 3*(3^(k-1))^2 + (3^(k-1))^3
+ 3*(1+3^(k-1))^2*(3^k*q) + 3*(1+3^(k-1))*(3^k*q)^2 + (3^k*q)^3
= 1 + 3^k mod 3^(k+1).
定理:对于所有整数i >= 0
和k >= 1
,我们都有
2^i = 1 mod 3^k
当且仅当i = 0 mod 2*3^(k-1)
。
证明:“if”方向来自引理。如果
i = 0 mod 2*3^(k-1)
,然后
2^i = (2^(2*3^(k-1)))^(i/(2*3^(k-1)))
= (1+3^k)^(i/(2*3^(k-1))) mod 3^(k+1)
= 1 mod 3^k.
“只有”方向是k
上的归纳。
基本案例(k = 1
):如果i != 0 mod 2
,则i = 1 mod 2
和
2^i = (2^2)^((i-1)/2)*2
= 4^((i-1)/2)*2
= 2 mod 3
!= 1 mod 3.
归纳案例(k >= 2
):如果2^i = 1 mod 3^k
,那么
2^i = 1 mod 3^(k-1)
,归纳假设意味着
i = 0 mod 2*3^(k-2)
。让j = i/(2*3^(k-2))
。通过引理,
1 = 2^i mod 3^k
= (1+3^(k-1))^j mod 3^k
= 1 + j*3^(k-1) mod 3^k,
删除的术语可以被(3^(k-1))^2
整除,所以
j = 0 mod 3
和i = 0 mod 2*3^(k-1)
。