Answer

问题及解答

[Thm]使用 Hibbard 增量的谢尔排序的最坏情形运行时间是 $\Theta(N^{3/2})$.

Posted by haifeng on 2013-05-22 20:15:11 last update 2013-05-23 07:47:07 | Edit | Answers (1)

Introduction.

谢尔排序(Shellsort) 的名称源于它的发明者 Donald Shell. 该算法是冲破二次时间屏障的第一批算法之一.

谢尔排序最核心的东西是其采用的增量序列(increment sequence) $1=h_1, h_2,\ldots, h_t$. 一般 $h_t < N/2$. (当然也可以认为是递减序列 $h_t, h_{t-1},\ldots,h_2,h_1=1$.)

依次按 $k=t,t-1,\ldots,2,1$ 的次序, 将要排序的序列 $a_1,a_2,\ldots, a_N$ 中间隔为 $h_k$ 的子序列(共有 $h_k$ 个)进行插入排序.

不同的增量序列, 对于排序的性能有着明显的影响.

一些常见及常用的序列有:

Shell 增量序列(并不好): $h_t=[N/2]$, $h_k=[h_{k+1}/2]$. (此时 $t$ 约为 $[\log N]-1$)

Hibbard 增量序列: $1,3,7,15,31,\ldots,2^t-1$.

Sedgewick 提出了几种增量序列, 其中最好的是 $\{1,5,19,41,109,\ldots\}$, 该序列中的项或者是 $9\times 4^i-9\times 2^i+1$, 或者是 $4^i-3\times 2^i+1$. 确切地,

$i$ 0 1 2 3 4
$9\times 4^i-9\times 2^i+1$ 1 19 109 505 2161
$4^i-3\times 2^i+1$ -1 -1 5 41 209

 


Remark:

使用 Hibbard 增量序列的谢尔排序的平均情形运行时间基于模拟的结果被认为是 $O(N^{5/4})$, 但是没有人能够证明该结果.

Pratt 已经证明, $\Theta(N^{3/2})$ 的界适用于广泛的增量序列.

谢尔排序的性能在实践中是完全可以接受的, 即使是对于数以万计的 $N$ 仍是如此. 编程的简单特点使得它成为对适度的大量输入数据经常选用的算法. 不过相较于快速排序, 谢尔排序仍有不足. 具体参见下面wiki上的描述.


References:

Mark Allen Weiss, 数据结构与算法分析 C++描述(第三版),张怀勇等译.

http://en.wikipedia.org/wiki/Shellsort

1

Posted by haifeng on 2013-05-23 09:46:09

(先证明上界)

对于上界, 还是计算每一趟排序的运行时间的界, 然后对各趟求和. 这里我们将这些趟($h_t,\ldots,h_2,h_1$)分成两组来考虑.

对于 $h_k > \sqrt{N}$ 的增量, 我们已经知道它们每趟的运行时间上界为 $O(N^2/h_k)$. 虽然这对每个 $h_k$ 都成立的, 但是我们想能否得到更好的上界, 所以对于第二部分的 $h_k$(即 $h_k\leq\sqrt{N}$ 的那些 $h_k$), 采用不同的估计法.

为什么第二部分可以得到更好的上界? 从直观意义上, (当然增量序列首先要取得好一点.)由于 $h_k$ 之前已经进行过若干趟排序, 因此一些元素的相对大小顺序已经排好. 对于位置 $p$ 上的任意元素 $a[p]$, 当要执行 $h_k$ 排序时, 只有少数元素在位置 $p$ 的左边且大于 $a[p]$.

当对输入数组进行 $h_k$ 排序时, 已经进行了 $h_{k+1}$ 排序和 $h_{k+2}$ 排序.

在 $h_k$ 排序以前, 考虑位置 $p$ 和 $p-i$ 上的两个元素, 其中 $i\leq p$. 如果 $i$ 是 $h_{k+1}$ 或 $h_{k+2}$ 的倍数, 那么显然 $a[p-i]\leq a[p]$. 不仅如此,

Claim: 如果 $i$ 可以表示为 $h_{k+1}$ 和 $h_{k+2}$ 的线性组合(系数是非负整数), 那么也有 $a[p-i]\leq a[p]$.

Pf. 只要线性表示中系数是非负整数, 则结论是显然的. 首先 $a[p]$ 在某个 $h_{k+1}$ 子列 $S$中, 也在某个 $h_{k+2}$ 子列 $T$ 中. 于是若 $i=sh_{k+1}+th_{k+2}$, 则 $a[p-rh_{k+1}]$ ($r\leq s$) 在子列 $S$ 中, 已经是 $h_{k+1}$ 排序的; 类似的, $a[p-mh_{k+2}]$ ($m\leq t$) 在子列 $T$ 中, 已经是 $h_{k+2}$ 排序的; $a[p-i]\in S\cap T$. 从而 $a[p-i]\leq a[p]$.    (Q.E.D of Claim)

例如: 考虑 $h_{k+2}=15$, $h_{k+1}=7$, $h_k=3$. 现在 $i=52=1\times 7+3\times 15$, 令 $p=152$, 从而 $a[100] < a[152]$, 这是因为
\[
a[100]\leq a[107]\leq a[122]\leq a[137]\leq a[152].
\]

现在, $h_{k+2}=2h_{k+1}+1$, 说明 $h_{k+2}$ 与 $h_{k+1}$ 互素. 在这种情况下, 可以证明, 至少和 $(h_{k+1}-1)(h_{k+2}-1)=8h_k^2+4h_k$ 一样大的所有整数都可以表示为 $h_{k+1}$ 和 $h_{k+2}$ 的线性组合.

Pf.

这就告诉我们, 最内层 for 循环体对于这些 $N-jh_k$ ($j=1,2,\ldots$) 位置上的每一个位置最多执行 $8h_k+4=O(h_k)$ 次. 于是我们得到每趟的界为 $O(Nh_k)$.

Claim: Hibbard 增量序列中满足 $h_k < \sqrt{N}$ 的 $h_k$ 大约有一半.

Pf. 注意到最大的 $h_t=2^t-1$ 不妨设为 $[N/2]$. 所以 $N=2^{t+1}-2$. 从而 $\sqrt{N} < \sqrt{2^{t+1}}=2^{(t+1)/2}$. 这说明若 $h_k=2^k-1 < \sqrt{N}$,则有 $k < (t+1)/2$.    (Q.E.D. of Claim)

于是我们可以计算总的运行时间了. 不妨设 $t$ 是偶数. 将递增序列分成两部分, 分别计算运行时间估计.

\[
O\biggl(\sum_{k=1}^{t/2}Nh_k+\sum_{k=t/2+1}^{t}N^2/h_k\biggr)=O\biggl(N\sum_{k=1}^{t/2}h_k+N^2\sum_{k=t/2+1}^{t}1/h_k\biggr)
\]

其中

\[
\sum_{k=1}^{t/2}h_k=\sum_{k=1}^{t/2}(2^k-1)=\sum_{k=1}^{t/2}2^k-\frac{t}{2}=\frac{2^{t/2+1}-1}{2-1}-1=2^{t/2+1}-2,
\]

而 $N=2^{t+1}-2$, 所以 $\sum_{k=1}^{t/2}h_k=O(\sqrt{N})$. 类似的,

\[
\sum_{k=t/2+1}^{t}\frac{1}{2^k} < \sum_{k=t/2+1}^{t}\frac{1}{h_k}=\sum_{k=t/2+1}^{t}\frac{1}{2^k-1} < \sum_{k=t/2+1}^{t}\frac{1}{2^{k-1}}
\]

注意到

\[
\frac{1}{2^{t/2}} < \sum_{k=t/2+1}^{t}\frac{1}{2^k} < \sum_{k=t/2+1}^{t}\frac{1}{2^{k-1}} < \frac{2}{2^{t/2}}
\]

因此, $\sum_{k=t/2+1}^{t}\frac{1}{h_k}=O(\frac{1}{\sqrt{N}})$. 故, 运行时间为

\[
O(N\cdot\sqrt{N}+N^2\cdot\frac{1}{\sqrt{N}})=O(N^{3/2}).
\]


(下界的证明)