golang数据结构之稀疏数组

掌握知识:

  • 数组的初始化和赋值
  • 结构体的初始化和赋值
  • 字符串和整型之间的转换以及其它的一些操作
  • 类型断言
  • 读取文件
  • 写入文件
  • 对稀疏数组进行压缩
package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strconv"
    "strings"
    // "strconv"
)

func originArr() [11][11]int {
    //创建原始数组
    var chessMap [11][11]int

    chessMap[1][2] = 1
    chessMap[2][3] = 2
    return chessMap
}

func printArr(chessMap [11][11]int) {
    //打印数组
    for _, v1 := range chessMap {
        for _, v2 := range v1 {
            fmt.Printf("%d\t", v2)
        }
        fmt.Println()
    }
}

//存储行、列、值
type valNode struct {
    row   int
    col   int
    //这里是接口类型,所以值可以是任意类型,不仅仅包含整型和字符型
    value interface{}
}

var sparseArr []valNode

func doParseArr(chessMap [11][11]int) []valNode {
    //稀疏数组
    //遍历数组,如果某个值不为零,则将其放置在对应的结构体中
    val := valNode{
        //原来数组的行和列以及值
        row:   11,
        col:   11,
        value: 0,
    }
    //初始化存储稀疏数组
    sparseArr = append(sparseArr, val)

    for i, v1 := range chessMap {
        for j, v2 := range v1 {
            if v2 != 0 {
                var val valNode
                val.row = i
                val.col = j
                val.value = v2
                sparseArr = append(sparseArr, val)
            }
        }
    }

    for _, j := range sparseArr {
        fmt.Printf("第%d行,第%d列的值是%d\n", j.row, j.col, j.value.(int))

    }
    return sparseArr
}

func writeParseArr(sparseArr []valNode, filepath string) {
    //将稀疏数组存储
    file, err := os.OpenFile(filepath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
    if err != nil {
        return
    }
    defer file.Close()
    for _, j := range sparseArr {
        //因为读取到的整型,需要转为字符串再进行写入
        //将接口赋值给一个变量需要进行类型断言
        str := strconv.Itoa(j.row) + " " + strconv.Itoa(j.col) + " " + strconv.Itoa((j.value.(int))) + "\n"
        wriiter := bufio.NewWriter(file)
        wriiter.WriteString(str)
        wriiter.Flush()
        // fmt.Printf("第%d行,第%d列的值是%d\n", j.row, j.col, j.value.(int))

    }
}

func readParseArr(filepath string) (newChessMap [11][11]int) {
    //初始化数组
    //读取存储的文件,并将每行转成
    file, err := os.OpenFile(filepath, os.O_RDONLY, 0666)
    if err != nil {
        return
    }
    defer file.Close()
    reader := bufio.NewReader(file)
    for {
        str, err := reader.ReadString(‘\n‘)
        if err != nil {
            return
        }
        tmp := strings.Split(strings.TrimRight(str, "\n"), " ")
        // fmt.Println(strings.Split(strings.TrimRight(str, "\n"), " "))
        r, _ := strconv.Atoi(tmp[0])
        c, _ := strconv.Atoi(tmp[1])
        v, _ := strconv.Atoi(tmp[2])
        if r == 11 {
            continue
        }
        newChessMap[r][c] = v
        if err == io.EOF {
            break
        }
    }
    return newChessMap
}

func main() {
    chessMap := originArr()
    printArr(chessMap)
    sparseArr := doParseArr(chessMap)
    filepath := "data.txt"
    writeParseArr(sparseArr, filepath)
    newChessMap := readParseArr(filepath)
    printArr(newChessMap)
}

data.txt

原文地址:https://www.cnblogs.com/xiximayou/p/12002686.html

时间: 2024-08-29 10:21:51

golang数据结构之稀疏数组的相关文章

重学数据结构 --- 分类+稀疏数组

一.数据结构的分类 1. 数据结构两大类 线性结构和非线性结构 1) 线性结构 线性结构是最常见的数据结构,特点是元素间存在一对一的线性关系. 线性结构又分两种,一种是顺序存储(称为顺序表),另外一种是链式存储(称为链表).顺序表中的存储元素的连续的.链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息. 常见的线性结构有:数组.队列.链表和栈(这里只是讲个大概,具体内容后面的文章会展开阐述). 2) 非线性结构 非线性结构就是结点元素可能存在多个直接前趋和多个直接后续(

数据结构与算法—稀疏数组和队列

目录 稀疏数组和队列 1.稀疏数组 1.1 解决方法 1.2 代码实现 2. 队列 2.1 数组模拟队列 2.2 数组模拟环形队列 稀疏数组和队列 1.稀疏数组 所谓稀疏数组就是当数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用.因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以使用稀疏数组去压缩数据.OK,如果你不明白,那我们来看一个例子. ? 在一个五子棋中,有存盘和续上盘的功能 分析问题:因为该二维数组的很多默认值是 0,因此记录了很多

数据结构与算法之java语言实现(一):稀疏数组

一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白,我们来用图来演示一下: 如图模拟为一个五子棋棋盘,其中1代表黑子,2代表白子(蓝子),我们在将其存入磁盘中,如果只是单纯的用文件io的方式将此二维数组存入磁盘,必然会造成磁盘空间的大大浪费,这时候就需要我们的稀疏数组出场了,咱们先看一下他是什么样子:   行(row) 列(col) 值(value) [0]

JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度. 2.处理方式 1).记录数组一共有几行几列,有多少个不同的值 2).把具有不同值的元素的行列及值记录在稀疏数组中,可以缩小程序代码的复杂度. 3.图解描述 稀疏数组表示 [0] 3 4 4 二维数组,3行,4列,4个非0的值: [1] 1 2 2 一行

数据结构之二维数组与稀疏数组的转换

1.二维数组 二维数据其实就是高数中的矩阵,在此不做过多的解释 2.稀疏数组 当一个二维数组中大多值为0,或者相同时,我们可以考虑用到稀疏数组,来减少内存 稀疏数组的处理方法: 1)一个有3列的二维数组,记录原数组有几行几列,多少个不同的值 2)不同值的元素的所在行以及列记录在稀疏数组中,从而缩小规模 3.例子如下: 4.下面是稀疏数组以及二维数组之间的转换 package com.ebiz.array; /** * @author YHj * @create 2019-07-13 16:46

Java数据结构预算法之稀疏数组

Java稀疏数组 定义 稀疏数组:数组中的大部分元素值都没有使用(或者都为0),在数组中仅有少部分的空间使用,造成了内存空间的浪费. 使用新的压缩的方式表示原来数组的方式为稀疏数组. 为什么要使用稀疏数组? 为了节省内存空间. 稀疏数组实现原理 引入应用场景 开发人员需要开发一个五子棋的游戏,为了实现存档.悔棋和判断棋局胜负,需要对这些棋子的位置进行存储,由于棋盘是一个矩形的,所以可以使用二维数组. 但是想象下棋过程,我们可能会给许多没有使用的位置分配内存(即数组中大部分数据是0或者为同一个值)

数据结构 二维数组-->稀疏数组-->二维数组

稀疏数组基本概念: 稀疏数组应用场景: 当一个数组大部分的元素为"0",或者为同一个值的数组时,可以使用稀疏数组来保存该数组 处理方法: 1>记录数组一共有几行几列,有多少不同的值 2>把具有不同值的元素行列及值记录在一个小规模数组中,从而缩小程序规模 row col val [0]   总行       总列 有效数量 [1]  第一个数据行  第一个数据列 第一个数据值 [2]  第二个数据行 第二个数据列 第二个数据值 二维数组==>稀疏数组思路: 1>遍

数据结构与算法学习之(稀疏数组)

稀疏数组 实际需求 二维数组很多值为0,记录了很多没有意义的数据,故引出稀疏数组 基本介绍 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存数组 稀疏数组的处理方法: 记录数组一共有几行几列,有多少个不同的值 把具有不同的元素的行列及值记录在一个小规模的数组中,从而缩小规模 二维数组转稀疏数组思路 遍历原始二维数组,得到有效的数据个数sum 根据sum就可以创建稀疏数组sparseArr intsum - 1 将二维数组的有效数据存入到稀疏数组 稀疏数组转二维数组的思路

JAVA数据结构与算法-稀疏数组

实际需求 分析问题 因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组. 1.基本介绍 当一个数据中大部分元素为0,或者同一个值的数组时,可以使用稀疏数组来保存该数组稀疏数组处理方法 1.记录数组一共有几行几列,有多少不同的值 2.把具有不同的值的元素的行列及值记录在一个小规模的数组中,从而去缩小程序规模 稀疏数组说明 2.应用实例 使用稀疏数组,来保留类似前面的二维数组(棋盘.地图等等) 把稀疏数组存盘,并且可以从新恢复原来的二维数组数 整体思路分析 3.加了比较多