数据结构一:golang 稀疏数组

学习笔记,文档参考:韩顺平老师.

什么是稀疏数组?

在一个数组中,当大部分的内容都是一样的值,或者都为0时,在数组中紧有少部分的值在使用,例如:五子棋盘这样的场景, 如果我们将所有的行列值都保存下来时,会对内存资源造成严重的浪费,为了节省内存空间,并且不影响数组中原来的内容,我们可以压缩后保存,这就是稀疏数组。


使用稀疏数组的规范和思路?

以五子棋的棋盘为例子,大体思路分为:

  1. 先要记录这个棋盘一共存在多少行,多少列,默认值是什么
    2.把不同于默认值的行列值记录,保存在一个小规模的数组中。


代码示范:

## 如何用go实现:



package main

import "fmt"

// 数据结构
// 使用稀疏数组来保存期盼
// 存盘
// 恢复

type Node struct {
    row int // 行
    col int // 列
    val int // 值
}

func main() {

    // 1. 创建一个原属数组 1代表黑棋 2代表蓝期
    var chessMap [11][11]int
    chessMap[1][2] = 1
    chessMap[2][3] = 2

    // out fmt
    //for _, v := range chessMap {
    //  for _, v2 := range v {
    //      fmt.Printf("%d\t", v2)
    //  }
    //  fmt.Println()
    //}

    // 3.转换成稀疏数组, go用结构体保存比较好,
    // 思路--> 1.遍历chessMap,如果我们发现,有一个元素的值不等于0,我们就创建一个node结构体
    //        2.将其放置到对应的切片中

    var sparseArr []Node

    // 标准的一个稀疏数组,应该含有 行列的总值,和默认值 (有多少行,有多少列,他的默认值是什么)
    valNode := Node{
        row: 11,
        col: 11,
        val: 0,
    }
    sparseArr = append(sparseArr, valNode)

    for i, v := range chessMap {
        for j, v2 := range v {
            // 如果这个值不为0,需要记录
            if v2 != 0 {
                // 创建一个节点(值节点)
                valNode := Node{
                    row: i,
                    col: j,
                    val: v2,
                }
                // 将这个值放到稀疏数组
                sparseArr = append(sparseArr, valNode)
            }
        }
    }

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

    // 如何恢复呢?将稀疏数组恢复为二纬数组.
    // 先创建一个原始数组,
    var chessMap2 [11][11]int

    for i, v := range sparseArr {
        if i == 0 {
            continue
        }
        chessMap2[v.row][v.col] = v.val
    }

    // 验证是否恢复👌
    fmt.Println("恢复过后的原始数据为:")
    for _, v := range chessMap2 {
        for _, v2 := range v {
            fmt.Printf("%d\t", v2)
        }
        fmt.Println()
    }
}




©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容