好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java数据结构基础:稀疏数组

稀疏数组:

当一个二维数组中大部份的值为0,或者为同一值的时候,可以用稀疏数组来保存

实现思路:

记录二维数组有多少行多少列、多少个不同的值

把不同的值按照所在行列,记录在一个规模较小的数组中

举例:

11×11的二维数组:

对应的稀疏数组:

其中,第一行分别为,原二维数组总行数、总列数、不为0的数的个数

之后几行的每一列分别代表所在行、所在列、值

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

1. 遍历二维数组,得到非0数据的个数

2. 创建对应的稀疏数组

3. 再次遍历二维数组,将非0的值存放到稀疏数组中

稀疏数组恢复二维数组实现思路:

1. 读取稀疏数组的第一行,根据第一行的数据,创建对应的二维数组

2. 读取稀疏数组后几行的数据,赋值给二维数组

代码实现:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

//稀疏数组

public class SparseArray {

     public static void main(String[] args) {

         //创建一个原始的二维数组11 * 11

         int [][] chessArr = new int [ 11 ][ 11 ];

         chessArr[ 1 ][ 2 ] = 1 ;

         chessArr[ 2 ][ 3 ] = 2 ;

         chessArr[ 4 ][ 5 ] = 2 ;

         //输出原始的二维数组

         for ( int [] row : chessArr) {

             for ( int i : row) {

                 System.out.printf( "%d\t" , i);

             }

             System.out.println();

         }

 

         //二维数组转稀疏数组

         //首先遍历二维数组,得到非0数据的个数

         int sum = 0 ;

         for ( int i = 0 ; i < 11 ; i++) {

             for ( int j = 0 ; j < 11 ; j++) {

                 if (chessArr[i][j] != 0 ) {

                     sum++;

                 }

             }

         }

         //创建对应的稀疏数组

         int [][] sparseArr = new int [sum + 1 ][ 3 ];

         //对稀疏数组赋值

         sparseArr[ 0 ][ 0 ] = 11 ;

         sparseArr[ 0 ][ 1 ] = 11 ;

         sparseArr[ 0 ][ 2 ] = sum;

         //遍历二维数组,将非0的值存放到稀疏数组中

         int count = 0 ;  //用于记录是第几个非0数据

         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];

                 }

             }

         }

         //输出稀疏数组

         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();

         }

 

         //稀疏数组恢复二维数组

         //首先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组

         int newChessArr[][] = new int [sparseArr[ 0 ][ 0 ]][sparseArr[ 0 ][ 1 ]];

         //读取稀疏数组后几行的数据,赋值给二维数组

         for ( int i = 1 ; i < sparseArr.length; i++) {

             newChessArr[sparseArr[i][ 0 ]][sparseArr[i][ 1 ]] = sparseArr[i][ 2 ];

         }

         //输出恢复后的二维数组

         //输出原始的二维数组

         for ( int [] row : newChessArr) {

             for ( int i : row) {

                 System.out.printf( "%d\t" , i);

             }

             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

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注的更多内容!

原文链接:https://blog.csdn.net/qq_25274377/article/details/119194206

查看更多关于java数据结构基础:稀疏数组的详细内容...

  阅读:13次