Java 数据结构和算法(稀疏数组----数据结构)

1.算法和数据结构的关系

  1. 数据结构是一门研究组织数据方式的学科,有了编程语言也就有了数据结构,学好数据结构可以编写出更漂亮的,更有效的代码
  2. 程序=数据结构+算法
  3. 数据结构是算法的基础,要想学好算法需要把数据结构学到位

 

2.数据结构的构成:

数据结构包括线性结构和非线性结构

2.1线性结构:

  • 线性结构作为最常用的数据结构,其特点是数据元素存在一对一的线性关系
  • 线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称为顺序表——内存中存储的地址是连续不断的;链式存储的线性表称为链表——内存中存储的地址不一定是连续的
  • 线性结构常见的有:数组、队列、链表和栈

2.2非线性结构:

  • 非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构和群结构。
  • 非线性结构常见的有:二维数组、多维数组、广义表、树结构、图结构

3.稀疏数组:

3.1 有如下需求

  • 编写五子棋程序,有存盘退出和续盘的功能
  • 分析问题:

        因为该二维数组的很多默认值都是0,因此记录了很多没有意义的数组,这时候就要换一种数组来存储即稀疏数组

3.2 稀疏数组基本介绍

  •  当一个数组中的大部分元素为0或者为同一个值的时候,可以用稀疏数组来进行存储
  •  处理方法:
  1. 稀疏数组第一行数据记录的几行几列,都多少个不同的值
  2. 吧具有不同值的元素的行列记录在一个小规模的数组中,从而缩小程序的规模

3.3 稀疏数组举例

3.4 需求分析

3.5 代码实现

package com.zjh.suanfa.sparsearray;

import java.util.HashMap;
import java.util.Map;

/**
 * 稀疏数组
 */
public class SparseArray {
    public static void main(String[] args) {
        //先创建一个原始的二维数组 11*11
        //0表示没有棋子 1表示黑子 2表示篮子
        int chess[][]=new int[11][11];
        chess[1][2]=1;
        chess[2][3]=2;
        chess[10][10]=2;
        System.out.println("原始数据");
        for (int a[]:chess) {
            for (int b:a) {
                System.out.printf("%d\t",b);
            }
            System.out.println();
        }

        //转换成稀疏数组(三列分别记录 行列值  第一行记录总共多少行 多少列 以及不同值的个数)
        //获得原始数组里面不同值的个数 有几个那么稀疏数组就会有对应+1条数据
        int sum=0;
        for (int i=0;i<chess.length;i++){
            for (int j=0;j<chess[i].length;j++){
                if (chess[i][j]!=0){
                    sum++;
                }
            }
        }
        int sparseArray[][]=new int[sum+1][3];
        //给稀疏数组赋值
        //赋值第一行
        sparseArray[0][0]=chess.length;//行数
        sparseArray[0][1]=chess[0].length;//列数
        sparseArray[0][2]=sum;//不同值的个数
        int count=0;//记录稀疏数组当前的行数
        for (int i=0;i<chess.length;i++){
            for (int j=0;j<chess[i].length;j++){
                if (chess[i][j]!=0){
                    count++;//进来一次就证明要重新创建一行
                    sparseArray[count][0]=i;
                    sparseArray[count][1]=j;
                    sparseArray[count][2]=chess[i][j];
                }
            }
        }

        //输出稀疏数组
        System.out.println("稀疏数组==============");
        for (int i=0;i<sparseArray.length;i++) {
            System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
        }


        //讲稀疏数组恢复成二维数组========================
        //获得二维数组第一个行的值
        int[][] newChess=new int[sparseArray[0][0]][sparseArray[0][1]];
        //赋值
        for(int i=1;i<sparseArray.length;i++){
             newChess[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
        }

        //输出恢复的数组
        System.out.println("恢复以后的数组============");
        for (int a[]:newChess) {
            for (int b:a) {
                System.out.printf("%d\t",b);
            }
            System.out.println();
        }

    }
}

3.6 运行结果:

原始数据
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    2    
稀疏数组==============
11    11    3    
1    2    1    
2    3    2    
10    10    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    2    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值