Sparsearray稀疏數(shù)組原理及實例詳解
今天復(fù)習(xí)下稀疏數(shù)組相關(guān)思想。
問題引入:編寫的五子棋程序中,有存盤退出和續(xù)上盤的功能。

如上圖所示二維數(shù)組,大多值是默認(rèn)值(0),所以記錄大量無意義的數(shù)據(jù)意義不大,此時可以引入稀疏數(shù)組。
稀疏數(shù)組介紹:當(dāng)一個數(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ù)組,進行存放
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
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot集成WebServlet出現(xiàn)自定義servlet請求失敗的問題解決方案
SpringBoot中以Bean方式注冊Servlet時遇到的問題,通過了解DispatcherServlet的原理,發(fā)現(xiàn)默認(rèn)路徑?jīng)_突是主要原因,本文介紹SpringBoot集成WebServlet出現(xiàn)自定義servlet請求失敗的問題解決方案,感興趣的朋友一起看看吧2025-03-03
@RequestParam?和@RequestBody注解的區(qū)別解析
在 Spring MVC 中,我們可以使用 @RequestParam 和 @RequestBody 來獲取請求參數(shù),但它們在用法和作用上有一些區(qū)別,這篇文章主要介紹了@RequestParam?和@RequestBody注解的區(qū)別,需要的朋友可以參考下2023-06-06
Java Grpc實例創(chuàng)建負(fù)載均衡詳解
這篇文章主要介紹了Java Grpc實例創(chuàng)建負(fù)載均衡詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
Spring Security系列教程之會話管理處理會話過期問題
會話過期,是指當(dāng)用戶登錄網(wǎng)站后,較長一段時間沒有與服務(wù)器進行交互,將會導(dǎo)致服務(wù)器上的用戶會話數(shù)據(jù)(即session)被銷毀。這篇文章主要介紹了Spring Security系列教程之會話管理處理會話過期問題,需要的朋友可以參考下2021-10-10
Java純代碼實現(xiàn)導(dǎo)出pdf合并單元格
這篇文章主要為大家詳細(xì)介紹了Java如何純代碼實現(xiàn)導(dǎo)出pdf與合并單元格功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

