数据结构与算法--稀疏数组

转换方法

  1. 记录数组有几行几列,有多少个不同的值

  2. 把不同的值的元素的行列,记录在一个小规模的数组中,以此来缩小数组的规模

    如图:


二维数组转稀疏数组

  1. 对原始的二维数组进行遍历,并得到有效的数据个数(这里用sum表示)
  2. 根据sum的个数,创建稀疏数组 sparseArr int[sum+1][3]
  3. 将二维数组的有效数据存入到稀疏数组中

    PS:sum+1是因为稀疏数组的第一行存放的是数组的行列数以及有效数值个数


稀疏数组转二维数组

  1. 先读取稀疏数组中的第一行,并且根据稀疏数组中第一行的数据,创建原始的二维数组
     int num1,num2;
    num1 = sparseArr[0][0];
    num2 = sparseArr[0][1];
    chessArr int[num1][num2] = new int[num1][num2];
  2. 读取稀疏数组后面几行的数据,并且一一赋值给原始的二维数组

代码实现

输出原始数组

public static void main(String[] args) {
//创建原始数组
//1代表黑子,2代表白子
int[][] chessArr = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
for (int[] items: chessArr) {
for (int data: items) {
System.out.print(data+"\t");
}
System.out.println();
}
}

结果如下:

转换稀疏数组并输出

public static void main(String[] args) {
//创建原始数组
//1代表黑子,2代表白子
int[][] chessArr = new int[11][11];
chessArr[1][2] = 1;
chessArr[2][3] = 2;
//sum用来记录不为0的数值个数
int sum=0;
for (int[] items: chessArr) {
for (int data: items) {
if(data != 0){
sum++;
}
System.out.print(data+"\t");
}
System.out.println();
} //原始数组转逻辑数组
//1、找出数值不为0的元素个数
int[][] sparseArr =new int[sum+1][3];
//chessArr.length代表行的长度
//chessArr[0].length代表列的长度
sparseArr[0][0]=chessArr.length;
sparseArr[0][1]=chessArr[0].length;
sparseArr[0][2]=sum; //第一行以后的稀疏数组的数据
int count = 0; //count用来统计是第几个不为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[] items: sparseArr) {
for (int data: items) {
System.out.print(data+"\t");
}
System.out.println();
}
}

其结果如下

稀疏数组转换会原数组

		//将稀疏数组还原
//1、通过第一行的稀疏数组数值,建立原始二维数组
int[][] chessArr1 = new int[sparseArr[0][0]][sparseArr[0][1]];
//2、将稀疏数组的值赋值给原始数组
for(int i=1;i<sparseArr.length;i++){
//将稀疏数组中的第i行的第1/2分别取出作为原始数组的行和列,第三个值作为原始数组的值
chessArr1[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
}
//转换后的原始数组输出
for (int[] items: chessArr1) {
for (int data: items) {
System.out.print(data+"\t");
}
System.out.println();
}

其结果如下:

好啦~

今天的更新到此结束

下次再更新其他文章哦~

最新文章

  1. html5手机端遮罩弹出菜单代码
  2. Linux----LVM扩容磁盘空间
  3. MY SQL8.0里程碑发布
  4. How Google Tests Software - The Life of a TE
  5. MySQL创建索引语法
  6. Spark 1.1.0 安装测试 (分布式 Yarn-cluster模式)
  7. Unreal Engine 4官网教程
  8. javaIO流小结(1)
  9. js 日期控件 可以显示为和历
  10. 25_Downloading An Image
  11. java提高篇(十)-----强制类型转换
  12. 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
  13. Python核心编程--浅拷贝与深拷贝
  14. markdown语法小结
  15. 十二.HTTPS网站安全访问实践
  16. 关于JVM加载内存图学习小密招
  17. C#如何使用REST接口读写数据
  18. HashTable和HashMap的区别详解
  19. Django 编写自定义的 404 / 500 报错界面
  20. Java代码中谁拿到了锁?

热门文章

  1. Python-Opencv 轮廓常用操作
  2. leetcode刷题记录——哈希表
  3. Robot Framework(2)——简单运行案例
  4. Hive SQL 优化面试题整理
  5. SpringMVC中前端Form表单提交后跳转不过去的问题
  6. oracle impdp 数据迁移 至RDS 亚马逊云
  7. git最基础常用操作
  8. java里equals和hashCode之间什么关系
  9. 面向嵌入式的JavaScript引擎
  10. Lua索引、伪索引、引用