1

http://www.youtube.com/watch?v=_H50Ir-Tves . _ この実装は正しいですか?前もって感謝します。カタリナ

PS: アルゴリズムの compute() は、渡された配列に対して 7 を返します。両方の配列をマージし、median() メソッドを直接呼び出して中央値を検出すると、値 7 が再び返されます。したがって、このアルゴリズムは正しく動作すると思いますが、機能しない境界ケースや状況がいくつかあるかもしれません。この実装が正しいかどうか、フィードバックをいただけますか?

パブリッククラスの中央値{

public static class MedianDetector {

    public MedianDetector() {}

    public int median( int[] arr) {
        if( arr.length == 1 ) return 0;
        int rest = arr.length%2;
        return arr.length/2+rest;       
    }

    public int compute( int[] a, int[] b ) {
        int aMed = median(a);
        int bMed = (a.length+b.length)/2-aMed; //median finding formula

        if( a.length == 1)
            return a[0];
        if( b.length == 1) 
            return b[0];

        if( b[bMed] <= a[aMed] && a[aMed] <= b[bMed+1] ) {
            return a[aMed];
        } else
        if( a[aMed] <= b[bMed] && b[bMed] <= b[bMed+1] ) {
            int[] _a = new int[ a.length - aMed -1 ]; 
            System.arraycopy(a, aMed+1, _a, 0, _a.length);  
            int[] _b = new int[ bMed];
            System.arraycopy(b, 0, _b, 0, _b.length);   
            return compute( _a, _b);
        } else
        if( b[bMed] <= b[bMed+1] && b[bMed+1] <= a[aMed]) {
            int[] _a = new int[ aMed];
            System.arraycopy(a, 0, _a, 0, _a.length);
            int[] _b = new int[b.length - bMed-1];
            System.arraycopy(b, bMed+1, _b, 0, _b.length);
            return compute( _a, _b);                
        } else{
            throw new RuntimeException();
        }
    }

}

public static void main(String[] args) {

    int[] a = new int[] {1,2,3,3,3,3,4,5,6,7,8,9,9,9,9};
    int[] b = new int[] {5,6,7,8,8,8,9};                                
    System.out.println( (new MedianDetector()).compute(a,b) );  //returns 7

    int[] total = new int[a.length+b.length];
    System.arraycopy(a,0,total,0,a.length);
    System.arraycopy(b,0,total,a.length,b.length);
    //total list: [1, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9]

    List<Integer> totalList = new ArrayList<Integer>();
    for( int t : total )
        totalList.add(t);
    Collections.sort(totalList);
    System.out.println(totalList);      
    System.out.println( (new MedianDetector()).median(total) );
    System.out.println( totalList.get( (new MedianDetector()).median(total) ) ); //returns 7 as well
}

}

4

0 に答える 0