Scala数据结构——稀疏数组

稀疏数组

保存稀疏数组,常通过三元组的方式,来存储二维矩阵(数组)中比较稀疏的值,例如

[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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值