go_稀疏数组
1、稀疏数组(sparsearray)
1.1 先看一个实际的需求
- 
编写的五子棋程序中,有存盘退出和续上盘的的功能 
 ![]() 
- 
分析按照原始的方式来的二维数组的问题 因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据 
1.2 基本介绍
 当一个数据中大部分数据为0,或者为同一个值的数组时,可以使用稀疏数组来保存数组
稀疏数组的处理方法:
 1、记录数组一共有几行几列,有多少个不同的值
 2、思想:把具有不同值得元素的行里及值记录在一个小规模的数组中,从而缩小程序的规模
1.3 稀疏数组举例说明

1.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()
	}
}
 
                    
                     
                    
                 
                    
                
 

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号