スパース配列について

まず、なぜスパース配列を使うのか?

画像

あなたは2次元配列を使用しての最初のシンクタンクの黒と青の駒の位置を記録したい場合たとえば、このボードは、我々は2次元配列(1つの黒、2、青)を構築し、メモリ空間の多くを無駄に空きスペースの多くを発見しました

私たちは、スパース配列「を記憶するために、この時間を使用することができ、有効なデータを

 

第二に、どのようにスパース配列を使用するには

画像

それぞれ3つの疎な配列(固定カラム)、行番号、列番号と値の合計

                              最初の行:行、列の最初の配列、RMS(意味のある値)

                              他のライン:RMS行番号、列番号と値の連続記録

図は、疎な配列RMSの行数(実効値がNUMを想定)NUM + 1、列番号3

第三に、コードの実装

スパース配列は、アイデアを回します:

  • 良い配列を定義し、割り当てます
  • アレイを介し有効NUMの数を取得します
  • スパースアレイ、行の数はNUM + 1、列3の数、アレイの割り当ての最初の行を定義します
  • 再び疎なアレイに割り当てられた有効な値を得るために、アレイを横切る初期
  • 定義が完了しました

二次元アレイのまばらな配列:

  • 定義最初の行の行及び列の二次元アレイは、スパースアレイから読み出されます
  • スパース配列を回復するために、数行によると、サイクルを設定します

コード:

  1つのINTは、 [] [] = ARRAY1 新しい新しいINT [を11] [11 ];
   2 // 2、黒、青を割り当てアレイ 
  3 ARRAY1 [1] [2] = 1。;
   4配列1 [2] [3。 ] = 2 ;
   5 // 反復 
  6。ためINT []行:配列1){
   7      ためのint型:{行項目)
  。System.out.printの8(項目+ "\ T" ;)
  。9      }
  10      のSystem.out。 println();
  11 }
  12がINT NUM = 0 ;
  13は// の少数の実際の存在を見つけるために、再度繰り返し 
 14  以下のためにint型、Iは<11、I = 0。私は++ ){
  15      のためにINT J = 0; J <11; J ++ ){
  16          IF(配列1 [I] [J]!= 0 ){
  17 NUM ++。  18である         }
 。19      }
  20である}
  21のSystem.out.println( "NUM =" +であるNUM);
  22である
 23れる// 疎なアレイ定義始める 
 24 のint [] [] = Sparse_array 新しい新しい INT [NUMの+ 1] [3 ];
  25 Sparse_array [0] [0] = 11  [1]。26 Sparse_array [0] = 11であり 27 Sparse_array [0] [2] =NUM;
  28 
 29 // 再び疎アレイ割り当てトラバース 
 30 int型のカウント= 0 ;
  31であるためINT I = 0;私は<11; I ++は){
  32      のためにINT J = 0; Jは<11; Jは++ ){
  33は、          IF(!配列1 [I] [J] = 0 ){
  34 COUNT ++で 35 Sparse_array [COUNT] [0] = I;
  36 Sparse_array [COUNT] [1] = J;
  37 Sparse_array [COUNT] [2] = 配列1 [I ] [J];
  38である         }
  39      }
  40 }
  41であります
 42 // 出力スパースアレイ 
 43のSystem.out.println(「+++++++++++++++++++++疎アレイ+++++++++++++ + " );
  44であるためint型 I = 0;私は<Sparse_array.length; I ++は){
  45 System.out.printf(" %D \ D%T \ T%D \ T \ N-」、Sparse_array [I] [ 0]、Sparse_array [I] [1]、Sparse_array [I] [2 ]);
  46である}
  47 のSystem.out.println();
  48 
 49 // 疎なアレイの回復 
 50 のint [] [] =配列2 新しい新しい INT [Sparse_array [0] [0] [Sparse_array [0] [1 ]];
  51である// 疎な配列とループ割り当て 
 52であるためINT I = 1; I <Sparse_array.length; I ++){
  53は配列2 [Sparse_array [I] [0] [。Sparse_array [I] [1] = Sparse_array [I] [2 ];
  54である}
  55 
 56れる// 回収アレイ表示 
 +」(57のSystem.out.printlnを+++++++++++++++++回収アレイ+++++++++++++++ " );
  58 INT []行:配列2){
  59      以下のためにINTのアイテム:行){
  60 System.out.printf(項目+ "\ T" );
  61である     }
  62がある     のSystem.out.println();
  63である}
  64 
 65 

 

 

割り当ては、スパース配列として理解しました:

++数えます
Sparse_array [カウント] [ 0] = I; 
Sparse_array [回数] [ 1] = J。
Sparse_array [カウント] [ 2] =配列1 [I] [J]。

 

なぜ数えますか?

  

 

 私たちは、とき彼の党の割り当て列のみとなり、プログレッシブ割り当て周期であるため、数行ロックの定義

 

 

書くためのクラスHanshun Pingのスパース配列の後に記事を読んでされてShangxue唐先生の後、メモリに強化するための希望を書き留め

 

おすすめ

転載: www.cnblogs.com/han200113/p/11515327.html