public static float torben()

in pdq/java/src/main/java/pdqhashing/utils/MatrixUtil.java [50:99]


  public static float torben(float[][] m, int numRows, int numCols) {
    int n = numRows * numCols;
    int midn = (n + 1) / 2;

    int i, j, less, greater, equal;
    float min, max, guess, maxltguess, mingtguess;

    min = max = m[0][0];
    for (i = 0; i < numRows; i++) {
      for (j = 0; j < numCols; j++) {
        float v = m[i][j];
        if (v < min) min = v;
        if (v > max) max = v;
      }
    }

    while (true) {
      guess = (min + max)/2;
      less = 0; greater = 0; equal = 0;
      maxltguess = min;
      mingtguess = max;

      for (i = 0; i < numRows; i++) {
        for (j = 0; j < numCols; j++) {
          float v = m[i][j];
          if (v <guess) {
            less++;
            if (v > maxltguess) maxltguess = v;
          } else if (v > guess) {
            greater++;
            if (v < mingtguess) mingtguess = v;
          } else equal++;
        }
      }

      if (less <= midn && greater <= midn)
        break;
      else if (less>greater)
        max = maxltguess;
      else
        min = mingtguess;
    }
    if (less >= midn) {
      return maxltguess;
    } else if (less+equal >= midn) {
      return guess;
    } else {
      return mingtguess;
    }
  }