1.1.1. 一、稀疏数组(Sparse Array)的说明:

如果一个多维数组中,存放了很多相同的元素,不同的元素很少,那就是一个稀疏数组。我们可以稀疏数组压缩转换另一个数组存储,从而节约内存空间。

  • 例子:这是一个 11行11列的数组,只有2个数不同,其他的数全部是0,这就是一个稀疏数组。

注意:如果把这些数全部保存起来,会用一个二维数组,并且保存 11x11=121 个数。可以把这个数组转换为另一个数组:

行(row)下标 列(col)下标 值(value) 说明
11 11 0 表示11行11列的默认值是0
1 2 1 第2行,第3列的值是1
2 3 2 第3行,第4列的值是2

转换之后:用一个二维数组就可以保存了,这个二维数组只有3个元素(就是值0、1、2),而原来需要121个元素保存。所以转换之后大大的节约了内存资源

1.1.2. 二、代码实现如下:

把一个二维的稀疏数组,压缩为另一个数组。

//保存稀疏数组的值
type ValNode struct {
    row int
    col int
    val int
}

func main() {
    // 原始数组
    var originalArr [11][11]int
    originalArr[1][2] = 1
    originalArr[2][3] = 2


    // 用 []ValNode 作为稀疏数组的元素
    var sparseArr []ValNode
    //创建一个 ValNode 值结点
    valNode := ValNode{
        row : 11,
        col : 11,
        val : 0,
    }
    sparseArr = append(sparseArr, valNode)

    // 给切片增加元素
    for i, v := range originalArr {
        for j, v2 := range v {
            if v2 != 0 {
                valNode := ValNode{ //创建一个 ValNode 值结点
                    row: i,
                    col: j,
                    val: v2,
                }
                sparseArr = append(sparseArr, valNode)
            }
        }
    }

    //输出稀疏数组
    fmt.Println("当前的稀疏数组是:::::")
    for i, valNode := range sparseArr {
        fmt.Printf("%d: %d %d %d\n", i, valNode.row, valNode.col, valNode.val)

    }

}

第一个元素11、11、0的作用:在把稀疏数组转回原始数组时,其他语言(比如java中)可以声明数组的行列大小(java中int arr[][] = new int[3][4])。go语言中没有作用,因为go语言声明数组时必须确定数组大小。

results matching ""

    No results matching ""