diff --git a/geometric_separators.pde b/geometric_separators.pde index f408aa7..bc64044 100644 --- a/geometric_separators.pde +++ b/geometric_separators.pde @@ -83,36 +83,60 @@ void approxCenter(ArrayList input) { // Estimate the geometric median - dynamic programming void geomMedian() { - // Memoization hash tables - HashMap xMemoize = new HashMap(); - HashMap yMemoize = new HashMap(); - // Calculate for x-axis - // For each point - for (int i = 0; i < inputX.size(); i++) { - float currentPoint = inputX.get(i); - ArrayList leftSquares = new ArrayList(); - ArrayList rightSquares = new ArrayList(); - ArrayList upSquares = new ArrayList(); - ArrayList downSquares = new ArrayList(); - // Get distance to every previous point - } + // Nothing yet } // Calculate the distance with the input, memoization -void calcDist(float point, ArrayList input, HashMap memoize) { - if (memoize.contains(currentPoint)) { - // Reuse solution - return memoize.get(currentPoint); - } - else { +float calcDist(float point, ArrayList input) { int dist = point - prevPoint; + // For each point before i, calculate distance to i for (int j = 0; j < i; j++) { float prevPoint = input.get(j); sum += currentPoint - prevPoint; } - memoize.put(currentPoint, sum); return sum; +} + +// Calculate last sum and its distance from i +float calcLastSum(int i, ArrayList input, HashMap memoize) { + // Calculate for squares + float sum; + // If possible, reuse solution + if (memoize.contains(i)) { + sum = memoize.get(i); + } + // Otherwise, calculate + else { + sum = calcDist(currentPoint, input); + } + float currentPoint = input.get(i); + float nextPoint = input.get(i + 1); + float dist = nextPoint - currentPoint; + return sum, dist; +} + +// Get sums and sums of squares of distances for an input +float getSums(ArrayList input) { + // Memoization hash tables + HashMap sumMemoize = new HashMap(); + HashMap sumSquaresMemoize = new HashMap(); + for (int i = 0; i < input.size() - 1; i++) { + float sum, dist; + // Calculate sum + sum, dist = calcLastSum(i, input, sumMemoize); + sumMemoize.put(i + 1, sum + (i * dist)); + // Calculate sum of squares + sum, dist = calcLastSum(i, input, sumSquaresMemoize); + sumSquaresMemoize.put(i + 1, sum + (i * Math.pow(d, 2)) + (2 * i * dist)); + } + // Sum results for input + float sum = 0; + float sumSquares = 0; + for (int i = 0; i < input.size(); i++) { + sum += sumMemoize.get(i); + sumSquares += sumSquaresMemoize.get(i); } + return sum, sumSquares; } // Draw