JAVA描述算法和结构(01):稀疏数组和二维数组转换

本文源码:GitHub·点这里 || GitEE·点这里

一、基本简介

1、基础概念

在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。

2、处理方式

1)、记录数组一共有几行几列,有多少个不同的值
2)、把具有不同值的元素的行列及值记录在稀疏数组中,可以缩小程序代码的复杂度。

3、图解描述

稀疏数组表示
[0] 3 4 4 二维数组,3行,4列,4个非0的值;
[1] 1 2 2 一行,2列的值是2;
[2] 1 3 3 一行,3列的值是3;
…以此类推

4、五子棋场景

使用稀疏数组描述
行    列    值
[0]  11    11    2
[1]  1     2     1
[2]  2     3     2

二、代码实现

1、转换流程

二维数组转稀疏数组

1)、遍历二维数组,得到非零元素的个数
2)、创建稀疏数组
3)、二维数组的非零元素写入稀疏数组

稀疏数组转二维数组

1)、读取稀疏数组的首行,创建二维数组
2)、根据稀疏数组描述的有效元素,给二维数组赋值

2、代码实现

1)、核心流程

1、棋盘:基于二维数组
2、二维数组转稀疏数组
3、稀疏数组转二维数组

2)、方法一:生成二维数组

public static int[][] printChess (){
    // 二维数组表示 11 * 11 的棋盘,0表示没有棋,1表示 黑, 2 表示蓝
    int chessArray[][] = new int[11][11];
    chessArray[1][2] = 1;
    chessArray[2][3] = 2;
    for (int[] row : chessArray) {
        for (int data : row) {
            System.out.printf("%d\t", data);
        }
        System.out.println();
    }
    return chessArray ;
}

3)、方法二:转为稀疏数组

public static int[][] convertTwoArray (int chessArray[][]){
    // 有效元素:先遍历二维数组 得到非0数据的个数
    int unZeroSum = 0;
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            if (chessArray[i][j] != 0) {
                unZeroSum++;
            }
        }
    }
    // 行:有效元素+1,列:3列
    int sparseArray[][] = new int[unZeroSum+1][3] ;
    sparseArray[0][0] = 11 ;// 0行0列值:11
    sparseArray[0][1] = 11 ;// 0行1列值:11
    sparseArray[0][2] = unZeroSum ;// 0行2列值:unZeroSum
    // 遍历二维数组,将非0的值存放到稀疏数组中
    // unZeroCount 用于记录是第几个非0数据,也就是稀疏数组的行
    int unZeroCount = 0; //
    for (int i = 0; i < 11; i++) {
        for (int j = 0; j < 11; j++) {
            if (chessArray[i][j] != 0) {
                unZeroCount++;
                sparseArray[unZeroCount][0] = i;
                sparseArray[unZeroCount][1] = j;
                sparseArray[unZeroCount][2] = chessArray[i][j];
            }
        }
    }
    // 输出稀疏数组的形式
    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]);
    }
    return sparseArray ;
}

4)、方法三:转为二维数组

public static void convertSparseArray (int sparseArray[][]){
    // 读取稀疏数组首行创建二维数组==>> int chessArray[][] = new int[11][11];
    int chessArray[][] = new int[sparseArray[0][0]][sparseArray[0][1]] ;
    // 非零元素赋值给二维数组
    for(int i = 1; i < sparseArray.length; i++) {
        // 几行、几列、是什么值
        chessArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
    }
    // 打印二维数组
    for (int[] row : chessArray) {
        for (int data : row) {
            System.out.printf("%d\t", data);
        }
        System.out.println();
    }
}

5)、主程序调用

public static void main(String[] args) {
    // 棋盘:基于二维数组
    int chessArray[][] = printChess () ;
    System.out.println("==========================");
    // 二维数组转稀疏数组
    int sparseArray[][] = convertTwoArray(chessArray) ;
    System.out.println("==========================");
    // 稀疏数组转二维数组
    convertSparseArray(sparseArray);
}

三、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

原文地址:https://blog.51cto.com/14439672/2447750

时间: 2024-11-05 21:36:06

JAVA描述算法和结构(01):稀疏数组和二维数组转换的相关文章

JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度. 2.处理方式 1).记录数组一共有几行几列,有多少个不同的值 2).把具有不同值的元素的行列及值记录在稀疏数组中,可以缩小程序代码的复杂度. 3.图解描述 稀疏数组表示 [0] 3 4 4 二维数组,3行,4列,4个非0的值: [1] 1 2 2 一行

java数组(一维数组,二维数组)

数组初始化: 1,动态初始化:数组定义与为数组分配空间和赋值的操作分开进行 2,静态初始化:在定义数组的同时就为数组元素分配空间并赋值 3,默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此,数组分配空间之后 每个元素也被按照成员的规则被隐士的初始化值 ------------------------------------------------. 一维数组: package day06; import java.util.Date; /*** * 数组演示 * 数组的声明: * t

一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

 打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int *p = a; p < a + 10;p++)  //指针类型决定4个字节 { printf("\n%p,%d", p, *p); } getchar(); } 指针数组 #inclu

java基础中的一维数组和二维数组

1.数组:具有相同数据类型的一组数据的集合. 一维数组 2.创建一维数组 a.数组作为对象允许使用new关键字进行内存分配,使用数组之前,必须首先定义数组变量所属类型,即声明数组.  声明数组: 语法:数组元素类型   数组名字[]; 数组元素类型[]  数组名字: 注释:数组元素类型:决定了数组的数据类型,包括基本数据类型和费基本数据类型. 数组名字:为一个合法的标识符,自己去定义 []:指明该变量是一个数组类型变量,单个"[]"表示要创建的是一维数组. 例如:int arr[];

7、一维数组和二维数组耳朵创建,输出,Arrays.fill()替换

package com.xxx.xxx; import java.util.Arrays; public class demo8 { /** * 1.初始化一维数组 使用一维数组 * 2.初始化二维数组 使用二维数组 * 3.填充替换数组元素 * @param args */ public static void main(String[] args) { //1.第一种初始化方式 int arr[] = new int[]{1,2,3,4,5,6}; //一维数组 //1.1.第二种初始化方式

JavaScript - 一维数组、二维数组基础

<html> <head> <head> <body> <script language="javascript"> // 数组 var arr = ["wjp", 520, 'wcc', 13.14] ; for(var i=0; i<arr.length; i++){ alert(arr[i]); } // 数组为空undefined var arr2 = ["wjp",,51

C#一维数组,二维数组,多维数组

所谓的数组,就是相同数据类型的元素的元素按一定顺数排列的集合,就是把有限个类型相同的变量用一名字命名,然后用编号区分他们的变量的集合,这个名字成为数组名,编号称为下标.组成数组的各个变量成为数组的分量,也称为数组的元素,有时也称为下标变量,数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式.这些按序排列的同类数据元素的集合成为数组. 数组又分为一维数组,二维数组,多维数组 一维数组用一个整数来索引,多维数组用两个或多个整数来索引. 一.数据类型[] 变量名

16.10.20 4th 1蛤蟆爬井 2一维数组 3二维数组

摘要 1蛤蟆爬井 2一维数组 3二维数组 例子 井深10米, 蛤蟆白天爬5m,晚上落4米,求几天爬出来. //思路,用循环语句来做,for因为是未知次数所以排除,while 先判断后运行排除, dowhile,先爬在判断所以可以 int gaodu = 0; int tianshu = 0; boolean tianse = true; do{ if(tainse){ //白天爬5米 gaodu+=5; //爬完后改黑天 tianse = false; //天数+1 tianshu +=1; }

C/C++ 指针数组、二维数组

一. 二维数组 1> 初始化 int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 这里是 {} , 而不是() 2> 将二维数组当做一维数组处理 void print_array( int * p, int row, int line) { for(int i=0; i<row; ++i) { for(int j=0; j<line; ++j) { printf("%d \n", *( p + i * row + j