Median of Medians



 if you just get the student who is ranked 50th in the class. Now in another single pass (O(n)
), you can just compare the marks of the rest of the students with the selected student. 

Code from http://yiqi2.wordpress.com/2013/07/03/median-of-medians-selection-algorithm/
Also check http://javatroops.blogspot.com/2012/10/median-of-medians-to-find-kth-smallest.html
private int find(int[] a, int s, int n, int k ) {
    // start point s, length n, find k-th number
    if ( n == 1 && k == 1 )
        return a[s];
     
    int m = (n+4) /5;
    int[] mid = new int[m];
     
    for (int i=0; i<m; i++) {
        int t = s+i*5;      // 5-elements block pointer
        if ( n-t > 4 ) {
            sort(a, t, 5);      // sort 5 elements
            mid[i] = a[t+2];
        }
        else {      // less than 5 left
            sort(a, t, n-t);    // sort the rest
            mid[i] = a[t+(n-t-1)/2];
        }
    }
     
    int pivot = find(mid, 0, m, (m+1)/2);
     
    for (int i=0; i<n; i++) {        // find pivot location
        if (a[s+i] == pivot ) {
            swap(a, s+i, s+n-1);
            break;
        }
    }
     
    int pos = 0;
    for (int i=0; i<n-1; i++) {      // using pivot to part
        if ( a[s+i] < pivot ) {
            if ( i != pos )
                swap(a, s+i, s+pos);
            pos++;
        }
    }
    swap(a, s+pos, s+n-1);
     
    if ( pos == k-1 )
        return pivot;
    else if ( pos > k-1 )
        return find(a, s, pos, k);
    else
        return find(a, s+pos+1, n-pos-1, k-pos-1);
}

Quick Select:
http://ajeetsingh.org/2013/09/20/median-of-medians-find-kth-largest-element-from-a-large-un-sorted-array/
int findKthElement(int[] input, int K){
           int lo = 0, hi = input.length - 1;
           while (hi > lo) {
              int i = partition(input, lo, hi);
           if (i > k)
 
              hi = i - 1;
           else if (i < k)
 
              lo = i + 1;
           else
 
              return input[i];
        }
        return input[lo];
}
 
int partition(int[] input, int lo, int hi) {
          int i = lo;
          int j = hi + 1;
          int pivot = input[lo];
          while (true) {
             while (less(input[++i], pivot))
                 if (i == hi)
                        break;
             while (less(pivot, input[--j]))
                    if (j == lo)
                         break;
             if (i >= j)
                    break;
             exchange(input[i], input[j]);
          }
          exchange(input[lo], input[j]);
          return j;
 }
Read full article from Median of Medians

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts