日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA数据结构与算法【稀疏数组】

發布時間:2024/2/28 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA数据结构与算法【稀疏数组】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先看一個實際的需求:



基本介紹

? ? ?當一個數組中大部分元素為0,或者為同一個值的數組時,可以使用稀疏數組來保存該數組。

稀疏數組的處理方法是:

  • 記錄數組一共有幾行幾列,有多少個不同的值
  • 把具有不同值的元素的行列及值記錄在一個小規模的數組中,從而縮小程序的規模
  • 舉例說明:

    我們清晰的看出,數組由6*7,改用稀疏數組后為3*8


    應用實例

  • 使用稀疏數組,來保留類似前面的二維數組(棋盤、地圖等等)
  • 把稀疏數組存盤,并且可以從新恢復原來的二維數組數
  • 整體思路分析
    • 二維數組換稀疏數組的思路
  • 遍歷原始的二維數組,得到有效數據的個數sum
  • 根據sum就可以創建稀疏數組sparseArr int[sum+1][3]
  • 將二維數組的有效數據存入到稀疏數組。
    • 稀疏數組轉原始數組的思路
  • 先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組,比如上面的 charArr2 = int[11][11]
  • 在讀取稀疏數組后幾行的數據,并賦給 原始的二維數組即可
  • 代碼實現

    package com.henu.sparsearray;/*** @author George* @description 稀疏數組**/ public class SparseArray {public static void main(String[] args) {//創建一個原始的二維數組 11*11//0:表示沒有棋子,1表示黑子 2表示藍字int chessArr1[][] = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;chessArr1[4][5] = 2;//輸出原始的二維數組System.out.println("原始的二維數組:");for (int[] row : chessArr1) {for (int data : row) {System.out.printf("%d\t",data); // System.out.print(data + "\t");}System.out.println();}//將二維數組 轉 稀疏數組的思路//1.先遍歷二維數組,得到非零數據的個數。int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0){sum++;}}}//創建對應的稀疏數組int[][] sparseArr = new int[sum + 1][3];//給稀疏數組賦值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;//遍歷二維數組,將非0的值存放到sparseArr中int count = 0;//count用于記錄第幾個非0數據for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//輸出稀疏數組的形式System.out.println();System.out.println("得到的稀疏數組是:");for (int i = 0; i < sparseArr.length; i++) {System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);}System.out.println();//將稀疏數組=》恢復成原始的二維數組/*** 1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組* 比如上面的chessArr2 = int[11][11]* 2.在讀取稀疏數組后幾行的數據,并賦給原始的二維數組即可*///1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];//2.在讀取稀疏數組后幾行的數據(從第二行開始),并賦給原始的二維數組 即可for (int i = 1; i < sparseArr.length; i++) {chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}//輸出恢復后的二維數組System.out.println();System.out.println("恢復好的二維數組:");for (int[] row : chessArr2) {for (int data : row) {System.out.printf("%d\t",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?? ?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?? ?

    得到的稀疏數組是:
    11?? ?11?? ?3?? ?
    1?? ?2?? ?1?? ?
    2?? ?3?? ?2?? ?
    4?? ?5?? ?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?? ?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

    拓展:

    要求,1.在前面的基礎上,將稀疏數組保存在磁盤上,比如map.data

    2.恢復原來的數組時,讀取map.data進行恢復。

    【因為我們都知道,在玩游戲中,我們都有存檔退出這一說。所以這個就是實現我們所說的存檔退出。然后下次開啟是繼續游戲。】

    存檔:

    package com.henu.sparsearray;import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException;/*** @author George* @description 稀疏數組存檔**/ public class SparseArrayWrite {public static void main(String[] args) throws IOException {//創建一個原始的二維數組 11*11//0:表示沒有棋子,1表示黑子 2表示藍字int chessArr1[][] = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;chessArr1[4][5] = 2;//輸出原始的二維數組System.out.println("原始的二維數組:");for (int[] row : chessArr1) {for (int data : row) {System.out.printf("%d\t", data); // System.out.print(data + "\t");}System.out.println();}//將二維數組 轉 稀疏數組的思路//1.先遍歷二維數組,得到非零數據的個數。int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {sum++;}}}//創建對應的稀疏數組int[][] sparseArr = new int[sum + 1][3];//給稀疏數組賦值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;//遍歷二維數組,將非0的值存放到sparseArr中int count = 0;//count用于記錄第幾個非0數據for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {count++;sparseArr[count][0] = i;sparseArr[count][1] = j;sparseArr[count][2] = chessArr1[i][j];}}}//保存BufferedWriter bw = new BufferedWriter(new FileWriter("./data/map.data"));System.out.println();System.out.println("進行存檔。。。");for (int i = 0; i < sparseArr.length; i++) {String s = "" + sparseArr[i][0] + "\t" + sparseArr[i][1] + "\t" + sparseArr[i][2] + "\t\n";bw.write(s);}bw.close();} }

    讀檔:

    package com.henu.sparsearray;import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List;/*** @author George* @description 讀檔**/ public class SparseArrayRead {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("./data/map.data"));List<String> list = new ArrayList<>();String s = "";while ((s = br.readLine()) != null){list.add(s);}int[][] newSparseArrayRead = new int[list.size()][list.size()-1];String s1 = list.get(0);String[] split = s1.split("\t");//先將11 11 3放入數組中newSparseArrayRead[0][0] = Integer.parseInt(split[0]);newSparseArrayRead[0][1] = Integer.parseInt(split[1]);newSparseArrayRead[0][2] = list.size()-1;//設置count值,進行后面的判斷。二維數組的行數。int count = 0;for (int i = 1; i < list.size(); i++) {String str = list.get(i);String[] strings = str.split("\t");count ++;for (int j = 0; j < strings.length; j++) {newSparseArrayRead[count][j] = Integer.parseInt(strings[j]);}}System.out.println("讀取文件后建立的稀疏數組:");for (int[] ints : newSparseArrayRead) {for (int anInt : ints) {System.out.printf("%d\t",anInt);}System.out.println();}//從二維數組轉換為原始數組//1.先讀取稀疏數組的第一行,根據第一行的數據,創建原始的二維數組int[][] chessArr2 = new int[newSparseArrayRead[0][0]][newSparseArrayRead[0][1]];//2.在讀取稀疏數組后幾行的數據(從第二行開始),并賦給原始的二維數組 即可for (int i = 1; i < newSparseArrayRead.length; i++) {chessArr2[newSparseArrayRead[i][0]][newSparseArrayRead[i][1]] = newSparseArrayRead[i][2];}//輸出恢復后的二維數組System.out.println();System.out.println("恢復好的二維數組:");for (int[] row : chessArr2) {for (int data : row) {System.out.printf("%d\t",data);}System.out.println();}br.close();} }

    ?

    超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

    總結

    以上是生活随笔為你收集整理的JAVA数据结构与算法【稀疏数组】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。