Skip to content

Instantly share code, notes, and snippets.

@Centril
Last active June 15, 2016 09:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Centril/5a0dbf6a46e73e3913388214c0e2fa52 to your computer and use it in GitHub Desktop.
Save Centril/5a0dbf6a46e73e3913388214c0e2fa52 to your computer and use it in GitHub Desktop.
int[] distribute0( int total, int nBuckets ) {
int[] buckets = new int[nBuckets];
int j = 0;
while ( total > 0 ) {
if ( j > buckets.length - 1 ) j = 0;
buckets[j] = buckets[j] + 1;
total--;
j++;
}
return buckets;
}
int[] distribute1( int total, int nBuckets ) {
int[] buckets = new int[nBuckets];
for ( int i = 0; i < nBuckets; total -= buckets[i++] ) {
int tablesLeft = nBuckets - i;
buckets[i] = (total + tablesLeft - 1) / tablesLeft;
}
return buckets;
}
int[] distribute2( int total, int nBuckets ) {
int bucketWithExtra = total % nBuckets;
int minPerBucket = (int) (total / nBuckets);
int[] buckets = new int[nBuckets];
for (int i = 0; i < nBuckets; ++i) {
buckets[i] = minPerBucket;
if (i < bucketWithExtra) buckets[i]++;
}
return buckets;
}
int[] distribute3( int total, int nBuckets ) {
int bucketsWithExtra = total % nBuckets;
int[] buckets = new int[nBuckets];
Arrays.fill( buckets, (int) (total / nBuckets) );
for (int i = 0; i < bucketsWithExtra; ++i) buckets[i]++;
return buckets;
}
int[] distribute4( int total, int nBuckets ) {
int bucketsWithExtra = total % nBuckets;
int minimumForAll = (int) (total / nBuckets);
int[] buckets = new int[nBuckets];
Arrays.fill( buckets, 0, bucketsWithExtra, minimumForAll + 1 );
Arrays.fill( buckets, bucketsWithExtra, nBuckets, minimumForAll );
return buckets;
}
@groovy.transform.CompileStatic
int[] distribute5( int total, int nBuckets ) {
int[] buckets = new int[nBuckets];
int minimum = (int) (total / nBuckets),
extra = minimum + 1,
nExtra = total % nBuckets,
i = 0;
while ( i < nExtra ) { buckets[i++] = extra; }
while ( i < nBuckets ) { buckets[i++] = minimum; }
return buckets;
}
void timeit( String message, int count, Closure cl) {
// Warming period
20.times { cl() }
def startTime = System.nanoTime()
count.times { cl() }
def deltaTime = (System.nanoTime() - startTime) / 1000
def average = (deltaTime / count)
def dtDisp = deltaTime.setScale(1, BigDecimal.ROUND_HALF_UP );
def avgDisp = average.setScale(1, BigDecimal.ROUND_HALF_UP );
println "$message:\tcount: $count \ttime: $dtDisp \taverage: $avgDisp"
}
def benchX( c ) {
for ( int nb = 1; nb < 10; nb++ ) {
for ( int log = 1; log < 5; log++ ) {
int nBuckets = Math.pow( 10, log ) * nb;
int total1 = Math.pow(10, log ) * nBuckets;
int total2 = total1 / 2;
int total3 = total1 - 1;
for ( def total : [total1, total2, total3] )
c( total, nBuckets );
}
}
}
println "Average:"
//Will take too long:
//timeit("distribute0", 5) { benchX( distribute0 ) }
timeit("distribute1", 100 ) { benchX( distribute1 ) }
timeit("distribute2", 1000) { benchX( distribute2 ) }
timeit("distribute3", 1000) { benchX( distribute3 ) }
timeit("distribute4", 1000) { benchX( distribute4 ) }
timeit("distribute5", 1000) { benchX( distribute5 ) }
println "Individual:"
benchX { total, nb ->
println "Testing: (" + total + "," + nb + ")"
if ( total <= Math.pow( 10, 7 ) )
timeit("distribute0", 5) { distribute0( total, nb ) }
timeit("distribute1", 100 ) { distribute1( total, nb ) }
timeit("distribute2", 1000) { distribute2( total, nb ) }
timeit("distribute3", 1000) { distribute3( total, nb ) }
timeit("distribute4", 1000) { distribute4( total, nb ) }
timeit("distribute5", 1000) { distribute5( total, nb ) }
}
Windows 10, Intel Core i7-3610QM, 2.3GHz, 16GB RAM, 256GB SSD
$ groovysh Test.groovy
Groovy Shell (2.4.4, JVM: 1.8.0_51)
Type ':help' or ':h' for help.
----------------------------------------------------------------------------------------------------------------
groovy:000> :load Test.groovy
===> true
===> true
===> true
===> true
===> true
===> true
===> true
===> true
Average:
===> null
===> true
===> true
distribute1: count: 100 time: 1440123.3 average: 14401.2
===> null
distribute2: count: 1000 time: 2562822.7 average: 2562.8
===> null
distribute3: count: 1000 time: 1808702.6 average: 1808.7
===> null
distribute4: count: 1000 time: 1703782.6 average: 1703.8
===> null
distribute5: count: 1000 time: 1656276.4 average: 1656.3
===> null
Individual:
===> null
Testing: (100,10)
distribute0: count: 5 time: 1103.1 average: 220.6
distribute1: count: 100 time: 597.5 average: 6.0
distribute2: count: 1000 time: 5730.0 average: 5.7
distribute3: count: 1000 time: 7802.7 average: 7.8
distribute4: count: 1000 time: 5265.5 average: 5.3
distribute5: count: 1000 time: 5149.5 average: 5.1
Testing: (50,10)
distribute0: count: 5 time: 356.5 average: 71.3
distribute1: count: 100 time: 647.0 average: 6.5
distribute2: count: 1000 time: 6672.4 average: 6.7
distribute3: count: 1000 time: 3862.5 average: 3.9
distribute4: count: 1000 time: 5488.6 average: 5.5
distribute5: count: 1000 time: 2765.7 average: 2.8
Testing: (99,10)
distribute0: count: 5 time: 628.3 average: 125.7
distribute1: count: 100 time: 540.4 average: 5.4
distribute2: count: 1000 time: 3764.8 average: 3.8
distribute3: count: 1000 time: 5114.2 average: 5.1
distribute4: count: 1000 time: 2654.6 average: 2.7
distribute5: count: 1000 time: 2132.5 average: 2.1
Testing: (10000,100)
distribute0: count: 5 time: 10229.3 average: 2045.9
distribute1: count: 100 time: 253.0 average: 2.5
distribute2: count: 1000 time: 2059.3 average: 2.1
distribute3: count: 1000 time: 2282.0 average: 2.3
distribute4: count: 1000 time: 1989.3 average: 2.0
distribute5: count: 1000 time: 1938.4 average: 1.9
Testing: (5000,100)
distribute0: count: 5 time: 7803.2 average: 1560.6
distribute1: count: 100 time: 235.2 average: 2.4
distribute2: count: 1000 time: 2051.3 average: 2.1
distribute3: count: 1000 time: 2241.0 average: 2.2
distribute4: count: 1000 time: 2140.5 average: 2.1
distribute5: count: 1000 time: 2153.5 average: 2.2
Testing: (9999,100)
distribute0: count: 5 time: 2712.2 average: 542.4
distribute1: count: 100 time: 232.5 average: 2.3
distribute2: count: 1000 time: 2048.6 average: 2.0
distribute3: count: 1000 time: 3305.6 average: 3.3
distribute4: count: 1000 time: 4557.8 average: 4.6
distribute5: count: 1000 time: 2418.1 average: 2.4
Testing: (1000000,1000)
distribute0: count: 5 time: 336221.2 average: 67244.2
distribute1: count: 100 time: 1044.2 average: 10.4
distribute2: count: 1000 time: 4222.2 average: 4.2
distribute3: count: 1000 time: 5234.2 average: 5.2
distribute4: count: 1000 time: 3871.5 average: 3.9
distribute5: count: 1000 time: 3619.8 average: 3.6
Testing: (500000,1000)
distribute0: count: 5 time: 166442.6 average: 33288.5
distribute1: count: 100 time: 1041.0 average: 10.4
distribute2: count: 1000 time: 5113.8 average: 5.1
distribute3: count: 1000 time: 3956.2 average: 4.0
distribute4: count: 1000 time: 3637.6 average: 3.6
distribute5: count: 1000 time: 3436.4 average: 3.4
Testing: (999999,1000)
distribute0: count: 5 time: 338774.5 average: 67754.9
distribute1: count: 100 time: 1015.6 average: 10.2
distribute2: count: 1000 time: 4316.8 average: 4.3
distribute3: count: 1000 time: 3821.0 average: 3.8
distribute4: count: 1000 time: 4943.3 average: 4.9
distribute5: count: 1000 time: 3372.1 average: 3.4
Testing: (100000000,10000)
distribute1: count: 100 time: 9579.2 average: 95.8
distribute2: count: 1000 time: 13508.6 average: 13.5
distribute3: count: 1000 time: 11178.0 average: 11.2
distribute4: count: 1000 time: 10372.5 average: 10.4
distribute5: count: 1000 time: 9659.9 average: 9.7
Testing: (50000000,10000)
distribute1: count: 100 time: 9483.7 average: 94.8
distribute2: count: 1000 time: 14042.3 average: 14.0
distribute3: count: 1000 time: 9939.7 average: 9.9
distribute4: count: 1000 time: 9841.1 average: 9.8
distribute5: count: 1000 time: 10317.7 average: 10.3
Testing: (99999999,10000)
distribute1: count: 100 time: 9360.9 average: 93.6
distribute2: count: 1000 time: 16898.2 average: 16.9
distribute3: count: 1000 time: 11917.4 average: 11.9
distribute4: count: 1000 time: 10947.7 average: 10.9
distribute5: count: 1000 time: 10638.0 average: 10.6
Testing: (200,20)
distribute0: count: 5 time: 69.6 average: 13.9
distribute1: count: 100 time: 132.1 average: 1.3
distribute2: count: 1000 time: 2128.5 average: 2.1
distribute3: count: 1000 time: 3130.7 average: 3.1
distribute4: count: 1000 time: 2303.4 average: 2.3
distribute5: count: 1000 time: 3274.9 average: 3.3
Testing: (100,20)
distribute0: count: 5 time: 92.4 average: 18.5
distribute1: count: 100 time: 361.9 average: 3.6
distribute2: count: 1000 time: 3127.6 average: 3.1
distribute3: count: 1000 time: 2983.5 average: 3.0
distribute4: count: 1000 time: 1857.6 average: 1.9
distribute5: count: 1000 time: 3079.0 average: 3.1
Testing: (199,20)
distribute0: count: 5 time: 276.7 average: 55.3
distribute1: count: 100 time: 190.5 average: 1.9
distribute2: count: 1000 time: 1900.5 average: 1.9
distribute3: count: 1000 time: 3395.3 average: 3.4
distribute4: count: 1000 time: 2151.3 average: 2.2
distribute5: count: 1000 time: 2522.1 average: 2.5
Testing: (20000,200)
distribute0: count: 5 time: 5861.2 average: 1172.2
distribute1: count: 100 time: 293.6 average: 2.9
distribute2: count: 1000 time: 1726.0 average: 1.7
distribute3: count: 1000 time: 1788.5 average: 1.8
distribute4: count: 1000 time: 1609.5 average: 1.6
distribute5: count: 1000 time: 1516.7 average: 1.5
Testing: (10000,200)
distribute0: count: 5 time: 2957.1 average: 591.4
distribute1: count: 100 time: 303.0 average: 3.0
distribute2: count: 1000 time: 1829.1 average: 1.8
distribute3: count: 1000 time: 1800.5 average: 1.8
distribute4: count: 1000 time: 1818.8 average: 1.8
distribute5: count: 1000 time: 1513.6 average: 1.5
Testing: (19999,200)
distribute0: count: 5 time: 5991.0 average: 1198.2
distribute1: count: 100 time: 297.2 average: 3.0
distribute2: count: 1000 time: 1874.2 average: 1.9
distribute3: count: 1000 time: 1975.9 average: 2.0
distribute4: count: 1000 time: 1714.0 average: 1.7
distribute5: count: 1000 time: 1626.9 average: 1.6
Testing: (2000000,2000)
distribute0: count: 5 time: 693529.7 average: 138705.9
distribute1: count: 100 time: 2017.4 average: 20.2
distribute2: count: 1000 time: 4867.4 average: 4.9
distribute3: count: 1000 time: 4245.4 average: 4.2
distribute4: count: 1000 time: 5360.1 average: 5.4
distribute5: count: 1000 time: 4134.7 average: 4.1
Testing: (1000000,2000)
distribute0: count: 5 time: 335562.1 average: 67112.4
distribute1: count: 100 time: 1915.7 average: 19.2
distribute2: count: 1000 time: 4915.2 average: 4.9
distribute3: count: 1000 time: 4173.6 average: 4.2
distribute4: count: 1000 time: 3788.9 average: 3.8
distribute5: count: 1000 time: 4544.8 average: 4.5
Testing: (1999999,2000)
distribute0: count: 5 time: 679313.8 average: 135862.8
distribute1: count: 100 time: 1918.3 average: 19.2
distribute2: count: 1000 time: 6045.0 average: 6.0
distribute3: count: 1000 time: 4298.9 average: 4.3
distribute4: count: 1000 time: 3585.9 average: 3.6
distribute5: count: 1000 time: 4592.1 average: 4.6
Testing: (200000000,20000)
distribute1: count: 100 time: 18694.2 average: 186.9
distribute2: count: 1000 time: 23124.4 average: 23.1
distribute3: count: 1000 time: 16684.9 average: 16.7
distribute4: count: 1000 time: 15708.5 average: 15.7
distribute5: count: 1000 time: 15557.7 average: 15.6
Testing: (100000000,20000)
distribute1: count: 100 time: 18648.3 average: 186.5
distribute2: count: 1000 time: 23379.2 average: 23.4
distribute3: count: 1000 time: 15675.9 average: 15.7
distribute4: count: 1000 time: 15440.8 average: 15.4
distribute5: count: 1000 time: 15041.0 average: 15.0
Testing: (199999999,20000)
distribute1: count: 100 time: 18659.4 average: 186.6
distribute2: count: 1000 time: 28758.0 average: 28.8
distribute3: count: 1000 time: 18412.7 average: 18.4
distribute4: count: 1000 time: 15438.1 average: 15.4
distribute5: count: 1000 time: 15534.5 average: 15.5
Testing: (300,30)
distribute0: count: 5 time: 91.5 average: 18.3
distribute1: count: 100 time: 128.1 average: 1.3
distribute2: count: 1000 time: 1413.2 average: 1.4
distribute3: count: 1000 time: 1667.6 average: 1.7
distribute4: count: 1000 time: 1494.4 average: 1.5
distribute5: count: 1000 time: 1360.5 average: 1.4
Testing: (150,30)
distribute0: count: 5 time: 50.9 average: 10.2
distribute1: count: 100 time: 127.6 average: 1.3
distribute2: count: 1000 time: 1416.8 average: 1.4
distribute3: count: 1000 time: 1699.7 average: 1.7
distribute4: count: 1000 time: 1480.6 average: 1.5
distribute5: count: 1000 time: 1347.6 average: 1.3
Testing: (299,30)
distribute0: count: 5 time: 87.9 average: 17.6
distribute1: count: 100 time: 130.3 average: 1.3
distribute2: count: 1000 time: 34165.8 average: 34.2
distribute3: count: 1000 time: 33856.1 average: 33.9
distribute4: count: 1000 time: 33159.6 average: 33.2
distribute5: count: 1000 time: 32388.0 average: 32.4
Testing: (30000,300)
distribute0: count: 5 time: 8563.5 average: 1712.7
distribute1: count: 100 time: 371.3 average: 3.7
distribute2: count: 1000 time: 1753.2 average: 1.8
distribute3: count: 1000 time: 1729.1 average: 1.7
distribute4: count: 1000 time: 1553.3 average: 1.6
distribute5: count: 1000 time: 1603.3 average: 1.6
Testing: (15000,300)
distribute0: count: 5 time: 4262.4 average: 852.5
distribute1: count: 100 time: 376.2 average: 3.8
distribute2: count: 1000 time: 1798.3 average: 1.8
distribute3: count: 1000 time: 1738.9 average: 1.7
distribute4: count: 1000 time: 1602.8 average: 1.6
distribute5: count: 1000 time: 1490.4 average: 1.5
Testing: (29999,300)
distribute0: count: 5 time: 9381.0 average: 1876.2
distribute1: count: 100 time: 385.5 average: 3.9
distribute2: count: 1000 time: 33915.5 average: 33.9
distribute3: count: 1000 time: 35081.0 average: 35.1
distribute4: count: 1000 time: 33448.7 average: 33.4
distribute5: count: 1000 time: 34026.1 average: 34.0
Testing: (3000000,3000)
distribute0: count: 5 time: 1033042.6 average: 206608.5
distribute1: count: 100 time: 3855.4 average: 38.6
distribute2: count: 1000 time: 5980.8 average: 6.0
distribute3: count: 1000 time: 4663.1 average: 4.7
distribute4: count: 1000 time: 5030.3 average: 5.0
distribute5: count: 1000 time: 4049.1 average: 4.0
Testing: (1500000,3000)
distribute0: count: 5 time: 509921.6 average: 101984.3
distribute1: count: 100 time: 2846.5 average: 28.5
distribute2: count: 1000 time: 5521.2 average: 5.5
distribute3: count: 1000 time: 5547.5 average: 5.5
distribute4: count: 1000 time: 4089.2 average: 4.1
distribute5: count: 1000 time: 4027.2 average: 4.0
Testing: (2999999,3000)
distribute0: count: 5 time: 1037396.9 average: 207479.4
distribute1: count: 100 time: 2852.7 average: 28.5
distribute2: count: 1000 time: 38692.8 average: 38.7
distribute3: count: 1000 time: 38016.7 average: 38.0
distribute4: count: 1000 time: 36720.4 average: 36.7
distribute5: count: 1000 time: 36663.8 average: 36.7
Testing: (300000000,30000)
distribute1: count: 100 time: 28006.1 average: 280.1
distribute2: count: 1000 time: 39458.9 average: 39.5
distribute3: count: 1000 time: 27239.9 average: 27.2
distribute4: count: 1000 time: 27180.6 average: 27.2
distribute5: count: 1000 time: 25998.1 average: 26.0
Testing: (150000000,30000)
distribute1: count: 100 time: 27768.7 average: 277.7
distribute2: count: 1000 time: 39022.5 average: 39.0
distribute3: count: 1000 time: 27227.0 average: 27.2
distribute4: count: 1000 time: 26133.7 average: 26.1
distribute5: count: 1000 time: 26669.6 average: 26.7
Testing: (299999999,30000)
distribute1: count: 100 time: 27965.9 average: 279.7
distribute2: count: 1000 time: 78896.9 average: 78.9
distribute3: count: 1000 time: 63905.0 average: 63.9
distribute4: count: 1000 time: 57748.9 average: 57.7
distribute5: count: 1000 time: 58637.8 average: 58.6
Testing: (400,40)
distribute0: count: 5 time: 119.6 average: 23.9
distribute1: count: 100 time: 138.8 average: 1.4
distribute2: count: 1000 time: 1435.5 average: 1.4
distribute3: count: 1000 time: 1710.8 average: 1.7
distribute4: count: 1000 time: 1472.1 average: 1.5
distribute5: count: 1000 time: 1412.3 average: 1.4
Testing: (200,40)
distribute0: count: 5 time: 63.8 average: 12.8
distribute1: count: 100 time: 147.3 average: 1.5
distribute2: count: 1000 time: 1429.3 average: 1.4
distribute3: count: 1000 time: 1561.8 average: 1.6
distribute4: count: 1000 time: 2579.6 average: 2.6
distribute5: count: 1000 time: 1647.0 average: 1.6
Testing: (399,40)
distribute0: count: 5 time: 115.6 average: 23.1
distribute1: count: 100 time: 137.0 average: 1.4
distribute2: count: 1000 time: 1504.2 average: 1.5
distribute3: count: 1000 time: 1770.6 average: 1.8
distribute4: count: 1000 time: 1504.2 average: 1.5
distribute5: count: 1000 time: 1486.8 average: 1.5
Testing: (40000,400)
distribute0: count: 5 time: 11433.2 average: 2286.6
distribute1: count: 100 time: 469.9 average: 4.7
distribute2: count: 1000 time: 1963.0 average: 2.0
distribute3: count: 1000 time: 1805.4 average: 1.8
distribute4: count: 1000 time: 1635.4 average: 1.6
distribute5: count: 1000 time: 2510.9 average: 2.5
Testing: (20000,400)
distribute0: count: 5 time: 5746.5 average: 1149.3
distribute1: count: 100 time: 463.6 average: 4.6
distribute2: count: 1000 time: 1888.9 average: 1.9
distribute3: count: 1000 time: 1798.7 average: 1.8
distribute4: count: 1000 time: 1606.0 average: 1.6
distribute5: count: 1000 time: 1574.7 average: 1.6
Testing: (39999,400)
distribute0: count: 5 time: 12512.2 average: 2502.4
distribute1: count: 100 time: 466.8 average: 4.7
distribute2: count: 1000 time: 1997.8 average: 2.0
distribute3: count: 1000 time: 1934.8 average: 1.9
distribute4: count: 1000 time: 1734.9 average: 1.7
distribute5: count: 1000 time: 1620.2 average: 1.6
Testing: (4000000,4000)
distribute0: count: 5 time: 1381647.9 average: 276329.6
distribute1: count: 100 time: 3782.7 average: 37.8
distribute2: count: 1000 time: 7946.0 average: 7.9
distribute3: count: 1000 time: 4944.2 average: 4.9
distribute4: count: 1000 time: 5900.9 average: 5.9
distribute5: count: 1000 time: 4265.9 average: 4.3
Testing: (2000000,4000)
distribute0: count: 5 time: 671461.1 average: 134292.2
distribute1: count: 100 time: 3737.1 average: 37.4
distribute2: count: 1000 time: 7359.2 average: 7.4
distribute3: count: 1000 time: 5240.9 average: 5.2
distribute4: count: 1000 time: 5825.0 average: 5.8
distribute5: count: 1000 time: 4316.4 average: 4.3
Testing: (3999999,4000)
distribute0: count: 5 time: 1371005.9 average: 274201.2
distribute1: count: 100 time: 3924.6 average: 39.2
distribute2: count: 1000 time: 8052.6 average: 8.1
distribute3: count: 1000 time: 5178.5 average: 5.2
distribute4: count: 1000 time: 5567.6 average: 5.6
distribute5: count: 1000 time: 4506.0 average: 4.5
Testing: (400000000,40000)
distribute1: count: 100 time: 38496.4 average: 385.0
distribute2: count: 1000 time: 47409.8 average: 47.4
distribute3: count: 1000 time: 31460.3 average: 31.5
distribute4: count: 1000 time: 31019.0 average: 31.0
distribute5: count: 1000 time: 29809.3 average: 29.8
Testing: (200000000,40000)
distribute1: count: 100 time: 38027.9 average: 380.3
distribute2: count: 1000 time: 48814.5 average: 48.8
distribute3: count: 1000 time: 32174.7 average: 32.2
distribute4: count: 1000 time: 31306.8 average: 31.3
distribute5: count: 1000 time: 30554.5 average: 30.6
Testing: (399999999,40000)
distribute1: count: 100 time: 37144.8 average: 371.4
distribute2: count: 1000 time: 58072.8 average: 58.1
distribute3: count: 1000 time: 39822.6 average: 39.8
distribute4: count: 1000 time: 33183.2 average: 33.2
distribute5: count: 1000 time: 32224.3 average: 32.2
Testing: (500,50)
distribute0: count: 5 time: 141.9 average: 28.4
distribute1: count: 100 time: 150.8 average: 1.5
distribute2: count: 1000 time: 1469.0 average: 1.5
distribute3: count: 1000 time: 1590.8 average: 1.6
distribute4: count: 1000 time: 1461.4 average: 1.5
distribute5: count: 1000 time: 2451.6 average: 2.5
Testing: (250,50)
distribute0: count: 5 time: 76.3 average: 15.3
distribute1: count: 100 time: 145.0 average: 1.5
distribute2: count: 1000 time: 1441.3 average: 1.4
distribute3: count: 1000 time: 1616.7 average: 1.6
distribute4: count: 1000 time: 1648.4 average: 1.6
distribute5: count: 1000 time: 1575.2 average: 1.6
Testing: (499,50)
distribute0: count: 5 time: 153.5 average: 30.7
distribute1: count: 100 time: 149.9 average: 1.5
distribute2: count: 1000 time: 1519.0 average: 1.5
distribute3: count: 1000 time: 1747.0 average: 1.7
distribute4: count: 1000 time: 1690.8 average: 1.7
distribute5: count: 1000 time: 1444.9 average: 1.4
Testing: (50000,500)
distribute0: count: 5 time: 16042.7 average: 3208.5
distribute1: count: 100 time: 569.4 average: 5.7
distribute2: count: 1000 time: 2050.9 average: 2.1
distribute3: count: 1000 time: 1880.8 average: 1.9
distribute4: count: 1000 time: 1704.1 average: 1.7
distribute5: count: 1000 time: 1590.4 average: 1.6
Testing: (25000,500)
distribute0: count: 5 time: 7222.2 average: 1444.4
distribute1: count: 100 time: 548.4 average: 5.5
distribute2: count: 1000 time: 2024.5 average: 2.0
distribute3: count: 1000 time: 1875.9 average: 1.9
distribute4: count: 1000 time: 1734.5 average: 1.7
distribute5: count: 1000 time: 1564.9 average: 1.6
Testing: (49999,500)
distribute0: count: 5 time: 16074.9 average: 3215.0
distribute1: count: 100 time: 559.6 average: 5.6
distribute2: count: 1000 time: 2083.4 average: 2.1
distribute3: count: 1000 time: 2044.2 average: 2.0
distribute4: count: 1000 time: 1793.8 average: 1.8
distribute5: count: 1000 time: 1996.4 average: 2.0
Testing: (5000000,5000)
distribute0: count: 5 time: 1705778.1 average: 341155.6
distribute1: count: 100 time: 4660.8 average: 46.6
distribute2: count: 1000 time: 8287.8 average: 8.3
distribute3: count: 1000 time: 6712.6 average: 6.7
distribute4: count: 1000 time: 4675.1 average: 4.7
distribute5: count: 1000 time: 6025.8 average: 6.0
Testing: (2500000,5000)
distribute0: count: 5 time: 839544.4 average: 167908.9
distribute1: count: 100 time: 4694.8 average: 46.9
distribute2: count: 1000 time: 7331.1 average: 7.3
distribute3: count: 1000 time: 6183.8 average: 6.2
distribute4: count: 1000 time: 6062.9 average: 6.1
distribute5: count: 1000 time: 4875.9 average: 4.9
Testing: (4999999,5000)
distribute0: count: 5 time: 1699207.0 average: 339841.4
distribute1: count: 100 time: 4684.9 average: 46.8
distribute2: count: 1000 time: 10233.8 average: 10.2
distribute3: count: 1000 time: 6120.4 average: 6.1
distribute4: count: 1000 time: 5882.2 average: 5.9
distribute5: count: 1000 time: 5051.7 average: 5.1
Testing: (500000000,50000)
distribute1: count: 100 time: 46787.8 average: 467.9
distribute2: count: 1000 time: 60716.3 average: 60.7
distribute3: count: 1000 time: 40760.1 average: 40.8
distribute4: count: 1000 time: 39118.0 average: 39.1
distribute5: count: 1000 time: 38210.0 average: 38.2
Testing: (250000000,50000)
distribute1: count: 100 time: 46605.7 average: 466.1
distribute2: count: 1000 time: 60927.4 average: 60.9
distribute3: count: 1000 time: 40384.0 average: 40.4
distribute4: count: 1000 time: 40055.5 average: 40.1
distribute5: count: 1000 time: 38732.5 average: 38.7
Testing: (499999999,50000)
distribute1: count: 100 time: 46535.2 average: 465.4
distribute2: count: 1000 time: 73545.3 average: 73.5
distribute3: count: 1000 time: 48205.4 average: 48.2
distribute4: count: 1000 time: 39677.1 average: 39.7
distribute5: count: 1000 time: 38956.5 average: 39.0
Testing: (600,60)
distribute0: count: 5 time: 232.0 average: 46.4
distribute1: count: 100 time: 152.2 average: 1.5
distribute2: count: 1000 time: 1461.8 average: 1.5
distribute3: count: 1000 time: 1583.7 average: 1.6
distribute4: count: 1000 time: 1560.0 average: 1.6
distribute5: count: 1000 time: 1359.7 average: 1.4
Testing: (300,60)
distribute0: count: 5 time: 87.9 average: 17.6
distribute1: count: 100 time: 153.9 average: 1.5
distribute2: count: 1000 time: 1448.9 average: 1.4
distribute3: count: 1000 time: 1586.3 average: 1.6
distribute4: count: 1000 time: 1485.5 average: 1.5
distribute5: count: 1000 time: 1377.9 average: 1.4
Testing: (599,60)
distribute0: count: 5 time: 173.1 average: 34.6
distribute1: count: 100 time: 153.1 average: 1.5
distribute2: count: 1000 time: 32693.3 average: 32.7
distribute3: count: 1000 time: 33759.3 average: 33.8
distribute4: count: 1000 time: 33171.6 average: 33.2
distribute5: count: 1000 time: 32887.8 average: 32.9
Testing: (60000,600)
distribute0: count: 5 time: 18444.3 average: 3688.9
distribute1: count: 100 time: 641.7 average: 6.4
distribute2: count: 1000 time: 2114.7 average: 2.1
distribute3: count: 1000 time: 1884.9 average: 1.9
distribute4: count: 1000 time: 1776.4 average: 1.8
distribute5: count: 1000 time: 1604.6 average: 1.6
Testing: (30000,600)
distribute0: count: 5 time: 8735.8 average: 1747.2
distribute1: count: 100 time: 643.9 average: 6.4
distribute2: count: 1000 time: 2128.9 average: 2.1
distribute3: count: 1000 time: 1895.6 average: 1.9
distribute4: count: 1000 time: 1799.6 average: 1.8
distribute5: count: 1000 time: 1597.5 average: 1.6
Testing: (59999,600)
distribute0: count: 5 time: 18882.5 average: 3776.5
distribute1: count: 100 time: 649.3 average: 6.5
distribute2: count: 1000 time: 34220.2 average: 34.2
distribute3: count: 1000 time: 35833.8 average: 35.8
distribute4: count: 1000 time: 35360.8 average: 35.4
distribute5: count: 1000 time: 35500.9 average: 35.5
Testing: (6000000,6000)
distribute0: count: 5 time: 2036247.0 average: 407249.4
distribute1: count: 100 time: 5727.8 average: 57.3
distribute2: count: 1000 time: 9003.5 average: 9.0
distribute3: count: 1000 time: 7392.6 average: 7.4
distribute4: count: 1000 time: 5540.4 average: 5.5
distribute5: count: 1000 time: 5692.5 average: 5.7
Testing: (3000000,6000)
distribute0: count: 5 time: 1006516.7 average: 201303.3
distribute1: count: 100 time: 5547.5 average: 55.5
distribute2: count: 1000 time: 8079.8 average: 8.1
distribute3: count: 1000 time: 7483.2 average: 7.5
distribute4: count: 1000 time: 6724.6 average: 6.7
distribute5: count: 1000 time: 5330.6 average: 5.3
Testing: (5999999,6000)
distribute0: count: 5 time: 2071505.6 average: 414301.1
distribute1: count: 100 time: 5678.7 average: 56.8
distribute2: count: 1000 time: 40867.2 average: 40.9
distribute3: count: 1000 time: 39111.3 average: 39.1
distribute4: count: 1000 time: 36053.3 average: 36.1
distribute5: count: 1000 time: 40812.8 average: 40.8
Testing: (600000000,60000)
distribute1: count: 100 time: 56430.3 average: 564.3
distribute2: count: 1000 time: 79335.6 average: 79.3
distribute3: count: 1000 time: 50833.7 average: 50.8
distribute4: count: 1000 time: 52279.5 average: 52.3
distribute5: count: 1000 time: 53078.7 average: 53.1
Testing: (300000000,60000)
distribute1: count: 100 time: 64562.3 average: 645.6
distribute2: count: 1000 time: 75113.4 average: 75.1
distribute3: count: 1000 time: 59007.7 average: 59.0
distribute4: count: 1000 time: 51592.7 average: 51.6
distribute5: count: 1000 time: 51607.9 average: 51.6
Testing: (599999999,60000)
distribute1: count: 100 time: 55752.5 average: 557.5
distribute2: count: 1000 time: 125815.0 average: 125.8
distribute3: count: 1000 time: 98756.2 average: 98.8
distribute4: count: 1000 time: 85312.3 average: 85.3
distribute5: count: 1000 time: 86881.7 average: 86.9
Testing: (700,70)
distribute0: count: 5 time: 191.0 average: 38.2
distribute1: count: 100 time: 163.3 average: 1.6
distribute2: count: 1000 time: 1461.8 average: 1.5
distribute3: count: 1000 time: 1646.1 average: 1.6
distribute4: count: 1000 time: 1455.1 average: 1.5
distribute5: count: 1000 time: 1361.9 average: 1.4
Testing: (350,70)
distribute0: count: 5 time: 100.0 average: 20.0
distribute1: count: 100 time: 176.7 average: 1.8
distribute2: count: 1000 time: 1490.8 average: 1.5
distribute3: count: 1000 time: 1704.6 average: 1.7
distribute4: count: 1000 time: 1484.6 average: 1.5
distribute5: count: 1000 time: 1377.1 average: 1.4
Testing: (699,70)
distribute0: count: 5 time: 215.1 average: 43.0
distribute1: count: 100 time: 169.1 average: 1.7
distribute2: count: 1000 time: 33400.5 average: 33.4
distribute3: count: 1000 time: 34051.6 average: 34.1
distribute4: count: 1000 time: 33738.3 average: 33.7
distribute5: count: 1000 time: 34611.6 average: 34.6
Testing: (70000,700)
distribute0: count: 5 time: 21562.1 average: 4312.4
distribute1: count: 100 time: 743.4 average: 7.4
distribute2: count: 1000 time: 2233.8 average: 2.2
distribute3: count: 1000 time: 1947.3 average: 1.9
distribute4: count: 1000 time: 1741.2 average: 1.7
distribute5: count: 1000 time: 1688.5 average: 1.7
Testing: (35000,700)
distribute0: count: 5 time: 11302.5 average: 2260.5
distribute1: count: 100 time: 738.5 average: 7.4
distribute2: count: 1000 time: 2220.9 average: 2.2
distribute3: count: 1000 time: 1933.1 average: 1.9
distribute4: count: 1000 time: 1760.8 average: 1.8
distribute5: count: 1000 time: 1696.6 average: 1.7
Testing: (69999,700)
distribute0: count: 5 time: 21311.3 average: 4262.3
distribute1: count: 100 time: 731.8 average: 7.3
distribute2: count: 1000 time: 33859.7 average: 33.9
distribute3: count: 1000 time: 35019.9 average: 35.0
distribute4: count: 1000 time: 33192.1 average: 33.2
distribute5: count: 1000 time: 33545.5 average: 33.5
Testing: (7000000,7000)
distribute0: count: 5 time: 2403074.9 average: 480615.0
distribute1: count: 100 time: 6821.9 average: 68.2
distribute2: count: 1000 time: 12740.7 average: 12.7
distribute3: count: 1000 time: 7796.5 average: 7.8
distribute4: count: 1000 time: 7299.8 average: 7.3
distribute5: count: 1000 time: 7926.8 average: 7.9
Testing: (3500000,7000)
distribute0: count: 5 time: 1172567.9 average: 234513.6
distribute1: count: 100 time: 7522.5 average: 75.2
distribute2: count: 1000 time: 9605.9 average: 9.6
distribute3: count: 1000 time: 8142.7 average: 8.1
distribute4: count: 1000 time: 7678.2 average: 7.7
distribute5: count: 1000 time: 7670.6 average: 7.7
Testing: (6999999,7000)
distribute0: count: 5 time: 2407810.7 average: 481562.1
distribute1: count: 100 time: 6747.8 average: 67.5
distribute2: count: 1000 time: 42174.2 average: 42.2
distribute3: count: 1000 time: 40598.2 average: 40.6
distribute4: count: 1000 time: 38060.5 average: 38.1
distribute5: count: 1000 time: 37677.6 average: 37.7
Testing: (700000000,70000)
distribute1: count: 100 time: 65131.7 average: 651.3
distribute2: count: 1000 time: 74692.1 average: 74.7
distribute3: count: 1000 time: 48856.0 average: 48.9
distribute4: count: 1000 time: 48053.7 average: 48.1
distribute5: count: 1000 time: 47411.1 average: 47.4
Testing: (350000000,70000)
distribute1: count: 100 time: 66267.8 average: 662.7
distribute2: count: 1000 time: 77118.3 average: 77.1
distribute3: count: 1000 time: 48843.5 average: 48.8
distribute4: count: 1000 time: 47278.6 average: 47.3
distribute5: count: 1000 time: 47587.9 average: 47.6
Testing: (699999999,70000)
distribute1: count: 100 time: 65926.9 average: 659.3
distribute2: count: 1000 time: 129270.1 average: 129.3
distribute3: count: 1000 time: 89166.4 average: 89.2
distribute4: count: 1000 time: 83016.9 average: 83.0
distribute5: count: 1000 time: 78134.8 average: 78.1
Testing: (800,80)
distribute0: count: 5 time: 219.5 average: 43.9
distribute1: count: 100 time: 173.6 average: 1.7
distribute2: count: 1000 time: 1496.2 average: 1.5
distribute3: count: 1000 time: 1647.5 average: 1.6
distribute4: count: 1000 time: 1504.2 average: 1.5
distribute5: count: 1000 time: 1367.2 average: 1.4
Testing: (400,80)
distribute0: count: 5 time: 113.8 average: 22.8
distribute1: count: 100 time: 171.4 average: 1.7
distribute2: count: 1000 time: 1620.7 average: 1.6
distribute3: count: 1000 time: 1821.1 average: 1.8
distribute4: count: 1000 time: 1567.1 average: 1.6
distribute5: count: 1000 time: 1365.9 average: 1.4
Testing: (799,80)
distribute0: count: 5 time: 218.2 average: 43.6
distribute1: count: 100 time: 171.4 average: 1.7
distribute2: count: 1000 time: 1722.9 average: 1.7
distribute3: count: 1000 time: 1739.8 average: 1.7
distribute4: count: 1000 time: 1527.0 average: 1.5
distribute5: count: 1000 time: 1418.1 average: 1.4
Testing: (80000,800)
distribute0: count: 5 time: 24311.8 average: 4862.4
distribute1: count: 100 time: 819.7 average: 8.2
distribute2: count: 1000 time: 2377.9 average: 2.4
distribute3: count: 1000 time: 1935.3 average: 1.9
distribute4: count: 1000 time: 1794.7 average: 1.8
distribute5: count: 1000 time: 1744.3 average: 1.7
Testing: (40000,800)
distribute0: count: 5 time: 11995.9 average: 2399.2
distribute1: count: 100 time: 818.8 average: 8.2
distribute2: count: 1000 time: 3264.1 average: 3.3
distribute3: count: 1000 time: 1945.1 average: 1.9
distribute4: count: 1000 time: 1797.4 average: 1.8
distribute5: count: 1000 time: 1705.0 average: 1.7
Testing: (79999,800)
distribute0: count: 5 time: 24514.4 average: 4902.9
distribute1: count: 100 time: 821.9 average: 8.2
distribute2: count: 1000 time: 2763.0 average: 2.8
distribute3: count: 1000 time: 2261.0 average: 2.3
distribute4: count: 1000 time: 1953.6 average: 2.0
distribute5: count: 1000 time: 2045.5 average: 2.0
Testing: (8000000,8000)
distribute0: count: 5 time: 2720966.8 average: 544193.4
distribute1: count: 100 time: 7550.6 average: 75.5
distribute2: count: 1000 time: 11456.4 average: 11.5
distribute3: count: 1000 time: 7203.0 average: 7.2
distribute4: count: 1000 time: 7969.6 average: 8.0
distribute5: count: 1000 time: 8145.9 average: 8.1
Testing: (4000000,8000)
distribute0: count: 5 time: 1351489.7 average: 270297.9
distribute1: count: 100 time: 7485.9 average: 74.9
distribute2: count: 1000 time: 11370.8 average: 11.4
distribute3: count: 1000 time: 8415.4 average: 8.4
distribute4: count: 1000 time: 7761.2 average: 7.8
distribute5: count: 1000 time: 7045.0 average: 7.0
Testing: (7999999,8000)
distribute0: count: 5 time: 2843510.9 average: 568702.2
distribute1: count: 100 time: 7575.1 average: 75.8
distribute2: count: 1000 time: 13539.9 average: 13.5
distribute3: count: 1000 time: 9434.6 average: 9.4
distribute4: count: 1000 time: 6830.4 average: 6.8
distribute5: count: 1000 time: 8026.7 average: 8.0
Testing: (800000000,80000)
distribute1: count: 100 time: 75220.4 average: 752.2
distribute2: count: 1000 time: 101524.2 average: 101.5
distribute3: count: 1000 time: 70829.6 average: 70.8
distribute4: count: 1000 time: 67772.9 average: 67.8
distribute5: count: 1000 time: 71134.8 average: 71.1
Testing: (400000000,80000)
distribute1: count: 100 time: 75859.4 average: 758.6
distribute2: count: 1000 time: 103860.6 average: 103.9
distribute3: count: 1000 time: 68903.7 average: 68.9
distribute4: count: 1000 time: 70866.2 average: 70.9
distribute5: count: 1000 time: 68839.0 average: 68.8
Testing: (799999999,80000)
distribute1: count: 100 time: 74516.3 average: 745.2
distribute2: count: 1000 time: 124925.2 average: 124.9
distribute3: count: 1000 time: 83635.4 average: 83.6
distribute4: count: 1000 time: 70353.5 average: 70.4
distribute5: count: 1000 time: 68071.0 average: 68.1
Testing: (900,90)
distribute0: count: 5 time: 259.7 average: 51.9
distribute1: count: 100 time: 191.0 average: 1.9
distribute2: count: 1000 time: 1523.0 average: 1.5
distribute3: count: 1000 time: 2271.7 average: 2.3
distribute4: count: 1000 time: 1520.7 average: 1.5
distribute5: count: 1000 time: 1419.9 average: 1.4
Testing: (450,90)
distribute0: count: 5 time: 146.8 average: 29.4
distribute1: count: 100 time: 186.5 average: 1.9
distribute2: count: 1000 time: 1856.8 average: 1.9
distribute3: count: 1000 time: 1714.0 average: 1.7
distribute4: count: 1000 time: 1602.0 average: 1.6
distribute5: count: 1000 time: 1422.1 average: 1.4
Testing: (899,90)
distribute0: count: 5 time: 251.7 average: 50.3
distribute1: count: 100 time: 187.4 average: 1.9
distribute2: count: 1000 time: 33828.5 average: 33.8
distribute3: count: 1000 time: 34086.8 average: 34.1
distribute4: count: 1000 time: 38234.9 average: 38.2
distribute5: count: 1000 time: 34509.4 average: 34.5
Testing: (90000,900)
distribute0: count: 5 time: 29083.3 average: 5816.7
distribute1: count: 100 time: 918.3 average: 9.2
distribute2: count: 1000 time: 2462.7 average: 2.5
distribute3: count: 1000 time: 2013.4 average: 2.0
distribute4: count: 1000 time: 1937.1 average: 1.9
distribute5: count: 1000 time: 1768.8 average: 1.8
Testing: (45000,900)
distribute0: count: 5 time: 14887.0 average: 2977.4
distribute1: count: 100 time: 921.5 average: 9.2
distribute2: count: 1000 time: 2444.9 average: 2.4
distribute3: count: 1000 time: 2097.3 average: 2.1
distribute4: count: 1000 time: 2316.8 average: 2.3
distribute5: count: 1000 time: 1998.7 average: 2.0
Testing: (89999,900)
distribute0: count: 5 time: 29057.8 average: 5811.6
distribute1: count: 100 time: 940.2 average: 9.4
distribute2: count: 1000 time: 42545.0 average: 42.5
distribute3: count: 1000 time: 35070.7 average: 35.1
distribute4: count: 1000 time: 34584.4 average: 34.6
distribute5: count: 1000 time: 36006.5 average: 36.0
Testing: (9000000,9000)
distribute0: count: 5 time: 3073260.2 average: 614652.0
distribute1: count: 100 time: 8279.3 average: 82.8
distribute2: count: 1000 time: 12149.4 average: 12.1
distribute3: count: 1000 time: 9484.1 average: 9.5
distribute4: count: 1000 time: 8654.6 average: 8.7
distribute5: count: 1000 time: 8579.2 average: 8.6
Testing: (4500000,9000)
distribute0: count: 5 time: 1529484.2 average: 305896.8
distribute1: count: 100 time: 8261.9 average: 82.6
distribute2: count: 1000 time: 12591.6 average: 12.6
distribute3: count: 1000 time: 8646.5 average: 8.6
distribute4: count: 1000 time: 8544.4 average: 8.5
distribute5: count: 1000 time: 8291.8 average: 8.3
Testing: (8999999,9000)
distribute0: count: 5 time: 3079991.5 average: 615998.3
distribute1: count: 100 time: 8341.3 average: 83.4
distribute2: count: 1000 time: 45457.6 average: 45.5
distribute3: count: 1000 time: 43133.6 average: 43.1
distribute4: count: 1000 time: 39917.2 average: 39.9
distribute5: count: 1000 time: 39287.6 average: 39.3
Testing: (900000000,90000)
distribute1: count: 100 time: 84561.3 average: 845.6
distribute2: count: 1000 time: 114747.2 average: 114.7
distribute3: count: 1000 time: 75203.0 average: 75.2
distribute4: count: 1000 time: 73855.4 average: 73.9
distribute5: count: 1000 time: 75482.8 average: 75.5
Testing: (450000000,90000)
distribute1: count: 100 time: 83921.4 average: 839.2
distribute2: count: 1000 time: 111972.6 average: 112.0
distribute3: count: 1000 time: 75935.3 average: 75.9
distribute4: count: 1000 time: 75827.3 average: 75.8
distribute5: count: 1000 time: 74367.7 average: 74.4
Testing: (899999999,90000)
distribute1: count: 100 time: 84030.3 average: 840.3
distribute2: count: 1000 time: 171626.8 average: 171.6
distribute3: count: 1000 time: 124847.6 average: 124.8
distribute4: count: 1000 time: 107471.9 average: 107.5
distribute5: count: 1000 time: 108423.3 average: 108.4
===> null
groovy:000>
#include <iostream>
void distribute4( const int total, int* const buckets, const int nBuckets ) {
const int minimum = total / nBuckets,
nExtra = total % nBuckets;
std::fill_n( buckets, nExtra, minimum + 1 );
std::fill_n( buckets + nExtra, nBuckets - nExtra, minimum );
}
int main( int argc, char const *argv[] ) {
int buckets[10];
distribute4( 98, buckets, 10 );
for ( int x : buckets ) std::cout << x << " ";
std::cout << std::endl;
return 0;
}
import Data.Foldable (foldl')
import Data.List (genericReplicate)
distribute2 :: Integral a => a -> a -> [a]
distribute2 sum nBuckets =
let distHelp nBuckets (remains, tables) i =
let tablesLeft = nBuckets - i
currBucket = (remains + tablesLeft - 1) `div` tablesLeft
in (remains - currBucket, tables ++ [currBucket])
in snd $ foldl' (distHelp nBuckets) (sum, []) [0..nBuckets - 1]
distribute4 :: Integral a => a -> a -> [a]
distribute4 sum nBuckets =
let bucketsWithExtra = sum `rem` nBuckets
minimumForAll = sum `div` nBuckets
start = genericReplicate bucketsWithExtra (minimumForAll + 1)
end = genericReplicate (nBuckets - bucketsWithExtra) minimumForAll
in start ++ end
prop_eq :: Integral a => a -> a -> Bool
prop_eq s n = let (sum, nBuckets) = (max 0 s, max 1 n)
in distribute2 sum nBuckets == distribute4 sum nBuckets
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment