GO数据结构(一)——稀疏数组

简介: GO数据结构(一)——稀疏数组

1. 稀疏数组

稀疏数组(sparsearray)

基本介绍: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

本质上就是压缩数组。

稀疏数组的处理方法:

 1. 记录数组一共有几行几列,有多少个不同的值。

 2. 把具有不同值的元素的行列以及值,记录在一个小规模的数组中,从而缩小程序的规模。

1.1 实际问题(棋盘)

如下面的二维数组,我们可以假设成是一个棋盘,1代表白子,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

1.1.1 存盘

func writeSparse()  {
  // 定义一个结构体,用来存放稀疏矩阵的值
  type ValNode struct{
    row int   // 所在行
    col int   // 所在列
    val int   // 值
  }
  // 定义一个二维数组——棋盘
  // 其他都为0
  var chessMap [11][11]int
  chessMap[1][2] = 1
  chessMap[2][3] = 2
  // 定义一个切片
  var sparseArr []ValNode
  // 11行 11列 默认值为0
  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{
          row: i,
          col: j,
          val: v2,
        }
        sparseArr =append(sparseArr,valNode)
      }
    }
  }
  // 存到文件中 便于续盘
  filePath := "./数据结构/sparseArr.txt"
  file, err := os.OpenFile(filePath,os.O_WRONLY|os.O_CREATE,0666)
  // 第一个数字代表u(拥有者)权限,
  // 第二个数字代表g(群组)权限,
  // 第三个数字代表o(其他人)权限
  // 每一个数字都是通过4(表示r),2(表示w),1(表示x)三个数字相加得到的
  // rwx 对应4,2,1
  // 那么只读的权限用4表示[r--],
  // 读写用6(4+2)表示[rw-],
  // 读写加执行用7(4+2+1)表示[rwx]。
  if err != nil{
    fmt.Println("os.OpenFile err:",err)
    return
  }
  // 最终 关闭流
  defer file.Close()
  // 创建写缓冲区
  writer := bufio.NewWriter(file)
  // 取出棋子
  for _, valNode:=range sparseArr{
    str:=fmt.Sprint(valNode.row,valNode.col,valNode.val)
    // 写到缓存区中
    _, err := writer.WriteString(str+"\n")
    if err != nil{
      fmt.Println("writer.WriteString(str) err:",err)
      return
    }
  }
  // 刷新数据, 将缓冲区数据写入io writer
  writer.Flush()
}

1.1.2 续盘

func readSparse()  {
  type ValNode struct {
    row int
    col int
    val int
  }
  var sparseArr []ValNode
  filePath := "./数据结构/sparseArr.txt"
  file, err := os.Open(filePath)
  if err != nil {
    fmt.Println("os.Open(filePath) err:", err)
    return
  }
  defer file.Close()
  // 创建读缓冲区
  reader := bufio.NewReader(file)
  // 读取信息
  for{
    // 读取delim之前的所有string数据
    str,err := reader.ReadString('\n')
    if err==io.EOF {  // io.EOF代表文件的末尾
      break
    }
    fmt.Println(str)
    // 返回将字符串按照空白
    //(unicode.IsSpace确定, 可以是一到多个连续的空白字符)
    // 分割的多个字符串。
    // 如果字符串全部是空白或者是空字符串的话,会返回空切片。
    arr := strings.Fields(str)
    valNode := ValNode{}
    for i, _ := range arr {
      in,err := strconv.Atoi(arr[i])
      if err != nil {
        return
      }
      // arr 中 第一个位置是row 第二个位置是col 第三个位置是val
      switch i {
      case 0:
        valNode.row = in
      case 1:
        valNode.col = in
      case 2:
        valNode.val = in
      }
    }
    sparseArr = append(sparseArr,valNode)
  }
  // 棋盘
  var chessMap [][]int
  //var chessMap [11][11]int
  for i, v := range sparseArr {
    if i == 0 {
      for a := 0; a < v.row; a++ {
        mm := make([]int, v.col)
        chessMap = append(chessMap, mm)
      }
    } else {
      chessMap[v.row][v.col] = v.val
    }
  }
  fmt.Println(chessMap)
}
相关文章
|
2月前
|
存储 Java 程序员
数据结构之 - 深入了解数组数据结构
数据结构之 - 深入了解数组数据结构
42 6
|
7天前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
20 7
|
2月前
|
存储 前端开发 Go
Go语言中的数组
在 Go 语言中,数组是一种固定长度的、相同类型元素的序列。数组声明时长度已确定,不可改变,支持多种初始化方式,如使用 `var` 关键字、短变量声明、省略号 `...` 推断长度等。数组内存布局连续,可通过索引高效访问。遍历数组常用 `for` 循环和 `range` 关键字。
|
2月前
|
存储 Go 容器
深入探究Go语言中的数据结构
深入探究Go语言中的数据结构
45 3
|
6天前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
89 67
|
2月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
112 64
|
20天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
43 4
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
40 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
1月前
|
Java Go 数据处理
go语言使用切片而非数组
【10月更文挑战第18天】
14 1
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
25 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列