zoukankan      html  css  js  c++  java
  • 数据结构之稀疏数组的使用场景及实现

    一、数据结构与算法的关系

    1.数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构可以编写出更加漂亮,更加有效率的代码。

    2.要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决.

    3.程序 = 数据结构 + 算法

    4.数据结构是算法的基础, 换言之,想要学好算法,需要把数据结构学到位。

    二、数据结构

    1.数据结构包括:线性结构和非线性结构。

      线性结构:

      线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系

      线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的

      链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息

      线性结构常见的有:数组、队列、链表和栈,后面我们会详细讲解.

    2.非线性结构 非线性结构包括:二维数组,多维数组,广义表,树结构,图结构

    三、稀疏(sparsearray)数组

    1.基本介绍

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

    2.稀疏数组的处理方法是:

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

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

    3.稀疏数组举例说明:

    存在一个6行7列的二维数组,可以转换成稀疏数组来进存储,可转换为

          

     稀疏数组固定是有三列,而且第一行的数据也是固定的,[0][1]是原数组的行数,[0][2]是原数组的列数,[0][3]是原数组中不为0的值的个数。

    稀疏数组除了第一行之外,其余的各行存储的是原数组中不为0的数在原数组中的行号、列号和值。比如稀疏数组的第1行,存储的是数值22在原数组中的位置以及值域。

    4.稀疏数组的应用场景

      编写的五子棋程序中,有存盘退出和续上盘的功能。

     5.代码实现

    /**
    * 五子棋算法:稀疏数组
    */
    public class sparseArray {
    public static void main(String[] args) {
    //先创建原始数组,11行,11列,0表示没有落子,1表示黑子,2表示篮子
    int [][] originalArray = new int[11][11];
    originalArray[1][2] = 1;
    originalArray[2][3] = 2;

    //打印原始数组
    int sum = 0;//sum是用来记录原始数组中大于0的数值的个数
    for (int[] rows : originalArray) {
    for (int data : rows) {
    System.out.printf("%d ",data);
    if(data!=0){
    sum++;
    }
    }
    System.out.println();
    }
    System.out.println("sum = "+sum);

    //创建稀疏数组
    int [][] sparseArray = new int[sum+1][3];
    //给稀疏数组的第一行复制
    sparseArray[0][0] = originalArray.length;
    sparseArray[0][1] = originalArray[0].length;
    sparseArray[0][2] = sum;

    int count = 0;//记录稀疏数组的行号
    //便利原数组,给稀疏数组赋值
    for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < originalArray[i].length; j++) {
    if(originalArray[i][j]!=0){
    count++;
    sparseArray[count][0] = i;
    sparseArray[count][1] = j;
    sparseArray[count][2] = originalArray[i][j];
    }
    }
    }

    //将稀疏数组保存到文件中
    File file = new File("文件地址");
    FileWriter fileWriter = null;
    try {
    fileWriter = new FileWriter(file);
    for (int i = 0; i < sparseArray.length; i++) {
    for (int j = 0; j < sparseArray[i].length; j++) {
    fileWriter.write(sparseArray[i][j]+" ");
    }
    fileWriter.write(" ");
    }
    } catch (Exception e) {
    e.printStackTrace();
    }finally {
    try {
    fileWriter.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    //读取文件中的稀疏数组
    FileReader fileReader = null;
    BufferedReader bufferedReader = null;
    String lineVal;//一行的记录
    int row = 0;//记录行号
    try {
    fileReader = new FileReader(file);
    bufferedReader = new BufferedReader(fileReader);

    while ((lineVal = bufferedReader.readLine()) != null){
    String[] split = lineVal.split(" ");
    sparseArray[row][0] = Integer.parseInt(split[0]);
    sparseArray[row][1] = Integer.parseInt(split[1]);
    sparseArray[row][2] = Integer.parseInt(split[2]);
    row++;
    }

    } catch (Exception e) {
    e.printStackTrace();
    }finally {
    try {
    fileReader.close();
    bufferedReader.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    //打印稀疏数组
    System.out.println("稀疏数组为~~~~~~~");
    for (int i = 0; i < sparseArray.length; i++) {
    System.out.printf("%d %d %d ",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
    }



    //在将稀疏数组转为原数组
    int newArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]];

    for (int i = 1; i < sparseArray.length; i++) {
    newArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
    }

    //重新打印原数组
    System.out.println("原数组为~~~~~~~~");
    for (int[] rows : newArray) {
    for (int data : rows) {
    System.out.printf("%d ",data);
    }
    System.out.println();
    }

    }
    }

     运行结果

    0    0    0    0    0    0    0    0    0    0    0    
    0    0    1    0    0    0    0    0    0    0    0    
    0    0    0    2    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    sum = 2
    稀疏数组为~~~~~~~
    11    11    2    
    1    2    1    
    2    3    2    
    原数组为~~~~~~~~
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    1    0    0    0    0    0    0    0    0    
    0    0    0    2    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
    0    0    0    0    0    0    0    0    0    0    0    
  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/BeenTogether/p/13064665.html
Copyright © 2011-2022 走看看