【数据结构与算法】数组应用3:稀疏矩阵压缩(Java实现)

简介:

    直接看下面的程序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package  chapter02;
 
import  java.util.Arrays;
 
/*
  * 稀疏矩阵压缩(简单版)
  */
public  class  CH02_05 {
     public  static  void  main(String[] args) {
         //定义一个稀疏矩阵
         int [][] arr = 
             {
                     { 25 0 0 32 0 , - 25 },
                     { 0 33 77 0 0 0 },
                     { 0 0 0 55 0 0 },
                     { 0 0 0 0 0 0 },
                     { 101 0 0 0 0 0 },
                     { 0 0 38 0 0 0 }
             };
         
         //输出稀疏矩阵
         for ( int  i =  0 ; i < arr.length; i++){
             System.out.println(Arrays.toString(arr[i]));
         }
         
         //压缩稀疏矩阵的准备工作
         int  rows = arr.length;        //稀疏矩阵的行
         int  cols = arr[ 0 ].length;     //稀疏矩阵的列
         int  real =  0 ;                 //稀疏矩阵非0元素
         //遍历获取稀疏矩阵的非0元素个数
         for ( int  i =  0 ; i < rows; i++){
             for ( int  j =  0 ; j < cols; j++){
                 if (arr[i][j] !=  0 ){
                     real +=  1 ;
                 }
             }
         }
         //定义一个数组,用来保存压缩后的稀疏矩阵
         int [][] arrResult =  new  int [real+ 1 ][ 3 ];
         //初始化arrResult
         for ( int  i =  0 ; i < arrResult.length; i++){
             Arrays.fill(arrResult[i],  0 );
         }
         //在arrResult中保存稀疏矩阵的基本信息
         //arrResult[0][0]:稀疏矩阵的行数   arrResult[0][1]:稀疏矩阵的列数     arrResult[0][2]:稀疏矩阵非0元素个数
         arrResult[ 0 ][ 0 ] = rows;
         arrResult[ 0 ][ 1 ] = cols;
         arrResult[ 0 ][ 2 ] = real;
         //输出初始化后的arrResult
         System.out.println();
         for ( int  i =  0 ; i < arrResult.length; i++){
             System.out.println(Arrays.toString(arrResult[i]));
         }
         
         //开始压缩稀疏矩阵
         int  k =  1 ;    //用来记录arrResult到第几行,因为第0行已经用来保存基本信息,所以从第1行开始
         for ( int  i =  0 ; i < rows; i++){
             for ( int  j =  0 ; j < cols; j++){
                 if (arr[i][j] !=  0 ){
                     arrResult[k][ 0 ] = i;
                     arrResult[k][ 1 ] = j;
                     arrResult[k][ 2 ] = arr[i][j];
                     k++;
                 }
             }
         }
         
         //输出压缩后的稀疏矩阵
         System.out.println();
         for ( int  i =  0 ; i < arrResult.length; i++){
             System.out.println(Arrays.toString(arrResult[i]));
         }
 
     }
}

    执行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[25, 0, 0, 32, 0, -25]
[0, 33, 77, 0, 0, 0]
[0, 0, 0, 55, 0, 0]
[0, 0, 0, 0, 0, 0]
[101, 0, 0, 0, 0, 0]
[0, 0, 38, 0, 0, 0]
 
[6, 6, 8]
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
 
[6, 6, 8]
[0, 0, 25]
[0, 3, 32]
[0, 5, -25]
[1, 1, 33]
[1, 2, 77]
[2, 3, 55]
[4, 0, 101]
[5, 2, 38]



本文转自 xpleaf 51CTO博客,原文链接:http://blog.51cto.com/xpleaf/1976965,如需转载请自行联系原作者
相关文章
|
2天前
|
Java 索引
Java中数组详解
Java中数组详解
41 19
|
2天前
栈的基本应用
栈的基本应用
10 3
|
2天前
|
存储 算法 Java
数据结构与算法 数组和链表
数据结构与算法 数组和链表
7 0
|
2天前
|
Java
解析java中的数组
解析java中的数组
10 3
|
2天前
|
存储 索引
深入浅出数据结构之数组
深入浅出数据结构之数组
|
2天前
|
存储 缓存 监控
中间件应用合理使用缓存和数据结构
中间件应用合理使用缓存和数据结构
14 3
|
3天前
|
存储 安全 Java
Java一分钟之-数组的创建与遍历
【5月更文挑战第8天】本文介绍了Java中数组的基本概念、创建与遍历方法,强调了类型匹配和数组越界问题。示例展示了如何创建整数数组并初始化元素,同时提供了避免数组越界的策略。对于遍历,文章提到了for循环和增强型for循环,并给出了防止错误的建议,如正确声明类型、初始化数组、安全索引操作及使用合适的数据结构。遵循这些指导可帮助开发者有效管理Java数组并减少错误。
14 0
|
4天前
|
算法 测试技术 C++
【栈 最小公倍数 最大公约数】2197. 替换数组中的非互质数
【栈 最小公倍数 最大公约数】2197. 替换数组中的非互质数
【栈 最小公倍数 最大公约数】2197. 替换数组中的非互质数
|
5天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
16 0
|
7天前
|
存储 缓存 算法
【C 言专栏】C 语言中的数据结构应用
【5月更文挑战第4天】本文探讨了C语言中的核心数据结构,包括数组、链表(单链表和双链表)、栈、队列、二叉树(如二叉搜索树和二叉堆)以及图结构。这些数据结构在程序设计中扮演着关键角色,如数组的快速访问、链表的动态管理、栈和队列的处理流程控制、树和图的复杂关系表示。理解并选择适当的数据结构可优化程序性能,而内存管理和算法优化则进一步提升效率。通过案例分析和展望未来发展趋势,本文旨在帮助读者深化对C语言数据结构的理解和应用。
【C 言专栏】C 语言中的数据结构应用