• 稀疏数组


    稀疏数组(sparsearray)

      基本介绍

           因为该二维数组的很多值是默认值 0,因此记录了很多没有意义的数据,我们可以使用稀疏数组来保存该数组。

        当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

          

      稀疏数组的处理方法是:

      (1)记录数组一共有几行几列,有多少个不同的值

      (2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

      案例:

        原始的二维数组:

          

         压缩的稀疏数组:

          

        应用案例

        (1)使用稀疏数组,来保留二维数组(棋盘信息,地图等)

        (2)把稀疏数组存盘,并且可以从新恢复原来的二维数组数据

        (3)思路分析

         

       (4)代码实现

     1 public class SparseArray {
     2 
     3     public static void main(String[] args) {
     4         // 创建原始二维数组 11*11
     5         // 0 表示没有棋子,1表示黑子,2表示篮子
     6         int chessArr1[][] = new int[11][11];
     7         chessArr1[1][2] = 1;
     8         chessArr1[2][3] = 2;
     9         
    10         // 输出原始二维数组
    11         for(int[] row : chessArr1) {
    12             for(int data : row) {
    13                 System.out.printf("%d\t",data);
    14             }
    15             System.out.println();
    16         }
    17         
    18         // 把二维数组转成稀疏数组
    19         // 1. 先遍历二维数组,得到非0数据的个数
    20         int sum = 0;
    21         for(int i = 0;i < chessArr1.length;i++) {
    22             for(int j = 0;j < chessArr1.length;j++) {
    23                 if(chessArr1[i][j] != 0) {
    24                     sum++;
    25                 }
    26             }
    27         }
    28     
    29         // 2.创建稀疏数组
    30         int sparseArr[][] = new int[sum+1][3];
    31         // 给稀疏数组赋值
    32         sparseArr[0][0] = chessArr1.length;
    33         sparseArr[0][1] = chessArr1.length;
    34         sparseArr[0][2] = sum;
    35         
    36         // 遍历二维数组,将非0的值存放到稀疏数组中
    37         int count = 0; // 记录是第几个非0数据
    38         for(int i = 0;i < chessArr1.length;i++) {
    39             for(int j = 0;j < chessArr1.length;j++) {
    40                 if(chessArr1[i][j] != 0) {
    41                     count++;
    42                     sparseArr[count][0] = i;
    43                     sparseArr[count][1] = j;
    44                     sparseArr[count][2] = chessArr1[i][j];
    45                 }
    46             }
    47         }
    48         
    49         // 输出稀疏数组
    50         System.out.println("============");
    51         System.out.println("稀疏数组为:");
    52         for(int i = 0;i < sparseArr.length;i++) {
    53             System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
    54         }
    55         
    56         System.out.println("============");
    57         
    58         //将稀疏数组转换为原始的二维数组
    59         // 1.先读取稀疏数组的第一行,根据第一行的数据,创建元素的二维数组
    60         
    61         int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
    62         
    63         // 2.在读取稀疏数组后几行的数据(从第二行开始),并赋给原始的二维数组即可
    64         
    65         for(int i = 1;i < sparseArr.length;i++) {
    66             chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
    67         }
    68         
    69         
    70         //输出恢复后的二维数组
    71         for(int[] row : chessArr2) {
    72             for(int data : row) {
    73                 System.out.printf("%d\t",data);
    74             }
    75             System.out.println();
    76         }
    77 
    78     }
    79 
    80 }
    View Code

       (5)数组存盘与读盘

        代码实现:

     1     System.out.println("稀疏数组为:");
     2         for(int i = 0;i < sparseArr.length;i++) {
     3             System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
     4         }
     5     // 稀疏存盘
     6         FileWriter fos = new FileWriter("F:\\a.txt");
     7         for(int i = 0;i < sparseArr.length;i++) {
     8             for(int j = 0;j < 3;j++) {
     9                 
    10                 fos.write(sparseArr[i][j]+"\t");
    11             }
    12             fos.write("\r\n");
    13         }
    14 
    15         fos.close();
    16         
    17         // 读取稀疏数组
    18         BufferedReader br = new BufferedReader(new FileReader("F:\\a.txt"));  
    19         String line;  //一行数据
    20         int row=0;
    21         int[][] arr2 = new int[3][3]; // 存放的数组
    22         //逐行读取,并将每个数组放入到数组中
    23         while((line = br.readLine()) != null){
    24            String[] temp = line.split("\t"); 
    25            for(int j=0;j<temp.length;j++){
    26                
    27             arr2[row][j] = Integer.parseInt(temp[j]);
    28            }
    29            row++;
    30         }
    31         br.close();
    32         
    33         // 遍历取出的稀疏数组
    34         for(int[] i : arr2) {
    35             for(int item : i) {
    36                 System.out.print(item+"\t");
    37             }
    38             System.out.println();
    39         }

      

  • 相关阅读:
    OD: Memory Attach Technology
    Chrome: Shockwave Flash isn't responding
    OD: Memory Attach Technology
    OD: Heap Exploit : DWORD Shooting & Opcode Injecting
    OD: Heap in Windows 2K & XP SP1
    OD: Writing Small Shellcode
    OD: Shellcode Encoding
    Set Windows IP by Batch
    OD: Universal Shellcode
    XenServer 使用笔记
  • 原文地址:https://www.cnblogs.com/niujifei/p/11541081.html
Copyright © 2020-2023  润新知