前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GO数据结构(一)——稀疏数组

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

作者头像
传说之下的花儿
发布2023-04-16 14:59:12
1820
发布2023-04-16 14:59:12
举报

1. 稀疏数组

稀疏数组(sparsearray) 基本介绍: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 本质上就是压缩数组。 稀疏数组的处理方法:  1. 记录数组一共有几行几列,有多少个不同的值。  2. 把具有不同值的元素的行列以及值,记录在一个小规模的数组中,从而缩小程序的规模。

1.1 实际问题(棋盘)

如下面的二维数组,我们可以假设成是一个棋盘,1代表白子,2代表黑子,现在我们要对其进行存盘以及续盘的操作,如果我们将整个数组都存起来,势必会造成内存的浪费,那么我们可以考虑使用稀疏数组来解决这个问题。

代码语言:javascript
复制
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 存盘

代码语言:javascript
复制
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 续盘

代码语言:javascript
复制
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)
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 稀疏数组
    • 1.1 实际问题(棋盘)
      • 1.1.1 存盘
      • 1.1.2 续盘
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档