稀疏数组(Golang版本)

稀疏数组

基本介绍

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

稀疏数组的处理方法:

  • 记录数组一共有几行几列,有多少个不同的数值;
  • 把具有不同值的元素的行数列数及值记录在一个小规模的数组中,从而缩小程序规模。

实际问题

如下面的二维数组,我们可以假设成是一个棋盘,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 
Golang版本
  • 存盘
func writeSparse() {
    
    // 定义一个结构体,用来存放稀疏矩阵的值
	type ValNode struct{
		row int
		col int
		val int
	}

	//  定义一个二维数组
	var chessMap [11][11]int
	chessMap[1][2] = 1
	chessMap[2][3] = 2

    // 定义一个切片
	var sparseArr []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{
					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)
	if err != nil{
		fmt.Println("os.OpenFile err:",err)
		return
	}

	defer file.Close()

	writer := bufio.NewWriter(file)

	for _, valNode:=range sparseArr{
		//fmt.Println(valNode.row,valNode.col,valNode.val)
		str:=fmt.Sprint(valNode.row,valNode.col,valNode.val)
		_, err := writer.WriteString(str+"
")
		if err != nil{
			fmt.Println("writer.WriteString(str) err:",err)
			return
		}
	}
	writer.Flush()
}

  • 续盘
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 {
		str, err := reader.ReadString('
')
		if err == io.EOF { // io.EOF表示文件的末尾
			break
		}
		fmt.Println(str)
		arr := strings.Fields(str)
		valNode := ValNode{}
		for i, _ := range arr {
			in, err := strconv.Atoi(arr[i])
			if err != nil {
				return
			}
			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)
}
原文地址:https://www.cnblogs.com/huiyichanmian/p/13786962.html