java实现稀疏数组

文章目录

  • 前言
  • 一、稀疏数组是什么?
  • 二、如何使用稀疏数组?
    • 1.普通数组
    • 2.稀疏数组
    • 3.解释
  • 三、代码实现
  • 总结

前言

看了韩顺平老师的数据结构与算法视频后,在此分享稀疏数组的简单实现,希望能与更多的朋友一起交流学习经验。

一、稀疏数组是什么?

把一个数组很大但元素很少的普通数组转化为另一个数组,这就是稀疏数组。

二、如何使用稀疏数组?

1.普通数组

java实现稀疏数组_第1张图片

2.稀疏数组

在这里插入图片描述

3.解释

稀疏数组至少有一行,第一行第一列为普通数组的行数,第一行第二列为普通数组的列数,第一行第三列为普通数组的非0元素个数,然后就是普通数组有多少个非0元素,稀疏数组就再增加多少行,每行的第一个元素为该元素在普通数组中的行下标,第二个元素为该元素在普通数组中的列下标,第三个元素就是存储的普通数组中的非0元素。

三、代码实现

代码共分为三个部分,第一部分是把普通数组转为稀疏数组,第二部分是把稀疏数组重新转为普通数组,可能这有点闲的无聊,但也算是有始有终了,第三部分是把稀疏数组存到文件中,然后再读取出来打印结果。
代码如下:

package com.yc.sparsearr;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;

/**
 * 稀疏数组的代码实现
 * @author lsj
 *
 */
public class SparseArr {

	public static void main(String[] args) throws IOException {
		//第一部分
		int [][] arr = new int[11][11];
		arr[1][2]=1;
		arr[2][3]=2;
		for(int [] a1:arr){
			for(int a2:a1){
				System.out.printf("%d\t",a2);
			}
			System.out.println();
		}
		System.out.println();
		int sum=0;
		for(int [] a1:arr){
			for(int a2:a1){
				if(a2!=0){
					sum++;
				}
			}
		}
		int [][] sparseArr = new int[sum+1][3];
		sparseArr[0][0] = arr.length;
		sparseArr[0][1] = arr[0].length;
		sparseArr[0][2] = sum;
		int count = 0;
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr[0].length;j++){
				if(arr[i][j]!=0){
					count++;
					sparseArr[count][0] = i;
					sparseArr[count][1] = j;
					sparseArr[count][2] = arr[i][j];
				}
			}
		}
		for(int [] a1:sparseArr){
			for(int a2:a1){
				System.out.printf("%d\t",a2);
			}
			System.out.println();
		}
		System.out.println();
		//第二部分
		int [][] arr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
		for(int i=1;i<=sparseArr[0][2];i++){
			arr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
		}
		for(int [] a1:arr2){
			for(int a2:a1){
				System.out.printf("%d\t",a2);
			}
			System.out.println();
		}
		System.out.println();
		//第三部分
		StringBuffer sparseArrSb = new StringBuffer();
		for(int [] a1:sparseArr){
			for(int i=0;i<3;i++){
				if(i<2){
					sparseArrSb.append(a1[i]+" ");
				}else{
					sparseArrSb.append(a1[i]);
				}
			}
			sparseArrSb.append("|");
		}
		byte [] sparseArrBt = sparseArrSb.toString().getBytes();
		OutputStream out = new FileOutputStream("sparsearr.txt");
		out.write(sparseArrBt);
		out.close();
		BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("aa.txt")));
		String str = new String();
		str = in.readLine();
		in.close();
		String [] str2 = str.split("\\|");
		String [][] str3 = new String[str2.length][3];
		for(int i=0;i<str3.length;i++){
			str3[i] = str2[i].split(" ");
		}
		int [][] sparseArr2 = new int[str3.length][3];
		for(int i=0;i<str3.length;i++){
			for(int j=0;j<3;j++){
				sparseArr2[i][j] = Integer.parseInt(str3[i][j]);
			}
		}
		for(int [] a1:sparseArr2){
			for(int a2:a1){
				System.out.printf("%d\t",a2);
			}
			System.out.println();
		}
	}

}

总结

虽说稀疏数组不太常见,但把普通数组转为稀疏数组也算是一种小技巧,不管它有没有用,这能让我们感受到学习数据结构和算法的快乐就够了!

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