稀疏数组:把具有不同值的元素的行、列以及值记录到一个小规模的数组中,从而缩短程序的规模,也起到压缩数组的功能。
代码实现如下:
// 1. 创建一个11X11的二维数组,并初始化两个元素
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()
}
打印如下:
把二维数组转换为稀疏数组,实现如下:
// 定义稀疏数组中的对象结构
type ValNode struct {
row int // 行
col int // 列
val int // 值
}
// 3. 转成稀疏数组,遍历数组,记录不为0的值到node结构体中
var sparseArr = make([]ValNode, 0)
sparseArr = append(sparseArr, ValNode{
row: 11,
col: 11,
val: 0,
})
for i, v := range chessMap {
for j, v2 := range v {
if v2 != 0 {
var node = ValNode{
row: i,
col: j,
val: v2,
}
sparseArr = append(sparseArr, node)
}
}
}
// 打印出稀疏数组
fmt.Println(sparseArr)
打印如下:
通过稀疏数组恢复二维数组
var chessMap02 = make([][11]int, sparseArr[0].col)
for i := 0; i < sparseArr[0].col; i++ {
for j := 0; j < sparseArr[0].row; j++ {
chessMap02[i][j] = sparseArr[0].val
}
}
for i := 1; i < len(sparseArr); i++ {
chessMap02[sparseArr[i].row][sparseArr[i].row] = sparseArr[i].val
}
for _, v := range chessMap02 {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
打印如下:
完整代码如下:
package main
import "fmt"
/**
稀疏数组的实现原理:
1. 记录数组一共有几行几列,有多少个不同的值
2. 把具有不同值的元素的行、列以及值记录到一个小规模的数组中,
从而缩短程序的规模,也起到压缩数组的功能
*/
func main() {
// 1. 创建一个11X11的二维数组,并初始化两个元素
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()
}
// 定义稀疏数组中的对象结构
type ValNode struct {
row int // 行
col int // 列
val int // 值
}
// 3. 转成稀疏数组,遍历数组,记录不为0的值到node结构体中
var sparseArr = make([]ValNode, 0)
sparseArr = append(sparseArr, ValNode{
row: 11,
col: 11,
val: 0,
})
for i, v := range chessMap {
for j, v2 := range v {
if v2 != 0 {
var node = ValNode{
row: i,
col: j,
val: v2,
}
sparseArr = append(sparseArr, node)
}
}
}
fmt.Println(sparseArr)
// 4. 可以存盘处理,这里就不实现了
// 5. 模拟从磁盘中恢复出原始数组
var chessMap02 = make([][11]int, sparseArr[0].col)
for i := 0; i < sparseArr[0].col; i++ {
for j := 0; j < sparseArr[0].row; j++ {
chessMap02[i][j] = sparseArr[0].val
}
}
for i := 1; i < len(sparseArr); i++ {
chessMap02[sparseArr[i].row][sparseArr[i].row] = sparseArr[i].val
}
for _, v := range chessMap02 {
for _, v2 := range v {
fmt.Printf("%d\t", v2)
}
fmt.Println()
}
}