稀疏数组(Golang版本)
稀疏数组
基本介绍
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
稀疏数组的处理方法:
- 记录数组一共有几行几列,有多少个不同的数值;
- 把具有不同值的元素的行数列数及值记录在一个小规模的数组中,从而缩小程序规模。
实际问题
如下面的二维数组,我们可以假设成是一个棋盘,1代表白子,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
Golang版本
- 存盘
func writeSparse() {
// 定义一个结构体,用来存放稀疏矩阵的值
type ValNode struct{
row int
col int
val int
}
// 定义一个二维数组
var chessMap [11][11]int
chessMap[1][2] = 1
chessMap[2][3] = 2
// 定义一个切片
var sparseArr []ValNode
valNode := ValNode{
row: 11,
col: 11,
val: 0,
}
sparseArr =append(sparseArr,valNode)
for i, v:= range chessMap{
for j, v2:=range v{
if v2 != 0{
// 拿到黑子和白子具体的位置
valNode := ValNode{
row: i,
col: j,
val: v2,
}
sparseArr =append(sparseArr,valNode)
}
}
}
filePath := "sparseArr.txt"
file, err := os.OpenFile(filePath,os.O_WRONLY|os.O_CREATE,0666)
if err != nil{
fmt.Println("os.OpenFile err:",err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
for _, valNode:=range sparseArr{
//fmt.Println(valNode.row,valNode.col,valNode.val)
str:=fmt.Sprint(valNode.row,valNode.col,valNode.val)
_, err := writer.WriteString(str+"\n")
if err != nil{
fmt.Println("writer.WriteString(str) err:",err)
return
}
}
writer.Flush()
}
- 续盘
func readSparse() {
type ValNode struct {
row int
col int
val int
}
var sparseArr []ValNode
filePath := "sparseArr.txt"
file, err := os.Open(filePath)
if err != nil {
fmt.Println("os.Open(filePath) err:", err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString('\n')
if err == io.EOF { // io.EOF表示文件的末尾
break
}
fmt.Println(str)
arr := strings.Fields(str)
valNode := ValNode{}
for i, _ := range arr {
in, err := strconv.Atoi(arr[i])
if err != nil {
return
}
switch i {
case 0:
valNode.row = in
case 1:
valNode.col = in
case 2:
valNode.val = in
}
}
sparseArr = append(sparseArr, valNode)
}
var chessMap [][]int
//var chessMap [11][11]int
for i, v := range sparseArr {
if i == 0 {
for a := 0; a < v.row; a++ {
mm := make([]int, v.col)
chessMap = append(chessMap, mm)
}
} else {
chessMap[v.row][v.col] = v.val
}
}
fmt.Println(chessMap)
}