go_稀疏数组
1、稀疏数组(sparsearray)
1.1 先看一个实际的需求
-
编写的五子棋程序中,有存盘退出和续上盘的的功能
-
分析按照原始的方式来的二维数组的问题
因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据
1.2 基本介绍
当一个数据中大部分数据为0,或者为同一个值的数组时,可以使用稀疏数组来保存数组
稀疏数组的处理方法:
1、记录数组一共有几行几列,有多少个不同的值
2、思想:把具有不同值得元素的行里及值记录在一个小规模的数组中,从而缩小程序的规模
1.3 稀疏数组举例说明
1.4 应用示例
- 使用稀疏数组来保留类似前面的二维数组(棋盘、地图等)
- 把稀疏数组存盘,并且可以重新恢复原来的二维数组
- 整体思路分析
- 代码实现
package main
import (
"fmt"
)
func main(){
//1、创建一个原始数组
var chessMap [11][11]int
chessMap[1][2] = 1 //黑子
chessMap[2][3] = 2 //白子
//2、遍历数组
//for _,v :=range chessMap{
// for _,v2 :=range v{
// fmt.Printf("%d\t",v2)
// }
// fmt.Println()
//}
//3、转成稀疏数组
//思路:
//1、遍历chessmap ,如果有一个元素的值不为0,创建一个node结构体
//2、放在对应的切片
type ValNode struct {
row int
col int
val int
}
var sparseArr []ValNode
//一个标准的稀疏数组应该还有一个记录元素的二维数组的规模(行和列,默认值)
//创建一个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 :=ValNode {
row : i,
col : j,
val : v2,
}
sparseArr=append(sparseArr,valNode)
}
fmt.Printf("%d\t",v2)
}
fmt.Println()
}
//把稀疏数组写在文件
//filePath :="./sparseArr.data"
//file,err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE,0666)
//if err !=nil{
// fmt.Printf("open file err=%v\n",err)
// return
//}
//defer file.Close()
//writer := bufio.NewWriter(file)
//writer.WriteString(string(src))
//writer.Flush()
//输出稀疏数组
fmt.Println("当前的稀疏数组::::::")
for i,valNode := range sparseArr{
fmt.Printf("%d: %d %d %d \n",i,valNode.row,valNode.col,valNode.val)
}
//恢复原始的数组
//1、先创建一个原始的数组
var chessMap2 [11][11]int
//遍历sparseArr
for i,valNode2 := range sparseArr{
if i !=0{
chessMap2[valNode2.row][valNode2.col]=valNode2.val
}
}
for _,v :=range chessMap2{
for _,v2 :=range v{
fmt.Printf("%d\t",v2)
}
fmt.Println()
}
}