稀疏数组
保存稀疏数组,常通过三元组的方式,来存储二维矩阵(数组)中比较稀疏的值,例如
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
该数组中大部分的值是相同的:0,其中不同值的项非常少,为了节省存储空间,可以采用三元组:(行号,列号,值)的方式来存储
代码实现
由于markdown代码块目前不支持scala,因此这里使用的是java格式,可能代码颜色高亮会有所误差
package Datastructure.sparseArray
import scala.collection.mutable.ArrayBuffer
object SparseArray {
def main(args: Array[String]): Unit = {
//定义二维矩阵行列数和默认值
val rowSize = 11
val colSize = 11
val defaultValue = 0
//创建二维矩阵
val chessMap = Array.ofDim[Int](rowSize,colSize)
chessMap(1)(2) = 1
chessMap(2)(3) = 2
//打印未压缩之前的稀疏矩阵
println("------压缩前的稀疏数组------")
for(i<- chessMap){
for(j <- i)printf("%d\t",j)
println
}
//构建可变数组,存放三元组
val sparseArr = ArrayBuffer[Node]()
//首先填充一个三元组,用以表示数组的行列数及默认值
sparseArr.append(new Node(rowSize,colSize,defaultValue))
//构造三元组组成的压缩数组
for(i<- chessMap.indices){
for(j<- chessMap(i).indices){
if(chessMap(i)(j)!=0){
val node = new Node(i,j,chessMap(i)(j))
sparseArr.append(node)
}
}
}
//打印三元组数组
println("------压缩后-------")
for(node<-sparseArr)println(node.row,node.col,node.value)
//模拟恢复稀疏数组
//获取稀疏数组的基本信息:行列数,默认值
val newNode = sparseArr(0)
val rowSize2 = newNode.row
val colSize2 = newNode.col
//构建稀疏数组
val chessMap2 = Array.ofDim[Int](rowSize2,colSize2)
//填入数据
for(i <- 1 until sparseArr.length){
val node = sparseArr(i)
chessMap2(node.row)(node.col) = node.value
}
println("-------恢复后的稀疏数组--------")
for(i <- chessMap){
for(j <- i)printf("%d\t",j)
println
}
}
}
//定义三元组类
class Node(val row:Int,val col:Int,val value:Int)
控制台打印效果
这里只是通过控制台打印模拟,具体应用可以通过输入输出流从文件中获取,保存到文件中
------压缩前的稀疏数组------
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
------压缩后-------
(11,11,0)
(1,2,1)
(2,3,2)
-------恢复后的稀疏数组--------
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0