理解数组----稀疏数组
先来说说最近的一些理解,希望对你也有启发:
1、程序是的存在是为了功能的实现,所以我们在学习的过程中先要理解功能实现原理,再记住关键代码过程;(也就是再初学阶段,现有学死—记住,才能学得灵活)
2、在学习一门语言的基本概念的时,**如何更高效?**应该先找到入门必须理解的相关概念,再上leedcode关键字搜索相关简单题目,没思路不要紧,就先看答案,把每一句代码看懂,理解代码逻辑,再记住,以此循环往复,据说至少要这样痛苦3个月==
3、算法和数据结构对我写java代码的意义是什么?
从分析问题的角度去理清数据结构和算法之间的关系。通常,每个问题的解决都经过以下两个步骤:
分析问题,从问题中提取出有价值的数据,将其存储;
对存储的数据进行处理,最终得出问题的答案;
数据结构负责解决第一个问题,即数据的存储问题。通过前面的学习我们知道,针对数据不同的逻辑结构和物理结构,可以选出最优的数据存储结构来存储数据。
而剩下的第二个问题,属于算法的职责范围。算法,从表面意思来理解,即解决问题的方法。我们知道,评价一个算法的好坏,取决于在解决相同问题的前提下,哪种算法的效率最高,而这里的效率指的就是处理数据、分析数据的能力。
因此我们得出这样的结论,数据结构用于解决数据存储问题,而算法用于处理和分析数据,它们是完全不同的两类学科。
以上来自摘抄,是在这位兄弟的帖子上找到了答案,感谢分享
原文链接:https://blog.csdn.net/alan711/article/details/86739788
———————————————
打印出一下原数组
将一下数组规模缩小为(稀疏列表)
打印原数组思路:
1、新建数组,并给有有效数字的数组坐标赋值
2、用foreach 遍历循环输出原数组所以元素
public static void main(String[] args) {
int[][] array1=new int[11][11];//记住新建一个数组时要给定数组大小
array1[1][2]=1;
array1[2][3]=2;
System.out.println("请输出原始数组:");
//foreach 遍历循环语句:
for(int[] ints:array1) {//for(类型 变量名:集合) { 语句块;}
// System.out.print(ints+"\t");
//ints 不是循环变量,它保存了集合中的元素,for-each 语句将集合中的元素一一取出来,并保存到ints 中
/*二维数组遍历一次是地址,遍历第二次才是具体的值,二维数组本质是在一个数组里嵌套一个数组,一个数组就是一个集合。
array1是一个二维数组,遍历第一次:ints里面存着每一行的地址,地址里面本上也存的是集合。
再将ints集合里的值遍历,遍历之后的每一个元素存储在anInt里面,最后anInt里面存储的是具体数值并输出*/
//每行前多了地址[I@7637f22 0 0 0 0 0 0 0 0 0 0 0
for(int anInt :ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
转换为稀疏数组保存思路:
1、通过循环遍历获取有有效值(坐标内元素值!=0)的坐标个数
2、创建新容器 数组array2来装稀疏数组,同时也要给出array2中一些初始已知坐标值
3、遍历二维数组,将非零的值,存放稀疏数组中
4、输出稀疏数组
//获取有效值个数
int sum=0;
for(int i=0;i<11;i++) {
for(int j=0;j<11;j++) {
if(array1[i][j]!=0) {// if(array1[][]!=0)里面要写值
sum++;//通过以上两图,找规律我们发现,稀疏列表的最末行的数字正好=有效数的个数
}
}
}
System.out.println("有效值的个数:"+sum);
//创建一个稀疏数组
int[][] array2=new int[sum+1][3];//int[sum+1][3]定义array2数组的大小
array2[0][0]=11;
array2[0][1]=11;
array2[0][2]=sum;
//遍历二维数组,将非零的值,存放稀疏数组中
int count=0;
for(int i=0;i<array1.length;i++) {
for(int j=0;j<array1[i].length;j++ ) {//array1[i].length i行的长度
if(array1[i][j]!=0) {
count++;//首先得先在草稿纸上列出稀疏数组的样式 0列:行 1列:列;2列:值
array2[count][0]=i;
array2[count][1]=j;
array2[count][2]=array1[i][j];
}
}
}
//输出稀疏数组
System.out.println("==============");
System.out.println("稀疏数组:");
for(int i=0;i<array2.length;i++) {
System.out.println( array2[i][0]+"\t"+
array2[i][1]+"\t"+
array2[i][2] +"\t");
}
还原稀疏数组思路:
1、读取稀疏数组,用新的容器array3来装读取出来的数组值,(注意新建array3数组定义大小)
2、把array2中的坐标元素转换成原数组array1的样子,并装入array3容器中。
3、遍历数组array3输出元素。
System.out.println("==============");
System.out.println("还原稀疏数组:");
//1、读取稀疏数组
int[][] array3=new int[array2[0][0]][array2[0][1]];
/*int[array2[0][0]][array2[0][1]] array2是稀疏数组,
它第一行第一个元素是:array1组的总行数;
它第一行第二个元素是:array1组的总列数;
*/
//给其中的元素还原它的值
for(int i=1;i<array2.length;i++) {//第0行不用遍历
array3[array2[i][0]][array2[i][1]]=array2[i][2];
}
//打印
System.out.println("==============");
System.out.println("输出原始数组:");
for(int[] ints:array3){
for(int anInt :ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
for(int[] ints:array3) {
for(int anInt :ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}