go_稀疏数组

1、稀疏数组(sparsearray)

1.1 先看一个实际的需求

  • 编写的五子棋程序中,有存盘退出和续上盘的的功能

  • 分析按照原始的方式来的二维数组的问题

    因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据

1.2 基本介绍

​ 当一个数据中大部分数据为0,或者为同一个值的数组时,可以使用稀疏数组来保存数组

稀疏数组的处理方法:

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

​ 2、思想:把具有不同值得元素的行里及值记录在一个小规模的数组中,从而缩小程序的规模

1.3 稀疏数组举例说明

1.4 应用示例

  1. 使用稀疏数组来保留类似前面的二维数组(棋盘、地图等)
  2. 把稀疏数组存盘,并且可以重新恢复原来的二维数组
  3. 整体思路分析
  4. 代码实现
package main

import (
	"fmt"
)

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、放在对应的切片
	type ValNode struct {
		row int
		col int
		val int
	}

	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)
			}
			fmt.Printf("%d\t",v2)
		}
		fmt.Println()
	}

	//把稀疏数组写在文件
	//filePath :="./sparseArr.data"
	//file,err := os.OpenFile(filePath,os.O_WRONLY | os.O_CREATE,0666)
	//if err !=nil{
	//	fmt.Printf("open file err=%v\n",err)
	//	return
	//}
	//defer file.Close()
	//writer := bufio.NewWriter(file)
	//writer.WriteString(string(src))
	//writer.Flush()

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

	//恢复原始的数组
	//1、先创建一个原始的数组
	var chessMap2 [11][11]int
	//遍历sparseArr
	for i,valNode2 := range sparseArr{
		if i !=0{
			chessMap2[valNode2.row][valNode2.col]=valNode2.val
		}
	}

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

参考网站:https://www.bilibili.com/video/BV114411D768

posted @ 2021-03-05 09:31  天下医者不自医  阅读(30)  评论(0编辑  收藏  举报