目次
この項目では基数、カウンティングソート等の情報工学の基礎については前提知識とします。
基数整列は、複数桁の数値や文字列を、各桁のバイトを使用して整列するのに用います。各桁が表す整数(文字)のバイトサイズはRadix Rとするため、Radix Sortと呼びます。
基数整列アルゴリズムは、入力桁(ソートキー)をR個に分割するものとします。例えば基数が1バイト(8-bit)であれば、256個に分割します。基数の単位は一般に「Bucket」(バケット)または「Bin」(ビン)と呼称します。
基数整列にはMSDとLSDの2種類がありますが、MSD(Most Significant Digit)はソーティングキーを左数えします。反対にLSD(Least Significant Digit)は右からソーティングキーを数えていきます。
基数配列(Radix Sort)の並列化についてはいくつかありますが、一般的な参考文献となる以下のものを使います。
「Radix Sort for Vector Multiprocessors. Marco Zagha, Guy E. Blelloch」
Zagha & Blellochのアルゴリズムは3部で構成されます。
これらのステップは「カウンティングソート」(バケットソートが用いられることもある)に基づいています。
ソート // K: 未整列データ // N-1: データサイズ // D: ソーティングキー do j = 0 to N - 1 D[j] = K[j] & R 基数キーのヒストグラム // R: (2のr乗 - 1) do i = 0 to (2のr乗 - 1) Bucket[i] = 0 do j = 0 to N – 1 Bucket[D[j]] = Bucket[D[j]] + 1 //(1) バケットのスキャン(Prefix-Sum) Sum = 0 do i = 0 to 2のr乗 – 1 Val = Bucket[i] Bucket[i] = Sum //(2) Sum = Sum + Val 並び替え do j = 0 to N – 1 A = Bucket[D[j]] // R: 整列データ // K: 未整列データ R[A] = K[j] //(3) Bucket[D[j]] = A + 1 //(4)
D[j]をインデックスとしてBucketをインクリメント。ソーティングキーのヒストグラムを作ります。 | |
Prefix sumを計算します。累積ヒストグラムと同じものです。 | |
整列データの配列を更新します。 | |
Aの位置をインクリメントして、次に更新する整列データの配列の添字を移動 |
累積ヒストグラムについての定義は以下の式で表せます。
(1)のnはビン(バケツ)を指し、(2)のMは累積値を示します。
Copyright 2018-2019, by Masaki Komatsu