Java プログラミング スキル - データ構造とアルゴリズム「スパース配列」

Java プログラミング スキル - データ構造とアルゴリズム「スパース配列」

[[385874]]

基本的な紹介

配列内のほとんどの要素が 0 であるか、同じ値を持つ配列である場合、スパース配列を使用して配列を保存できます。

スパース配列の処理方法は次のとおりです。

  1. 配列の行と列の数、および配列に含まれる異なる値の数を記録します。
  2. プログラムのサイズを縮小するために、異なる値を持つ要素の行と列を小さな配列に記録します。

元の2次元配列


元の2次元配列

変換された2次元配列

最初の行は、元の配列の行と列の数、および値の数を記録します(8<<は元の配列の値の数を表します22、15、11、17、-6、39、91、28>>)


変換された2次元配列

2次元配列を疎配列に変換するためのアイデア

  1. 元の2次元配列を走査し、有効なデータの数の合計を取得します。
  2. 合計に応じて、疎配列sparseArr int(sum+1)(3)を作成できます。
  3. 2次元配列の有効なデータをスパース配列に格納する

疎な配列を元の2次元配列に変換するためのアイデア

  1. まず、スパース配列の最初の行を読み取り、最初の行のデータに基づいて元の2次元配列を作成します。
  2. 次に、スパース配列の最後の数行のデータを読み取り、元の 2 次元配列に割り当てます。

アプリケーション例

  1. 上記と同様の 2 次元配列 (chessboard\map) を保持するには、スパース配列を使用します。
  2. 疎配列をディスクに保存し、元の2次元配列を復元します。

コード例

  1. パッケージ com.structures.sparsearray;
  2.  
  3. パブリッククラスSparseArray {
  4.  
  5. 公共 静的void main(String[] args) {
  6. // オリジナルの2次元配列11*11を作成する
  7. //0: チェスの駒がないことを示す、1 は黒いチェスの駒を示す、2 は白いチェスの駒を示す
  8. int [][] chessArr1 = 新しいint [11][11];
  9. チェスArr1[1][2] = 1;
  10. チェスArr1[2][3] = 2;
  11. // 元の2次元配列を出力する
  12. System.out.println ( "元2次元配列" );
  13. ( int [] ints : chessArr1)の場合{
  14. ( int anInt : ints)の場合{
  15. System.out.printf ( "%d\t" 、 anInt) ;
  16. }
  17. System.out.println( ) ;
  18. }
  19. //2次元配列をスパース配列に変換する
  20. //1. まず 2 次元配列を走査して、ゼロ以外のデータの数を取得します。
  21. 整数 合計= 0;
  22. ( int [] ints : chessArr1)の場合{
  23. ( int anInt : ints)の場合{
  24. (整数が0の場合){
  25. 合計++;
  26. }
  27. }
  28. }
  29. システム.out.println ( "sum = " + sum );
  30. //2. 対応するスパース配列を作成する
  31. int [][] sparseArr = 新しいint [合計+ 1][3];
  32. // 疎配列に値を割り当てる
  33. スパースArr[0][0] = 11;
  34. スパースArr[0][1] = 11;
  35. sparseArr[0][2] =合計;
  36. //元の配列を走査し、スパース配列にゼロ以外の値を格納する
  37. 整数  count = 0; // countはゼロ以外のデータの数を記録するために使用されます
  38. ( int i = 0; i < chessArr1.length; i++) {
  39. ( int j = 0 ; j < chessArr1[i].length; j++) {
  40. チェスArr1[i][j] != 0 の場合 {
  41. カウント++;
  42. sparseArr[カウント][0] = i;
  43. sparseArr[カウント][1] = j;
  44. sparseArr[カウント][2] = chessArr1[i][j];
  45. }
  46. }
  47. }
  48. // 疎な配列を出力する
  49. System.out.println( ) ;
  50. System.out.println ( "得られたスパース配列は~~~~です" );
  51. ( int [] ints : sparseArr )の場合{
  52. ( int anInt : ints)の場合{
  53. (整数が0の場合){
  54. System.out.printf ( "%d\t" 、 anInt) ;
  55. }
  56. }
  57. System.out.println( ) ;
  58. }
  59.  
  60. //スパース配列を元の配列に復元する
  61. int [][] chessArr2 = 新しいint [sparseArr[0][0]][sparseArr[0][1]];
  62. ( int i = 0; i < sparseArr[0][2]; i++) {
  63. チェスArr2[sparseArr[i + 1][0]][sparseArr[i + 1][1]] = sparseArr[i + 1][2];
  64. }
  65. //復元後の元の配列
  66. System.out.println ( "復元後の元の配列" );
  67. ( int [] ints : chessArr2)の場合{
  68. ( int anInt : ints)の場合{
  69. System.out.printf ( "%d\t" 、 anInt) ;
  70. }
  71. System.out.println( ) ;
  72. }
  73. }
  74. }
  75. /*
  76. 元の2次元配列
  77. 0 0 0 0 0 0 0 0 0 0 0
  78. 0 0 1 0 0 0 0 0 0 0 0
  79. 0 0 0 2 0 0 0 0 0 0 0
  80. 0 0 0 0 0 0 0 0 0 0 0
  81. 0 0 0 0 0 0 0 0 0 0 0
  82. 0 0 0 0 0 0 0 0 0 0 0
  83. 0 0 0 0 0 0 0 0 0 0 0
  84. 0 0 0 0 0 0 0 0 0 0 0
  85. 0 0 0 0 0 0 0 0 0 0 0
  86. 0 0 0 0 0 0 0 0 0 0 0
  87. 0 0 0 0 0 0 0 0 0 0 0
  88. 合計= 2
  89.  
  90. 結果として得られるスパース配列は~~~~
  91. 11 11 2
  92. 1 2 1
  93. 2 3 2
  94. 修復後の元の配列
  95. 0 0 0 0 0 0 0 0 0 0 0
  96. 0 0 1 0 0 0 0 0 0 0 0
  97. 0 0 0 2 0 0 0 0 0 0 0
  98. 0 0 0 0 0 0 0 0 0 0 0
  99. 0 0 0 0 0 0 0 0 0 0 0
  100. 0 0 0 0 0 0 0 0 0 0 0
  101. 0 0 0 0 0 0 0 0 0 0 0
  102. 0 0 0 0 0 0 0 0 0 0 0
  103. 0 0 0 0 0 0 0 0 0 0 0
  104. 0 0 0 0 0 0 0 0 0 0 0
  105. 0 0 0 0 0 0 0 0 0 0 0
  106. */

【編集者のおすすめ】

  1. いいですね、上司からシンプルなワークフロー エンジンを開発するように言われました...
  2. Windows 10 は世界を揺るがす変化をもたらします!今年最初のアップデートが来ました
  3. 2021年に注目すべき6つのサイバーセキュリティトレンド
  4. 近年の Windows 10 最大の改善点! Windows 10 21H2 の新機能を一足先にご紹介
  5. Xiao Aiは本当にPC版をリリースしたのか?コンピュータ版のXiao Aiを体験してみましょう

<<:  ロボットは電気羊の夢を見るか?Google AI 従業員の辞職から AI 倫理について何を学ぶことができるか?

>>:  アメリカの医師は新型コロナウイルスと戦うために人工知能をどのように活用しているのか

ブログ    

推薦する

...

推奨アルゴリズムコレクション(パート2) - 相関ルール推奨とKBアルゴリズム

[[331263]] 【51CTO.comオリジナル記事】 1. はじめに前回の記事では、レコメンデ...

ダブル11プロモーション?貪欲アルゴリズムを使用して解決してください。

[[351760]]この記事はWeChatの公開アカウント「Java Chinese Commun...

生成AIを精密コーディングに活用する方法

生成型人工知能 (GenAI) はテクノロジー分野に大きな影響を与えており、その変革の可能性は現在ソ...

Nature のサブ出版物: 新しいアルゴリズムは、米国の 8 つの都市で 90% の精度で、1 週間前に 2 ブロック以内の犯罪を予測できます。

シカゴ大学の助教授イシャヌ・チャトパディアイ氏は、彼と彼のチームが「アーバン・ツイン」モデルを作成し...

日常生活における人工知能の12の例

以下の記事では、私たちの日常生活に登場する人工知能の12の例を確認することができます。人工知能 (A...

認知マップの科学的インベントリ: グローバルな第3世代AIの「大きな」機会

近年、人工知能 (AI) は、ディープラーニング、コンピューター ビジョン、自然言語処理などの技術革...

アレックス・グレイブス氏の新しい論文「ベイジアンフローネットワーク」は離散データ生成の問題を解決しており、論文全体が数式でいっぱいである。

最近、大規模なニューラル ネットワークが生成モデルに革命をもたらし、高解像度画像内のすべてのピクセル...

それでおしまい? Gptsのプロンプト単語をランダムにクロールします

11月7日のOpenAI開発者会議でサム・アルトマンがGptsを正式に発表しリリースして以来、Gpt...

2020 年の予測: 今年はサイバー犯罪サービスが普及する年になるか?

業界メディアeWEEKの2020年の予測:人工知能と機械学習の「中毒」についての予測も見られ、これが...

数時間のビデオを視聴するだけで人間のチャットを真似できますか? Facebookのロボットは表情が豊か

ヒューマノイドロボットの類似性は人間の好感度に比例するわけではありません。 1970年に日本のロボッ...

...

...

産業用人工知能の未来について語る

AI はこれらの分野で大きな進歩を遂げており、世界がネットゼロの未来を目指す中でのエネルギー効率と持...