Sparsearray稀疏數(shù)組原理及實(shí)例詳解
今天復(fù)習(xí)下稀疏數(shù)組相關(guān)思想。
問題引入:編寫的五子棋程序中,有存盤退出和續(xù)上盤的功能。
如上圖所示二維數(shù)組,大多值是默認(rèn)值(0),所以記錄大量無意義的數(shù)據(jù)意義不大,此時(shí)可以引入稀疏數(shù)組。
稀疏數(shù)組介紹:當(dāng)一個(gè)數(shù)組大部分元素為固定值時(shí),可以使用稀疏數(shù)組來保存類似數(shù)組;
稀疏數(shù)組處理思路:
稀疏數(shù)組記錄二維數(shù)組的行列數(shù)以及非默認(rèn)值數(shù)目;
將原始數(shù)組中的非默認(rèn)值以及其坐標(biāo)記錄在稀疏數(shù)組中,從而減小文件容量;
public class SparseArray { public static void main(String[] args) { // 創(chuàng)建原始二維數(shù)組(0 表示無子,1 表示黑子 2 表示 白子) int chessArr1[][] = new int[11][11]; chessArr1[1][2] = 1; chessArr1[3][3] = 2; chessArr1[5][1] = 2; // 使用 for 循環(huán)遍原始二維數(shù)組 System.out.println("-------------------------------------------原始二維數(shù)組---------------------------------"); for (int row[] : chessArr1) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } // 將二維數(shù)組轉(zhuǎn)換為洗漱數(shù)組 // 獲取原始二維數(shù)組非零數(shù)目 int sum = 0; for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1.length; j++) { if (chessArr1[i][j] != 0) { sum++; } } } System.out.println("sum = " + sum); // 創(chuàng)建稀疏數(shù)組 int sparseArr[][] = new int[sum + 1][3]; // 為稀疏數(shù)組賦值 sparseArr[0][0] = chessArr1.length; sparseArr[0][1] = chessArr1.length; sparseArr[0][2] = sum; // 便利原始二維數(shù)組,進(jìn)行存放 int n = 0; for (int i = 0; i < chessArr1.length; i++) { for (int j = 0; j < chessArr1.length; j++) { if (chessArr1[i][j] != 0) { n++; sparseArr[n][0] = i; sparseArr[n][1] = j; sparseArr[n][2] = chessArr1[i][j]; } } } // 遍歷稀疏數(shù)組 System.out.println("-------------------------------------------稀疏數(shù)組---------------------------------"); 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]); } // 將稀疏數(shù)組還原為原始二維數(shù)組 int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]]; for (int i = 1; i < sparseArr.length; i++) { chessArr2[chessArr2[i][0]][chessArr2[i][1]] = chessArr2[i][2]; } System.out.println("-------------------------------------------恢復(fù)后的二維數(shù)組---------------------------------"); for (int row[] : chessArr1) { for (int data : row) { System.out.printf("%d\t", data); } System.out.println(); } } }
輸出結(jié)果如下:
-------------------------------------------原始二維數(shù)組------------------------------- 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 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 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 sum = 3 -------------------------------------------稀疏數(shù)組--------------------------------- 11 11 3 1 2 1 3 3 2 5 1 2 -------------------------------------------恢復(fù)后的二維數(shù)組--------------------------- 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 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 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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot配置請(qǐng)求超時(shí)時(shí)間(Http會(huì)話和接口訪問)
本文主要介紹了springboot配置請(qǐng)求超時(shí)時(shí)間,包含Http會(huì)話和接口訪問兩種,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07優(yōu)化spring?boot應(yīng)用后6s內(nèi)啟動(dòng)內(nèi)存減半
這篇文章主要為大家介紹了優(yōu)化spring?boot后應(yīng)用6s內(nèi)啟動(dòng)內(nèi)存減半的優(yōu)化示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-02-02使用hutool進(jìn)行ftp文件下載和上傳詳細(xì)代碼示例
在開發(fā)Java項(xiàng)目時(shí),FTP客戶端是經(jīng)常需要使用的工具,因?yàn)镕TP協(xié)議在文件傳輸方面有著廣泛的應(yīng)用,這篇文章主要給大家介紹了關(guān)于使用hutool進(jìn)行ftp文件下載和上傳的相關(guān)資料,需要的朋友可以參考下2024-02-02java Person,Student,GoodStudent 三個(gè)類的繼承、構(gòu)造函數(shù)的執(zhí)行
這篇文章主要介紹了java Person,Student,GoodStudent 三個(gè)類的繼承、構(gòu)造函數(shù)的執(zhí)行,需要的朋友可以參考下2017-02-02