Java数据结构与算法——day01

Java数据结构与算法——线性结构与非线性结构、稀疏数组

线性结构

  1. 特点:数据元素之间存在一对一关系,1后面就是2,2后面就是3,另一方面数据元素与位置之间也是一对一关系。
  2. 存储结构
    |顺序存储结构 | 链式存储结构 |
    |存储元素内存地址连续 | 存储元素内存地址不一定连续 |
    | 仅存放数据 | 存放数据和响铃元素的地址信息 |
    | 数组、队列、链表、栈 |

非线性结构

  1. 包括:二维数组、多维数组、广义表、树结构、图结构

稀疏数组

  1. 应用场景:记录五子棋棋盘状态,普通二维数组对于大量空棋子位置存在很多无用数据。
  2. 稀疏数组:
    a) 记录普通数组不为默认值的元素的 ‘行、列、值‘ 三个信息,在一个小规模数组中
    b) 稀疏数组第一个元素为普通数组得行、列、有多少不同元素三个信息
    Java数据结构与算法——day01_第1张图片
    1. 应用实例
      Java数据结构与算法——day01_第2张图片
    2. 稀疏数组代码实现
      1) 创建如上棋盘二维数组输出
      2) 将二维数组转换为稀疏数组输出
      3) 将稀疏数组转换为二维数组输出
package com.atguigu.SparseArray;

public class SparseArray {

	public static void main(String[] args) {
		//创建棋盘二位数组11*11
		//0代表空,1代表黑子,2代表白字
		final int blank = 1;
		final int write = 2;
		final int row_num = 11;
		final int col_num = 12;
		
//		创建11*11原始棋盘数组
		int[][] chessboard = new int[row_num][col_num];
		chessboard[3][4] = 1;
		chessboard[4][3] = 1;
		chessboard[5][1] = 2;
		
		int sum = 0;
//		遍历棋盘:棋子个数
		System.out.println("这是原始棋盘数组~~~~~~~~~~~~~~~");
		for(int[] rows:chessboard){
			for(int data:rows){
				System.out.print(data+"\t");
				if(data != 0){
					sum++;
				}
			}
			System.out.println();
		}
		System.out.printf("共有%d枚棋子\n", sum);
		
//		初始化稀疏数组
		int sparse_array[][] = new int[sum+1][3];
		sparse_array[0][0] = chessboard.length;
		sparse_array[0][1] = chessboard[0].length;
		sparse_array[0][2] = sum;
		
		int count = 0;
//		遍历棋盘:获得棋子得值以及位置,填充稀疏数组
		for(int i=0;i<chessboard.length;i++){
			for(int j=0;j<chessboard[0].length;j++){
				int data = chessboard[i][j];
				if(data != 0){
					count++;
					sparse_array[count][0] = i;
					sparse_array[count][1] = j;
					sparse_array[count][2] = data;
				}
			}
		}
		
//		遍历稀疏数组:输出结果
		System.out.println("这是稀疏数组~~~~~~~~~~~~~~~");
		for(int[] rows:sparse_array){
			for(int data:rows){
				System.out.print(data+"\t");
			}
			System.out.println();
		}
		
//		遍历稀疏数组:还原棋盘数组
		int chessboard2[][] = new int[sparse_array[0][0]][sparse_array[0][1]];
		for(int i=1;i<sparse_array.length;i++){
			int row = sparse_array[i][0];
			int col = sparse_array[i][1];
			int data = sparse_array[i][2];
			chessboard2[row][col] = data;
		}
		
		System.out.println("这是还原后的棋盘数组~~~~~~~~~~~~~~~~~~");
//		遍历还原后的棋盘数组:输出结果
		for(int[] rows:chessboard2){
			for(int data:rows){
				System.out.print(data+"\t");
			}
			System.out.println();
		}
	}
}

输出:
这是原始棋盘数组~~~~~~~~~~~~~~~
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 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 0 0 0 0 0 0 0
0 0 0 1 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
共有3枚棋子
这是稀疏数组~~~~~~~~~~~~~~~
11 12 3
3 4 1
4 3 1
5 1 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 1 0 0 0 0 0 0 0
0 0 0 1 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

你可能感兴趣的:(数据结构与算法)