Java数据结构学习---Part01

首先上一下链接 尚硅谷Java数据结构与java算法(Java数据结构与算法)_哔哩哔哩_bilibili

(不喜勿喷,有错误请指出来)我主要是写一下我自己学习数据结构的心得和一些课程中相关的代码,也作为我的学习笔记和再练习,具体的课程还需要去看B站里老师讲的课,但是我认为我分析的会更加通俗易懂。因为主要是写写代码,刷刷题,很多概念性的东西就不说了,主要是非科班,想学学数据结构写代码,需要概念的买本书去背背就好了。

  • 稀疏数组

  1.  什么是稀疏数组,为什么需要使用稀疏数组,话不多说,上图:

     这样的就是普通数组,我们可以看到我们在这个数组中只使用了三个位置,其他位置并没有使用,这样就导致我们的内存负担较大,所以我们就要使用稀疏数组。

    那么什么是稀疏数组,直接上图:
     

     第一次看到这个图肯定特别懵逼,其实很简单,我们首先 看一下上面的原数组的大小和数据的位置,我们可以知道原数组是11*11的数组,(1,2)->1,(2,3)->1,(4,5)->2。由此我们可以知道,稀疏数组 1.第一行(原数组row,原数组column,原数组不为0数据个数),2. 之后的行为(第1个数据在原数组的row , column , value ),(第2个数据在原数组的row , column , value ),(第n个数据在原数组的row , column , value )。  并且很关键得一个点,原数组有x个非0值,稀疏数组的行数就为x+1

  2. 要掌握的技能:稀疏数组主要是解决数组中空间被多个无用数据所占用的问题,我们需要掌握1.将数组转换为稀疏数组。2.将稀疏数组转回为普通数组。其实主要应用还需要文件的读取,普通数组->稀疏数组->文件,最后一步只需要IO读取和读入即可,我们这里只说前两步骤。

代码详解(普通数组----->稀疏数组)

 int arr1[][] = new int[11][11];
        arr1[1][2] = 1;
        arr1[2][3] = 1;
        arr1[4][5] = 2;
        int sum = 0;

创建原数组,并且赋值,这里用sum来统计非0值的个数。

for (int[] row : arr1) {
            for (int item : row) {
                if (item != 0)
                    sum++;
            }
        }

 foreach循环遍历数组,统计出来有多少非零值。

这里原数组的任务就完成了!

int sparseArr[][] = new int[sum + 1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;

创建稀疏数组,首先肯定是先建立好我们已经知道的值,那就是稀疏数组的第一行和大小,行数为sum+1,因为第一行要存储原数组大小,非0值个数的,列数永远为3列。

        int count = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (arr1[i][j] != 0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = arr1[i][j];
                }
            }
        }
        System.out.println();

现在的任务就是要填一下稀疏数组第一行下面的值了,这里的值我们需要的是原数组非0值的信息(行,列,值),所以我们肯定要遍历原数组了,我们找到第1个值的时候,我们需要将其信息存入第一行,找到第二个值的时候,将信息要存到第二行,所以这里我们声明一个count,来自动改变行数即可。找到非0值之后,存一下行,列,值就可以了。

代码详解(稀疏数组----->普通数组)

接上文

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

用稀疏数组,创建原数组,注:稀疏数组的0,0值是原数组的行数,稀疏数组的0,1值是原数组的列数。

for (int i = 1; i < sparseArr.length; i++) {
            arr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

从稀疏数组的第一行开始遍历,刚好遍历到最后一行。如果遍历到第一行,那么sparseArr[1][0]就应该是原数组的第一个值的行, sparseArr[1][1]就应该是原数组的第一个值的列, sparseArr[1][2]就应该是原数组的第一个值的值。以此类推,遍历完就好了。很简单。

总体代码

public class SparseArray {

    public static void main(String[] args) {

        int arr1[][] = new int[11][11];
        arr1[1][2] = 1;
        arr1[2][3] = 1;
        arr1[4][5] = 2;
        int sum = 0;

        for (int[] row : arr1) {
            for (int item : row) {
                if (item != 0)
                    sum++;
            }
        }

        int sparseArr[][] = new int[sum + 1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;

        int count = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (arr1[i][j] != 0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = arr1[i][j];
                }
            }
        }
        System.out.println();

        for (int[] row : sparseArr) {
            for (int item : row) {
                if (item != 0)
                    System.out.print(item + "\t");
            }
            System.out.println();
        }

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

        for (int i = 1; i < sparseArr.length; i++) {
            arr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }


        for (int[] row : arr2) {
            for (int item : row) {
                System.out.print(item + "\t");
            }
            System.out.println();
        }


    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值