public IVec part(LVec v) { IVec parts = new IVec(v.size()); for (int i = 0; i < v.size(); i++) { int r = (int) ((v.data[i] - ibase) / cumk); parts.data[i] = r % k; } return parts; }
public LVec[] partition(LVec vv, IVec part, IVec[] mapback) { int[] lens = new int[k]; LVec[] parts = new LVec[k]; int n = vv.size(); for (int i = 0; i < k; i++) { lens[i] = 0; } for (int i = 0; i < n; i++) { int r = part.data[i]; lens[r]++; } for (int i = 0; i < k; i++) { parts[i] = new LVec(lens[i]); mapback[i] = new IVec(lens[i]); lens[i] = 0; } if (mapback != null) { for (int i = 0; i < n; i++) { long v = vv.data[i]; int r = part.data[i]; parts[r].data[lens[r]] = v; mapback[r].data[lens[r]] = i; lens[r]++; } } else { for (int i = 0; i < n; i++) { long v = vv.data[i]; int r = part.data[i]; parts[r].data[lens[r]] = v; lens[r]++; } } return parts; }