ボールを分配するには、単純に行をたどり、乱数 [0, 1) を要求します。それが 1/(残りのバケツの合計) より小さい場合は、ビンにボールを置き、次のビンに進みます。この終了時にまだボールが残っている場合は、ビン間の差を評価します。ビンが可能な限り離れている場合は、このパスで最大のビンを無視します。これを行うには、最小値を見つけ、それ以上のボールを無視しminimum+difference-1
ます。すべてのボールを分配するまで、このプロセスを繰り返します。
このアルゴリズムの複雑さは、ボールの数 (n) とバケットの数 (m) に依存します。の複雑さがありO(mn)
ます。
各バケットには特定の最小数のボールが含まれている必要があることを認識することで、これを大幅にスピードアップできます。したがって、主要なアルゴリズムを実行する前に、ボールを各バケットに「事前に配置」することで、実行時間を半分に節約できます。
事前に配置可能なボールの数を計算するには、ボールの数をバケツの数で割り、n/m
その下限と上限を取得する必要がa = ceiling(n/m)
あります。b = floor(n/m)
b
これで、各バケット iff で可能なボールの最小数を指定する必要がありますa-b = diff
。方程式が最初に真でない場合、これを解決する方法は多数あります。
while(a-b<diff){
++a;
--b;
}
いずれの場合も、このメソッドは正しくない結果を返すため、a-b = diff
必要なチェックを追加することに注意してください。
b
したがって、ボールを事前に配置できます。