定義
ソートする配列があり、スレッドa[0..n-1]
を使用してそれを実行したいとしましょう。k
簡単にするために、最小の要素の値が 0 で、最大の要素の値が であると仮定しましょうm
。最小値が 0 でない場合は、要素をスレッドに割り当てるときに値をスケーリングできます。
スレッドへの分割
配列をk
チャンクに分割し、それぞれが最大でfloor(m/k) + 1
異なる値の要素で構成されるようにします。
i-th
チャンクは、次のような要素で構成されてa[j]
います。
(i - 1) * (floor(m/k) + 1) <= a[j] < i * (floor(m/k) + 1)
たとえば、10 個の要素を持つ配列がある場合:
a[0..9] = {1, 2, 5, 0, 3, 7, 2, 3 ,4, 6}
そしてk = 3
、そしてm = 7
3 つのチャンクは次のとおりです。
chunk_1: elements in range [0,3) -> [1, 2, 0, 2]
chunk_2: elements in range [3,6) -> [5, 3, 3, 4]
chunk_3: elements in range [6,9) -> [6, 7]
次に、各チャンクを個別のスレッドに割り当てます。各スレッドは 1 つのチャンクをソートし、配列全体をソートするには、すべてのスレッドからの結果を順番に連結します。
thread_1
thread_2
...
thread_k
複雑:
ご存じのように、カウント ソートの複雑さは、 がソートする要素の数であり、 が要素O(n + L)
の最大値です。n
L
まず、各スレッド内の値をそのスレッド内で縮小できることに注意してください。そのL < floor(m/k) + 1
ため、各スレッド内のカウント ソートの複雑さは、常にそのスレッド内の要素の数に依存します。
値の分布が均一であると仮定すると、各スレッドの予想される要素数も にfloor(m/k)
なるため、各スレッドの合計複雑度は になりますO(m/k)
。