问题提出
给定一个一维数组 x 1 , x 2 , ⋯ , x n x_1,x_2,\cdots,x_n x 1 , x 2 , ⋯ , x n ,以及一个函数 p p p ,使得 p ( 1 ) , p ( 2 ) , ⋯ , p ( n ) p(1),p(2),\cdots,p(n) p ( 1 ) , p ( 2 ) , ⋯ , p ( n ) 是对 1 , 2 , ⋯ , n 1,2,\cdots,n 1 , 2 , ⋯ , n 的一个排列,同时 x p ( 1 ) , x p ( 2 ) , ⋯ , x p ( n ) x_{p(1)},x_{p(2)},\cdots,x_{p(n)} x p ( 1 ) , x p ( 2 ) , ⋯ , x p ( n ) 有序。附加要求如下:
算法的空间复杂度为 O ( 1 ) O(1) O ( 1 ) ;
不能修改存储排列 p ( 1 ) , p ( 2 ) , ⋯ , p ( n ) p(1),p(2),\cdots,p(n) p ( 1 ) , p ( 2 ) , ⋯ , p ( n ) 的空间。
极端情况
若记当前环的长度为 n,易知当 ( p ( 1 ) , p ( 2 ) , ⋯ , p ( n ) ) = ( 2 , 3 , . . . , n , 1 ) (p(1),p(2),\cdots,p(n))=(2,3,...,n,1) ( p ( 1 ) , p ( 2 ) , ⋯ , p ( n )) = ( 2 , 3 , ... , n , 1 ) 时即对应 a 的最坏情况,此时 a = ( n − 1 ) + ( n − 2 ) + ⋯ + 0 a=(n-1)+(n-2)+\dots+0 a = ( n − 1 ) + ( n − 2 ) + ⋯ + 0 取到最大值 1 2 ( n 2 − n ) \frac{1}{2}(n^2-n) 2 1 ( n 2 − n ) ,值得注意的是,此时正好对应着 b 的最好情况。
而相类似的,当 ( p ( 1 ) , p ( 2 ) , ⋯ , p ( n ) ) = ( 1 , 2 , 3 , . . . , n ) (p(1),p(2),\cdots,p(n))=(1,2,3,...,n) ( p ( 1 ) , p ( 2 ) , ⋯ , p ( n )) = ( 1 , 2 , 3 , ... , n ) 时即对应 b 的最坏情况,此时正好对应着 a 的最好情况。
平均情况
考虑 n 个元素的全排列的 n ! n! n ! 种可能情况是等可能的,即对应着平均情况。
重新回顾此前的例子排列 p p p ,可以这个排列的环表述为 ( 1 , 8 , 4 ) , ( 2 ) , ( 3 , 7 ) , ( 5 , 6 , 9 ) (1,8,4),(2),(3,7),(5,6,9) ( 1 , 8 , 4 ) , ( 2 ) , ( 3 , 7 ) , ( 5 , 6 , 9 ) ,然而若不加限制,对其中每个环的表述方式会存在多种,难以统一,因此给予以下限制:
每个环从其头元素开始;
每个环的头元素递减排列。
在这样的条件下,环的表述可以固定为 ( 5 , 6 , 9 ) , ( 3 , 7 ) , ( 2 ) , ( 1 , 8 , 4 ) (5,6,9),(3,7),(2),(1,8,4) ( 5 , 6 , 9 ) , ( 3 , 7 ) , ( 2 ) , ( 1 , 8 , 4 ) 。
而此时我们发现括号的存在已无实际意义,因此可以直接去掉。那么,我们可以将每一个 ( p ( 1 ) , p ( 2 ) , ⋯ , p ( n ) ) (p(1),p(2),\cdots,p(n)) ( p ( 1 ) , p ( 2 ) , ⋯ , p ( n )) 的排列映射为符合题意的 ( q ( 1 ) , q ( 2 ) , ⋯ , q ( n ) ) (q(1),q(2),\cdots,q(n)) ( q ( 1 ) , q ( 2 ) , ⋯ , q ( n )) 。
这时,我们可以对 b 的意义进行描述:p p p 中的环的个数 ,也即 q q q 中的 “left-to-right minima” (可以被表示为第一类斯特林数 ),由数学知识,记 b 的平均值为 H n H_n H n ,b 的方差为 H n ( 2 ) H_n^{(2)} H n ( 2 ) ,则有:
H n = 1 + 1 2 + ⋯ + 1 n and H n ( 2 ) = 1 + 1 4 + ⋯ + 1 n 2 H_{n}=1+\frac{1}{2}+\cdots+\frac{1}{n} \quad \text { and } \quad H_{n}^{(2)}=1+\frac{1}{4}+\cdots+\frac{1}{n^{2}} H n = 1 + 2 1 + ⋯ + n 1 and H n ( 2 ) = 1 + 4 1 + ⋯ + n 2 1
接下来我们同样可以对 a 的值进行分析。当循环变量 j = q(i)
时,k 一直往后执行到 q ( i + r ) q(i + r) q ( i + r ) ,满足 q ( i + r ) < q ( i ) q(i+r)<q(i) q ( i + r ) < q ( i ) 亦或 q ( i ) q(i) q ( i ) 为环的头元素,因此会从 q ( i ) q(i) q ( i ) 到 q ( i + r ) q(i+r) q ( i + r ) 执行运算,于是,令:
y i j = { 1 , i f q ( i ) < q ( k ) f o r i < k ⩽ j 0 , o t h e r w i s e y_{ij} = \begin{cases} 1, if\ q(i) < q(k)\ for\ i < k \leqslant j \\ 0, \ otherwise \end {cases} y ij = { 1 , i f q ( i ) < q ( k ) f or i < k ⩽ j 0 , o t h er w i se
那么
a = ∑ 1 ⩽ i < j ⩽ n y i j a=\sum_{1 \leqslant i<j \leqslant n} y_{i j} a = 1 ⩽ i < j ⩽ n ∑ y ij
具体地,在以上实例中,( q ( 1 ) , ⋯ , q ( 9 ) ) = ( 5 , 6 , 9 , 3 , 7 , 2 , 1 , 8 , 4 ) (q(1),\cdots,q(9))=(5,6,9,3,7,2,1,8,4) ( q ( 1 ) , ⋯ , q ( 9 )) = ( 5 , 6 , 9 , 3 , 7 , 2 , 1 , 8 , 4 ) ,此时代入公式可得( i , j ) = ( 1 , 2 ) , ( 1 , 3 ) , ( 2 , 3 ) , ( 4 , 5 ) , ( 7 , 8 ) , ( 7 , 9 ) (i,j)=(1,2),(1,3),(2,3),(4,5),(7,8),(7,9) ( i , j ) = ( 1 , 2 ) , ( 1 , 3 ) , ( 2 , 3 ) , ( 4 , 5 ) , ( 7 , 8 ) , ( 7 , 9 ) 时 y i j = 1 y_{ij}=1 y ij = 1 ,其余情形下 y i j = 0 y_{ij}=0 y ij = 0 。
记 y i j y_{ij} y ij 的平均值为 y ‾ i j \overline y_{ij} y ij ,容易发现它便是所有 n ! n! n ! 个排列中 y i j = 1 y_{ij}=1 y ij = 1 的排列个数,我们有:
a ‾ = ∑ 1 ⩽ i < j ⩽ n y ‾ i j = ∑ 1 ⩽ i < j ⩽ n 1 j − i + 1 = ∑ 2 ⩽ r ⩽ n n + 1 − r r \begin{aligned}
\overline a=\sum_{1 \leqslant i<j \leqslant n} \overline y_{i j} &=\sum_{1 \leqslant i<j \leqslant n} \frac{1}{j-i+1} \\ &=\sum_{2 \leqslant r \leqslant n} \frac{n+1-r}{r}
\end{aligned} a = 1 ⩽ i < j ⩽ n ∑ y ij = 1 ⩽ i < j ⩽ n ∑ j − i + 1 1 = 2 ⩽ r ⩽ n ∑ r n + 1 − r
记调和级数为 H n H_n H n ,对上式进行展开:
a ˉ = ( n + 1 ) ( H n − 1 ) − ( n − 1 ) = ( n + 1 ) H n − 2 n \bar{a}=(n+1)\left(H_{n}-1\right)-(n-1)=(n+1) H_{n}-2 n a ˉ = ( n + 1 ) ( H n − 1 ) − ( n − 1 ) = ( n + 1 ) H n − 2 n
由数学知识易证 H n = ∑ i = 1 n 1 i = O ( log n ) H_n=\sum\limits_{i=1}^n\frac{1}{i}=O(\log n) H n = i = 1 ∑ n i 1 = O ( log n ) ,因此 a 的平均执行次数为 O ( log n ) O(\log n) O ( log n ) 。
接下来我们对 a 的方差进行求解,我们需要计算下面式子的平均值:
( ∑ 1 ⩽ i < j ⩽ n y i j ) 2 = ∑ 1 ⩽ i < j ⩽ n y i j 2 + ∑ 1 ⩽ i < j ⩽ n 1 ⩽ k < l ⩽ n ( i , j ) ≠ ( k , l ) y i j y k l = ∑ 1 ⩽ i < j ⩽ n y ‾ i j + 2 ∑ 1 ⩽ i < j < k < l ⩽ n ( y i j y k l + y i k y j l + y i l y j k ) + 2 ∑ 1 ⩽ i < j < k ⩽ n ( y i j y j k + y i k y j k + y i j y i k ) = a ‾ + 2 ( A + B + C + D + E + F ) \begin{aligned}\left(\sum_{1 \leqslant i<j \leqslant n} y_{i j}\right)^{2}=&\sum_{1 \leqslant i<j \leqslant n} y_{i j}^{2}+\sum_{\substack{1 \leqslant i<j \leqslant n \\ 1 \leqslant k<l \leqslant n \\ (i, j) \neq(k, l)}} y_{i j} y_{k l} \\ =&\sum_{1 \leqslant i<j \leqslant n} \overline y_{i j} +2 \sum_{1 \leqslant i<j<k<l \leqslant n}\left(y_{i j} y_{k l}+y_{i k} y_{j l}+y_{i l} y_{j k}\right) \\ & +2 \sum_{1 \leqslant i<j<k \leqslant n}\left(y_{i j} y_{j k}+y_{i k} y_{j k}+y_{i j} y_{i k}\right) \\ =& \overline a+2(A+B+C+D+E+F)\end{aligned} ( 1 ⩽ i < j ⩽ n ∑ y ij ) 2 = = = 1 ⩽ i < j ⩽ n ∑ y ij 2 + 1 ⩽ i < j ⩽ n 1 ⩽ k < l ⩽ n ( i , j ) = ( k , l ) ∑ y ij y k l 1 ⩽ i < j ⩽ n ∑ y ij + 2 1 ⩽ i < j < k < l ⩽ n ∑ ( y ij y k l + y ik y j l + y i l y jk ) + 2 1 ⩽ i < j < k ⩽ n ∑ ( y ij y jk + y ik y jk + y ij y ik ) a + 2 ( A + B + C + D + E + F )
接下来便是一系列繁杂的数学运算过程:
B = ( n 2 ) − 2 Z , C = Y − Z − 2 ( n 2 ) + 3 X D = E = Z − X , F = ( n 2 ) − 2 X \begin{array}{ll}
B=\left(\begin{array}{l} n \\ 2
\end{array}\right)-2 Z, & C=Y-Z-2\left(\begin{array}{l} n \\ 2
\end{array}\right)+3 X \\ D=E=Z-X, & F=\left(\begin{array}{l} n \\ 2
\end{array}\right)-2 X
\end{array} B = ( n 2 ) − 2 Z , D = E = Z − X , C = Y − Z − 2 ( n 2 ) + 3 X F = ( n 2 ) − 2 X
其中,
X = ∑ 1 ⩽ i < j ⩽ n 1 j − i + 1 Y = ∑ 1 ⩽ i < j ⩽ n H j − i Z = ∑ 1 ⩽ i < j ⩽ n 1 j − i + 1 H j − i \begin{aligned}
X & =\sum_{1 \leqslant i<j \leqslant n}\frac{1}{j-i+1} \\
Y & =\sum_{1 \leqslant i<j \leqslant n}H_{j-i} \\
Z & =\sum_{1 \leqslant i<j \leqslant n}\frac{1}{j-i+1}H_{j-i}
\end{aligned} X Y Z = 1 ⩽ i < j ⩽ n ∑ j − i + 1 1 = 1 ⩽ i < j ⩽ n ∑ H j − i = 1 ⩽ i < j ⩽ n ∑ j − i + 1 1 H j − i
将 r = j − i + 1 r = j−i+1 r = j − i + 1 代入可得:
X = ( n + 1 ) H n − 2 n Y = 1 2 ( n 2 + n ) H n − 3 4 n 2 − 1 4 n Z = 1 2 ( n + 1 ) ( H n 2 − H n ( 2 ) ) − n H n + n \begin{aligned}
X&=(n+1) H_{n}-2 n \\ Y&=\frac{1}{2}\left(n^{2}+n\right) H_{n}-\frac{3}{4} n^{2}-\frac{1}{4} n \\ Z&=\frac{1}{2}(n+1)\left(H_{n}^{2}-H_{n}^{(2)}\right)-n H_{n}+n
\end{aligned} X Y Z = ( n + 1 ) H n − 2 n = 2 1 ( n 2 + n ) H n − 4 3 n 2 − 4 1 n = 2 1 ( n + 1 ) ( H n 2 − H n ( 2 ) ) − n H n + n
相对应地,
A = ∑ 1 ⩽ i < j < k < l ⩽ n 1 ( j − i + 1 ) ( l − k + 1 ) = ∑ r ⩾ 2 s ⩾ 2 r + s ⩽ n 1 r s ( n − r − s + 2 2 ) = ∑ 2 ⩽ r ⩽ t − 2 4 ⩽ t ⩽ n 1 t ( 1 r + 1 t − r ) ( n − t + 2 2 ) = 2 ∑ 2 ⩽ r ⩽ t − 2 4 ⩽ t ⩽ n 1 r t ( n − t + 2 2 ) = ∑ 2 ⩽ r ⩽ t − 2 4 ⩽ t ⩽ n 1 r t ( ( n + 2 ) ( n + 1 ) − t ( 2 n + 3 ) + t 2 ) = ( n + 2 ) ( n + 1 ) U − ( 2 n + 3 ) V + W \begin{aligned}
A &=\sum_{1 \leqslant i<j<k<l \leqslant n} \frac{1}{(j-i+1)(l-k+1)} \\ &=\sum_{\substack{r \geqslant 2 \\ s \geqslant 2 \\ r+s \leqslant n}} \frac{1}{r s}\left(\begin{array}{c} n-r-s+2 \\ 2
\end{array}\right)\\ &=\sum_{\substack{2 \leqslant r \leqslant t-2 \\ 4 \leqslant t \leqslant n}} \frac{1}{t}\left(\frac{1}{r}+\frac{1}{t-r}\right)\left(\begin{array}{c} n-t+2 \\ 2
\end{array}\right)\\ &=2 \sum_{\substack{2 \leqslant r \leqslant t-2 \\ 4 \leqslant t \leqslant n}} \frac{1}{r t}\left(\begin{array}{c} n-t+2 \\ 2
\end{array}\right) \\ &=\sum_{\substack{2 \leqslant r \leqslant t-2 \\ 4 \leqslant t \leqslant n}} \frac{1}{r t}\left((n+2)(n+1)-t(2 n+3)+t^{2}\right) \\ &=(n+2)(n+1) U-(2 n+3) V+W
\end{aligned} A = 1 ⩽ i < j < k < l ⩽ n ∑ ( j − i + 1 ) ( l − k + 1 ) 1 = r ⩾ 2 s ⩾ 2 r + s ⩽ n ∑ rs 1 ( n − r − s + 2 2 ) = 2 ⩽ r ⩽ t − 2 4 ⩽ t ⩽ n ∑ t 1 ( r 1 + t − r 1 ) ( n − t + 2 2 ) = 2 2 ⩽ r ⩽ t − 2 4 ⩽ t ⩽ n ∑ r t 1 ( n − t + 2 2 ) = 2 ⩽ r ⩽ t − 2 4 ⩽ t ⩽ n ∑ r t 1 ( ( n + 2 ) ( n + 1 ) − t ( 2 n + 3 ) + t 2 ) = ( n + 2 ) ( n + 1 ) U − ( 2 n + 3 ) V + W
令 r = j − i + 1 , s = l − k + 1 , t = r + s r=j-i+1,s=l-k+1,t=r+s r = j − i + 1 , s = l − k + 1 , t = r + s ,代入可得:
U = 1 2 ( H n − 1 ) 2 − 1 2 H n ( 2 ) + 1 n V = ( n − 1 ) H n − 2 − 2 n + 4 W = 1 2 ( ( n 2 + n − 2 ) ( H n − 2 − 1 ) − 1 2 ( n − 1 ) ( n − 2 ) + 1 − 3 ( n − 3 ) ) \begin{aligned}
U&=\frac{1}{2}\left(H_{n}-1\right)^{2}-\frac{1}{2} H_{n}^{(2)}+\frac{1}{n} \\ V&=(n-1) H_{n-2}-2 n+4 \\ W&=\frac{1}{2}\left(\left(n^{2}+n-2\right)\left(H_{n-2}-1\right)-\frac{1}{2}(n-1)(n-2)+1-3(n-3)\right)
\end{aligned} U V W = 2 1 ( H n − 1 ) 2 − 2 1 H n ( 2 ) + n 1 = ( n − 1 ) H n − 2 − 2 n + 4 = 2 1 ( ( n 2 + n − 2 ) ( H n − 2 − 1 ) − 2 1 ( n − 1 ) ( n − 2 ) + 1 − 3 ( n − 3 ) )
最终带入整理可以得到:
σ 2 = 2 n 2 − ( n + 1 ) 2 H n ( 2 ) − ( n + 1 ) H n + 4 n \sigma^{2}=2 n^{2}-(n+1)^{2} H_{n}^{(2)}-(n+1) H_{n}+4 n σ 2 = 2 n 2 − ( n + 1 ) 2 H n ( 2 ) − ( n + 1 ) H n + 4 n
对 a 的方差的讨论证明了 O ( n 2 ) O(n^2) O ( n 2 ) 的最坏情况是非常罕见的。最后再进行一些近似,可以得到如下的结论:
a = ( min 0 , ave n ln n + O ( n ) , max 1 2 ( n 2 − n ) , dev 2 − π 2 / 6 n + O ( log n ) ) ; b = ( min 1 , ave ln n + O ( 1 ) , max n , dev ln n + O ( 1 ) ) \begin{aligned}
a&=(\min 0, \text { ave } n \ln n+O(n), \max \frac{1}{2}(n^{2}-n),\text{dev} \sqrt{2-\pi^{2} / 6} n+O(\log n)) ; \\ b&=(\min 1, \text { ave } \ln n+O(1), \max n, \text{dev} \sqrt{\ln n}+O(1))
\end{aligned} a b = ( min 0 , ave n ln n + O ( n ) , max 2 1 ( n 2 − n ) , dev 2 − π 2 /6 n + O ( log n )) ; = ( min 1 , ave ln n + O ( 1 ) , max n , dev ln n + O ( 1 ))
可以得出结论:这个算法的平均时间复杂度为 O ( n log n ) O(n\log n) O ( n log n ) ,在极少数情况下可能达到 O ( n 2 ) O(n2) O ( n 2 ) 。