java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):稀疏數(shù)組
稀疏數(shù)組:
當(dāng)一個(gè)二維數(shù)組中大部份的值為0,或者為同一值的時(shí)候,可以用稀疏數(shù)組來(lái)保存
實(shí)現(xiàn)思路:
記錄二維數(shù)組有多少行多少列、多少個(gè)不同的值
把不同的值按照所在行列,記錄在一個(gè)規(guī)模較小的數(shù)組中
舉例:
11×11的二維數(shù)組:

對(duì)應(yīng)的稀疏數(shù)組:

其中,第一行分別為,原二維數(shù)組總行數(shù)、總列數(shù)、不為0的數(shù)的個(gè)數(shù)
之后幾行的每一列分別代表所在行、所在列、值
二維數(shù)組轉(zhuǎn)稀疏數(shù)組實(shí)現(xiàn)思路:
1. 遍歷二維數(shù)組,得到非0數(shù)據(jù)的個(gè)數(shù)
2. 創(chuàng)建對(duì)應(yīng)的稀疏數(shù)組
3. 再次遍歷二維數(shù)組,將非0的值存放到稀疏數(shù)組中
稀疏數(shù)組恢復(fù)二維數(shù)組實(shí)現(xiàn)思路:
1. 讀取稀疏數(shù)組的第一行,根據(jù)第一行的數(shù)據(jù),創(chuàng)建對(duì)應(yīng)的二維數(shù)組
2. 讀取稀疏數(shù)組后幾行的數(shù)據(jù),賦值給二維數(shù)組
代碼實(shí)現(xiàn):
//稀疏數(shù)組
public class SparseArray {
public static void main(String[] args) {
//創(chuàng)建一個(gè)原始的二維數(shù)組11 * 11
int[][] chessArr = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
chessArr[4][5] = 2;
//輸出原始的二維數(shù)組
for (int[] row : chessArr) {
for (int i : row) {
System.out.printf("%d\t", i);
}
System.out.println();
}
//二維數(shù)組轉(zhuǎn)稀疏數(shù)組
//首先遍歷二維數(shù)組,得到非0數(shù)據(jù)的個(gè)數(shù)
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j] != 0) {
sum++;
}
}
}
//創(chuàng)建對(duì)應(yīng)的稀疏數(shù)組
int[][] sparseArr = new int[sum + 1][3];
//對(duì)稀疏數(shù)組賦值
sparseArr[0][0] = 11;
sparseArr[0][1] = 11;
sparseArr[0][2] = sum;
//遍歷二維數(shù)組,將非0的值存放到稀疏數(shù)組中
int count = 0; //用于記錄是第幾個(gè)非0數(shù)據(jù)
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (chessArr[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = chessArr[i][j];
}
}
}
//輸出稀疏數(shù)組
for(int i = 0; i < sparseArr.length; i++) {
System.out.printf("%d\t%d\t%d\t", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
System.out.println();
}
//稀疏數(shù)組恢復(fù)二維數(shù)組
//首先讀取稀疏數(shù)組的第一行,根據(jù)第一行的數(shù)據(jù),創(chuàng)建原始的二維數(shù)組
int newChessArr[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
//讀取稀疏數(shù)組后幾行的數(shù)據(jù),賦值給二維數(shù)組
for(int i = 1; i < sparseArr.length; i++) {
newChessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//輸出恢復(fù)后的二維數(shù)組
//輸出原始的二維數(shù)組
for (int[] row : newChessArr) {
for (int i : row) {
System.out.printf("%d\t", i);
}
System.out.println();
}
}
}
輸出結(jié)果:
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
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Spring Boot Swagger2使用方法過(guò)程解析
這篇文章主要介紹了Spring Boot Swagger2使用方法過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時(shí)的兩種操作方式
這篇文章主要介紹了java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時(shí)的兩種操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
SpringBoot與Quartz集成實(shí)現(xiàn)分布式定時(shí)任務(wù)集群的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于SpringBoot與Quartz集成實(shí)現(xiàn)分布式定時(shí)任務(wù)集群的代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
Java二叉樹(shù)的遍歷思想及核心代碼實(shí)現(xiàn)
今天小編就為大家分享一篇關(guān)于Java二叉樹(shù)的遍歷思想及核心代碼實(shí)現(xiàn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
SpringBoot下載Excel文件時(shí),報(bào)錯(cuò)文件損壞的解決方案
這篇文章主要介紹了SpringBoot下載Excel文件時(shí),報(bào)錯(cuò)文件損壞的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot中處理的轉(zhuǎn)發(fā)與重定向方式
這篇文章主要介紹了SpringBoot中處理的轉(zhuǎn)發(fā)與重定向方式,分別就轉(zhuǎn)發(fā)和重定向做了概念解說(shuō),結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11

