12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- class Parallel extends Oblig4 {
- int nThreads = Math.min(
- Runtime.getRuntime().availableProcessors(),
- 16);
-
- Parallel(NPunkter17 points) {
- super(points);
- name = "Parallel";
- }
-
- @Override
- void solve() {
- MinMaxXY minmax = findMinMax();
- MAX_X = x[minmax.maxX];
- MAX_Y = y[minmax.maxY];
-
- IntList indexes = new IntList(n);
- for (int i = 0; i < n; ++i)
- indexes.add(i);
- }
-
- class MinMaxXY {
- int minX, maxX, maxY;
- }
-
- class FindMinMaxWorker extends Thread {
- int start, end;
- int minX, maxX, maxY;
- FindMinMaxWorker(int start, int end) {
- this.start = start;
- this.end = end;
- this.minX = start;
- this.maxX = start;
- this.maxY = start;
- }
-
- public void run() {
- for (int i = start + 1; i < end; ++i) {
- if (x[i] < x[minX])
- minX = i;
- if (x[i] > x[maxX])
- maxX = i;
- if (y[i] > y[maxY])
- maxY = i;
- }
- }
- }
-
- MinMaxXY findMinMax() {
- FindMinMaxWorker[] workers = new FindMinMaxWorker[nThreads];
-
- int d = n / nThreads;
- for (int i = 0; i < nThreads; ++i) {
- workers[i] = new FindMinMaxWorker(
- d * i,
- (i == nThreads - 1
- ? n - 1
- : d * (i + 1)));
- workers[i].start();
- }
-
- MinMaxXY minmax = new MinMaxXY();
- for (FindMinMaxWorker w: workers) {
- try { w.join(); } catch (InterruptedException ex) {}
-
- if (x[w.minX] < x[minmax.minX])
- minmax.minX = w.minX;
- if (x[w.maxX] > x[minmax.maxX])
- minmax.maxX = w.maxX;
- if (y[w.maxY] > y[minmax.maxY])
- minmax.maxY = w.maxY;
- }
-
- return minmax;
- }
- }
|