辞書の外観によっては、各スレッドに独立したサブツリーを構築させることができれば、ロックはまったく必要ない場合があります。これがオンラインアルゴリズムでない場合は、単語をプレフィックスで事前に並べ替えます(たとえば、スレッドが26未満の場合は最初の文字、スレッドが多い場合は最初と2番目、データのバランスが取れていないことがわかっている場合は、単語の90%など) A)から始めます。基本的に、これはO(n)演算であり、特定の文字で始まる単語の数をカウントするために1回のパスを実行し、次に(選択したプレフィックスで基数ソートの行に沿って)ソートするために1回のパスを実行します。次に、プレフィックスをスレッド間で分割し、各スレッドにこれらの独立したサブツリーを構築させます。最後に、1つのスレッドでこれらの各サブツリーをルートに追加します。以下の例を見ていきます。
あなたの辞書:
樹皮
アップル
クッキー
と
ベイビー
コーン
ブルー
ケーキ
ベーコン
並べ替え後:
アップル
アンド
バーク
ベイビー
ブルー
ベーコン
コーン
クッキー
ケーキ
次に、プレフィックスをスレッド間で分割します。この例では、プレフィックス[A] [B] [C]を取得し、次のツリーを構築する3つのスレッドがあります。
A-| B ------- | C ------- |
PN |-A --- | LO --- | A
PDRBCUORK
LKYOEKNE
ENI
E
そして、次のようにルートでこれらを組み合わせる1つのスレッドがあります。
|-----------ルート------------------|
A-| B ------- | C ------- |
PN |-A --- | LO --- | A
PDRBCUORK
LKYOEKNE
ENI
E
それが理にかなっていることを願っています。
この方法の利点:スレッドは基本的に独立して機能し、ロックの取得と解放を処理する必要がないというオーバーヘッドがありません。
この方法の欠点:辞書について何も知らない場合、深刻なワークロードの不均衡が発生する可能性があり、最悪の場合(たとえば、すべての単語が「A」で始まる)、基本的にシングルスレッドの構築に戻ります。木。これを改善する方法はいくつかあります。たとえば、1文字のプレフィックスを処理するときにワークロードが大幅に不均衡な場合に、最初の2文字を使用するように並べ替えるときにチェックを追加できますが、実際には可能です。バランスが取れていることを保証します。
また、20のスレッドがあり、最初の文字で並べ替えると、アイドル状態のスレッドが発生する場合があります。2つのサブツリーを実行する必要があるスレッドが6つあり、そのうちの14が半分の時間アイドル状態になります。これに対処するためにサブツリーをさらに細分化できる場合がありますが、それは前処理ステップに余分な時間を費やします。
とにかく、これがあなたの方法よりも速いという保証はありませんが、それは考慮すべきことです。