1.算法和数据结构的关系
- 数据结构是一门研究组织数据方式的学科,有了编程语言也就有了数据结构,学好数据结构可以编写出更漂亮的,更有效的代码
- 程序=数据结构+算法
- 数据结构是算法的基础,要想学好算法需要把数据结构学到位
2.数据结构的构成:
数据结构包括线性结构和非线性结构
2.1线性结构:
- 线性结构作为最常用的数据结构,其特点是数据元素存在一对一的线性关系
- 线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称为顺序表——内存中存储的地址是连续不断的;链式存储的线性表称为链表——内存中存储的地址不一定是连续的
- 线性结构常见的有:数组、队列、链表和栈
2.2非线性结构:
- 非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构和群结构。
- 非线性结构常见的有:二维数组、多维数组、广义表、树结构、图结构
3.稀疏数组:
3.1 有如下需求
- 编写五子棋程序,有存盘退出和续盘的功能
- 分析问题:
因为该二维数组的很多默认值都是0,因此记录了很多没有意义的数组,这时候就要换一种数组来存储即稀疏数组
3.2 稀疏数组基本介绍
- 当一个数组中的大部分元素为0或者为同一个值的时候,可以用稀疏数组来进行存储
- 处理方法:
- 稀疏数组第一行数据记录的几行几列,都多少个不同的值
- 吧具有不同值的元素的行列记录在一个小规模的数组中,从而缩小程序的规模
3.3 稀疏数组举例
3.4 需求分析
3.5 代码实现
package com.zjh.suanfa.sparsearray;
import java.util.HashMap;
import java.util.Map;
/**
* 稀疏数组
*/
public class SparseArray {
public static void main(String[] args) {
//先创建一个原始的二维数组 11*11
//0表示没有棋子 1表示黑子 2表示篮子
int chess[][]=new int[11][11];
chess[1][2]=1;
chess[2][3]=2;
chess[10][10]=2;
System.out.println("原始数据");
for (int a[]:chess) {
for (int b:a) {
System.out.printf("%d\t",b);
}
System.out.println();
}
//转换成稀疏数组(三列分别记录 行列值 第一行记录总共多少行 多少列 以及不同值的个数)
//获得原始数组里面不同值的个数 有几个那么稀疏数组就会有对应+1条数据
int sum=0;
for (int i=0;i<chess.length;i++){
for (int j=0;j<chess[i].length;j++){
if (chess[i][j]!=0){
sum++;
}
}
}
int sparseArray[][]=new int[sum+1][3];
//给稀疏数组赋值
//赋值第一行
sparseArray[0][0]=chess.length;//行数
sparseArray[0][1]=chess[0].length;//列数
sparseArray[0][2]=sum;//不同值的个数
int count=0;//记录稀疏数组当前的行数
for (int i=0;i<chess.length;i++){
for (int j=0;j<chess[i].length;j++){
if (chess[i][j]!=0){
count++;//进来一次就证明要重新创建一行
sparseArray[count][0]=i;
sparseArray[count][1]=j;
sparseArray[count][2]=chess[i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组==============");
for (int i=0;i<sparseArray.length;i++) {
System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
}
//讲稀疏数组恢复成二维数组========================
//获得二维数组第一个行的值
int[][] newChess=new int[sparseArray[0][0]][sparseArray[0][1]];
//赋值
for(int i=1;i<sparseArray.length;i++){
newChess[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
}
//输出恢复的数组
System.out.println("恢复以后的数组============");
for (int a[]:newChess) {
for (int b:a) {
System.out.printf("%d\t",b);
}
System.out.println();
}
}
}
3.6 运行结果:
原始数据
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 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 2
稀疏数组==============
11 11 3
1 2 1
2 3 2
10 10 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 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 2