乐趣区

关于go:go-稀疏数组

当一个数组中大部分元素为0,或者为同一个值的数组时,能够应用稠密数组来保留该数组

如下图,在一个二维数组中大部分是同一个数,这样的状况就能够应用稠密数组来保留数据

实现一个稠密数组

package main
import ("fmt")

type ValNode struct {
    row int
    col int
    val int
}

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). 将其放入到对应的切片即可
    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)
            }
        }
    }


    //4. 输入稠密数组
    fmt.Println("\n 以后的稠密数组是:::::")
    for _, valNode := range sparseArr {fmt.Printf("%d %d %d\n", valNode.row, valNode.col, valNode.val)
    }

    // 先创立一个原始数组
    var chessMap2 [11][11]int

    // 遍历 sparseArr [遍历文件每一行]
    for i, valNode := range sparseArr {
        if i != 0 {
            // 跳过第一行记录值
            chessMap2[valNode.row][valNode.col] = valNode.val
        }
    }

    // 看看 chessMap2 是不是复原 .
    fmt.Println("复原后的原始数据")
    for _, v := range chessMap2 {
        for _, v2 := range v {fmt.Printf("%d\t", v2)
        }
    fmt.Println()}
}

执行的输入为

>go run main.go
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
退出移动版