間隔の決め方
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/06 14:29 UTC 版)
シェルソートの実行時間(時間計算量)は、比較時に選ぶ間隔hによって大きく異なる。前節の例ではhを2の累乗としたが、この場合、最悪計算量が O ( n 2 ) {\displaystyle \mathrm {O} (n^{2})} となってしまう。各周回で同じ位置の要素ばかりが比較交換されるため、h=1となった段階で「全体が大まかに整列されている」という仮定が成り立たなくなるためである。より効率の良い(計算量の少ない)ソートを行うために、様々な間隔が提案されてきた。以下の表は、間隔を決定するための数列の例である。( n {\displaystyle n} は要素数) 数列の一般項 (k ≥ 1)実際の数列最悪計算時間備考 ⌊ n 2 k ⌋ {\displaystyle \left\lfloor {\frac {n}{2^{k}}}\right\rfloor } ⌊ n 2 ⌋ , ⌊ n 4 ⌋ , … , 1 {\displaystyle \left\lfloor {\frac {n}{2}}\right\rfloor ,\left\lfloor {\frac {n}{4}}\right\rfloor ,\ldots ,1} O ( n 2 ) {\displaystyle \mathrm {O} (n^{2})} ドナルド・シェルが最初に考案した数列。 n {\displaystyle n} が2の累乗の時、上記動作例と同一。 3 k − 1 2 {\displaystyle {\frac {3^{k}-1}{2}}} ( ⌈ n 3 ⌉ {\displaystyle \left\lceil {\frac {n}{3}}\right\rceil } 以下) 1 , 4 , 13 , 40 , 121 , … {\displaystyle 1,4,13,40,121,\ldots } O ( n 3 2 ) = O ( n 1.5 ) {\displaystyle \mathrm {O} \left(n^{\frac {3}{2}}\right){=}\mathrm {O} (n^{1.5})} ドナルド・クヌース、 1973Pratt, 1971に基づく。平均計算時間は O ( n 1.25 ) {\displaystyle \mathrm {O} (n^{1.25})} 。 A 0 = 1 , A k = 4 k + 3 ⋅ 2 k − 1 + 1 {\displaystyle A_{0}{=}1,A_{k}{=}4^{k}+3\cdot 2^{k-1}+1} 1 , 8 , 23 , 77 , 281 , … {\displaystyle 1,8,23,77,281,\ldots } O ( n 4 3 ) = O ( n 1.33 … ) {\displaystyle \mathrm {O} \left(n^{\frac {4}{3}}\right){=}\mathrm {O} (n^{1.33\ldots })} Sedgewick, 1982 2 p 3 q {\displaystyle 2^{p}3^{q}} ( p ≥ 0 , q ≥ 0 {\displaystyle p\geq 0,q\geq 0} ) 1 , 2 , 3 , 4 , 6 , 8 , 9 , 12 , … {\displaystyle 1,2,3,4,6,8,9,12,\ldots } O ( n log 2 n ) {\displaystyle \mathrm {O} \left(n\log ^{2}n\right)} Pratt, 1971既知の数列で最悪計算時間が最小となるもの。間隔の狭め方が細かすぎるため、実用性は低い。 これらの数列をソートの間隔として利用する際は、(要素数以内で)大きな数字から狭めていく。 3 k − 1 2 {\displaystyle {\frac {3^{k}-1}{2}}} を使う場合、間隔hを121→40→13→4→1とする(hを3で整数除算していけばよい)。様々な間隔の計算量について理論的に考察されているが、現状、どのような間隔が最適か(例えば、平均 O ( n log n ) {\displaystyle \mathrm {O} (n\log n)} 時間となる数列があるか)は未解決問題である。
※この「間隔の決め方」の解説は、「シェルソート」の解説の一部です。
「間隔の決め方」を含む「シェルソート」の記事については、「シェルソート」の概要を参照ください。
- 間隔の決め方のページへのリンク