线性结构之稀疏数组 sparse-array

1. 需求:编写五子棋程序,有存盘和读盘的功能。

image.png

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

稀疏数组的处理方法:

  1. 记录数组一共有几行几列,有多少个不同的值
  2. 把具有不同值的元素的行列以及值记录在一个小规模的数组中,从而缩小程序的规模。
    例子:


    image.png

    6行7列变成了9行3列,稀疏数组固定都是3列。

2. 应用实例

使用稀疏数组来表示棋盘的二维数组来存盘,再将稀疏数组恢复成二维数组棋盘实现读盘。
row  col  value
11   11   2      -- 11行11列,2个有效数字
1    2    1      -- 第一行第二列,值为1
2    3    2      -- 第二行第三列,值为2

二维数组转稀疏数组思路:

  1. 遍历二维数组,得到有效值的个数sum
  2. 根据sum创建稀疏数组sparse-array int[sum + 1][3]
  3. 将二维数组的有效数据存入到稀疏数组

稀疏数组转二维数组思路:

  1. 先读取稀疏数组第一行,根据第一行的数据创建原始的二维数组(第一行的前两个值就是行数和列数)
  2. 再读取稀疏数组后几行的数据,并赋给原始的二维数组

3. 代码

用vscode写的,文件是utf8的,但是注释却是gbk的,不知道为什么,就是javac的时候老报错,只能删了注释来运行。

-- 查了下资料,“由于JDK是国际版的,我们在用javac编译时,编译程序首先会获得我们操作系统默认采用的编码格式(GBK),然后JDK就把Java源文件从GBK编码格式转换为Java内部默认的Unicode格式放入内存中,然后javac把转换后的Unicode格式的文件编译成class类文件,此时,class文件是Unicode编码的,它暂存在内存中,紧接着,JDK将此以Unicode格式编码的class文件保存到操作系统中形成我们见到的class文件。当我们不加设置就编译时,相当于使用了参数:javac -encoding GBK Test.java,就会出现不兼容的情况。”
https://github.com/toyranger/data_structure_algorithm.git

package com.ds.sparse.array;

public class SparseArray {

  public static void main(String[] args) {

    int[][] chessArray = genChessArray();
    printArray(chessArray);

    System.out.println("------------------------------");
    int[][] trans2SparseArr = trans2SparseArr(chessArray);
    printArray(trans2SparseArr);

    System.out.println("------------------------------");
    int[][] trans2ChessArr = trans2ChessArr(trans2SparseArr);
    printArray(trans2ChessArr);

  }

  /***
   * 生成原始的棋盘二维数组
   * @return
   */
  private static int[][] genChessArray() {

    int[][] chessArray = new int[11][11];

    chessArray[1][2] = 1;
    chessArray[2][3] = 2;

    return chessArray;
  }

  /***
   * 遍历打印数组
   * @param array
   */
  private static void printArray(int[][] array) {

    for (int[] tmpArr : array) {
      for (int value : tmpArr) {
        System.out.printf("%d\t", value);
      }

      System.out.println();
    }
  }

  /***
   * 获取二维数组中有效值个数
   * @param array
   * @return
   */
  private static int getValidValueCnt(int[][] array) {

    int cnt = 0;

    for (int[] tmpArr : array) {

      for (int tmpVal : tmpArr) {

        if (0 != tmpVal) {

          cnt++;
        }
      }
    }

    return cnt;
  }

  /***
   * 二维数组转成稀疏数组
   * @param chessArr
   * @return
   */
  private static int[][] trans2SparseArr(int[][] chessArr) {

    int valueCnt = getValidValueCnt(chessArr);
    int[][] sparseArr = new int[valueCnt + 1][3];

//    第一行是原始二维数组的行数列数和有效值
    int rowCnt = chessArr.length;
    int colCnt = chessArr[0].length;
    sparseArr[0][0] = rowCnt;
    sparseArr[0][1] = colCnt;
    sparseArr[0][2] = valueCnt;

//    遍历棋盘数组,每找到一个有效值,对应稀疏数组的行数加一,并且把有效值的行和列以及值存入该行
    int sparseRow = 1;
    for (int row = 0; row < rowCnt; row++) {
      for (int col = 0; col < colCnt; col++) {

        int value = chessArr[row][col];

        if (0 != value) {
          sparseArr[sparseRow][0] = row;
          sparseArr[sparseRow][1] = col;
          sparseArr[sparseRow][2] = value;
          sparseRow++;
        }
      }
    }

    return sparseArr;
  }

  /***
   * 稀疏数组还原成二维数组
   * @param sparseArr
   * @return
   */
  private static int[][] trans2ChessArr(int[][] sparseArr) {

    int rowCnt = sparseArr[0][0];
    int colCnt = sparseArr[0][1];

    int[][] chessArr = new int[rowCnt][colCnt];

//    从第二行开始遍历稀疏数组,把有效值填入棋盘数组对应的行和列位置
    for (int rowNumOfSparse = 1; rowNumOfSparse < sparseArr.length; rowNumOfSparse++) {
      int rowNum = sparseArr[rowNumOfSparse][0];
      int colNum = sparseArr[rowNumOfSparse][1];
      int value = sparseArr[rowNumOfSparse][2];

      chessArr[rowNum][colNum] = value;
    }

    return chessArr;
  }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,286评论 0 2
  • 【转载请注明出处:From李诗雨—https://blog.csdn.net/cjm2484836553/arti...
    倔脾气的皮皮虾啊阅读 763评论 0 0
  • 一 线性结构 数据元素之间存在一对一的线性关系 顺序存储结构 顺序表中的存储元素是连续的 链式存储结构 链表中的存...
    guideEmotion阅读 375评论 0 0
  • 当一个数组的元素包含大量的0时,或者为同一个值的数组时,可以使用稀疏数组来保存数组. 稀疏数组的处理方法: 1,记...
    daysting阅读 271评论 0 0
  • 请人吃饭人怪怨,说明自己不努力。请以前的同僚吃饭,竟然说了一句:你怪怨我咧哇。 你说这是干什么嘛,花钱买的个不自在...
    林野轻风阅读 203评论 0 2