美文网首页
1.4.15 ThreeSum

1.4.15 ThreeSum

作者: 风亡小窝 | 来源:发表于2016-07-28 17:24 被阅读9次
    package analyse;
    import java.util.Arrays;
    
    import edu.princeton.cs.algs4.*;
    import search.BinarySearch;
    import tool.StopWatch;
    
    public class ThreeSum {
        public static int count(int[] a){
            int count = 0;
            int len = a.length;
            
            for(int i = 0; i < len; i++){
                for(int j  = i + 1; j < len; j++){
                    for(int z = j + 1; z < len; z++){
                        if((a[i] + a[j] + a[z]) == 0){
                            count++;
                        }
                    }
                }
            }
            
            return count;
        }
        
        public static int countFaster(int[] a){
            int count = 0;
            int len = a.length;
            Arrays.sort(a); 
            
            for(int i = 0; i < len; i++){
                for(int j = i + 1; j < len; j++){
                    if(j < BinarySearch.rank(-a[i]-a[j], a))
                        count++;
                }
            }   
            
            return count;
        }
        
        public static int countFastest(int[] a){
            int count = 0;
            Arrays.sort(a);
            int len = a.length;
            int posmin;
            int posmax;
        
            for(int i = 0; i < len; i++){
                posmin = i + 1;
                posmax = len - 1;
                while(posmin < posmax && a[posmin] + a[i] <= 0){
                    if(a[posmin] + a[i] + a[posmax] < 0) posmin++;
                    else if(a[posmin] + a[i] + a[posmax] > 0) posmax--;
                    else {posmin++; posmax--; count++;}
                }
            }
    
            return count;
        }
        
        public static void main(String[] args) {
            //Attention: the array must has no duplicate elements;
    
            int a[] = new In("data/4Kints.txt").readAllInts();
            Stopwatch timer = new Stopwatch();
            System.out.print(count(a) + " ");
            System.out.println(timer.elapsedTime());
            
            Stopwatch timer2 = new Stopwatch();
            System.out.print(countFaster(a) + " ");
            System.out.println(timer2.elapsedTime());
            
            Stopwatch timer3 = new Stopwatch();
            System.out.print(countFastest(a) + " ");
            System.out.println(timer3.elapsedTime());
            
        }
    }
    

    来见证不同算法的性能差距吧吧:

    Paste_Image.png

    相关文章

      网友评论

          本文标题:1.4.15 ThreeSum

          本文链接:https://www.haomeiwen.com/subject/shbajttx.html