zoukankan      html  css  js  c++  java
  • 稀疏数组(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)
    }
    
  • 相关阅读:
    Git 开发、合并、提交的一些常见命令语句
    selenium自动化过程中窗口句柄的问题
    git 忽略文件夹下面的文件,但是保留空文件夹
    python接口测试中不同的请求方式
    python接口测试中发送请求中的一些参数
    python接口测试中的session运用
    接口测试数据依赖处理
    pygame的安装
    Bottstrap的基本用法
    前端CSS
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/13786962.html
Copyright © 2011-2022 走看看