2016-03-27 6 views
-4

私はjavaの初心者です。私は問題の検索Javaで多くの分を持っています。 私は大きなデータを持っています。このようなデータの例です。Javaで多くの分を検索

k[][] = [74 85 123 
       73 84 122 
       72 83 121 
       70 81 119 
       69 80 118 
       76 87 125 
       77 88 126 
       78 89 127]; 

と出力したいと思います。

min1 = 69 min1 = 80 min1 = 118 
min2 = 70 min2 = 81 min2 = 119 
min3 = 72 min3 = 83 min3 = 121 

私はこのデータで並べ替えを使用しますが、結果は不十分です。 誰かが THX

+2

申し訳ありませんが、私はあなたが何を求めているのか分かりません。あなたは直面している問題を明確にすることができますか? 「結果が効率的でない」とはどういう意味ですか? – Pshemo

+0

各列の3つの最小要素を検索しようとしていますか? –

+0

@ PM77-1私は、OPに必要なのは彼のデータ構造と質問が少し不明だと思います。 –

答えて

0

は、あなたのデータは、各列

  • 以上のN行M列

    1. 反復がのminheap(最小プライオリティキュー)
    2. に列のすべての要素を追加していると言う私を助けてminHeapから最初の3つの数字を取得する(これらは3分になります)
    3. キューをクリアして次の列に移動

    O(N)スペース、O(M N LG(N))時間ここ

  • 1

    は最低X整数を求めるためのヘルパークラスを使用して一般的な実装です。

    3つの列を使用すると、ヘルパークラスのインスタンスが3つ作成され、データが反復されて各列の3つの最小値が収集されます。このコードの

    利点は以下のとおりです。

    • のみXが
    • は整数をボックスする必要はありません
    • はX
    の高い値の性能向上のためのバイナリ検索を使用する値の最低を保持します

    これは、速く、メモリフットプリントが小さく、無制限の量のデータ(ストリーミングされている場合)をサポートする必要があることを意味します。

    デモ用のIDEONEを参照してください。

    import java.util.Arrays; 
    
    class Ideone { 
        private static final int MIN_COUNT = 3; 
        public static void main(String[] args) { 
         int[][] data = { { 74, 85, 123 }, 
             { 73, 84, 122 }, 
             { 72, 83, 121 }, 
             { 70, 81, 119 }, 
             { 69, 80, 118 }, 
             { 76, 87, 125 }, 
             { 77, 88, 126 }, 
             { 78, 89, 127 } }; 
         // Initialize min collectors 
         Min[] min = new Min[data[0].length]; 
         for (int col = 0; col < min.length; col++) 
          min[col] = new Min(MIN_COUNT); 
         // Collect data 
         for (int row = 0; row < data.length; row++) 
          for (int col = 0; col < min.length; col++) 
           min[col].add(data[row][col]); 
         // Print result 
         for (int i = 0; i < MIN_COUNT; i++) { 
          for (int col = 0; col < min.length; col++) 
           System.out.printf("min%d = %-5d ", i + 1, min[col].get(i)); 
          System.out.println(); 
         } 
        } 
    } 
    class Min { 
        private int[] min; 
        public Min(int count) { 
         this.min = new int[count]; 
         Arrays.fill(this.min, Integer.MAX_VALUE); 
        } 
        public void add(int value) { 
         int idx = Arrays.binarySearch(this.min, value); 
         if (idx != -this.min.length - 1) { // not insert at end 
          if (idx < 0) 
           idx = -idx - 1; 
          System.arraycopy(this.min, idx, this.min, idx + 1, this.min.length - idx - 1); 
          this.min[idx] = value; 
         } 
        } 
        public int get(int index) { 
         return this.min[index]; 
        } 
    } 
    
    +0

    このコードは良いです。しかし、私はデータが整数ではない二倍ですか?それを作る方法? – swatzz

    +0

    @swatzzあなたは深刻ですか? –