golang数据结构之golang稀疏数组sparsearray详解

目录
  • 一、稀疏数组
    • 1. 先看一个实际的需求
    • 2. 基本介绍
    • 3. 应用实例

一、稀疏数组

1. 先看一个实际的需求

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

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

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

2. 基本介绍

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

稀疏数组的处理方法是:

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

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

举例:

3. 应用实例

1)使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)

2)把稀疏数组存盘,并且可以重新恢复原来的二维数组数

3)整体思路分析

4)代码实现

package main
import (
	"fmt"
)
type ValNode struct {
	row int
	col int
	val int
}
func main() {
	// 1. 创建一个原始数组
	var chessMap [11][11]int
	chessMap[1][2] = 1 // 1表示黑子
	chessMap[2][3] = 2 // 2表示蓝子

	// 2. 输出看看原始的数组
	for _, v1 := range chessMap {
		for _, v2 := range v1 {
			fmt.Printf("%d\t",v2)
		}
		fmt.Println()
	}
	// 3. 转成稀疏数组
	// 思路:
	// (1)遍历 chessMap,如果我们发现有一个元素的值不为0,我们就创建一个node结构体
	// (2)将其放入到对应的切片即可
	var sparseArr []ValNode

	// 标准的一个稀疏数组应该还有一个 记录元素的二维数组的规模(行和列,默认值)
	// 创建一个ValNode值结点
	valNode := ValNode {
		row: 11,
		col: 11,
		val: 0,
	}
	sparseArr = append(sparseArr,valNode)
	for i1, v1 := range chessMap {
		for i2, v2 := range v1 {
			if v2 != 0 {
				// 创建一个ValNode  值结点
				valNode = ValNode {
					row: i1,
					col: i2,
					val: v2,
				}
				sparseArr = append(sparseArr,valNode)
			}
		}
	}
	// 输出稀疏数组
	fmt.Println("当前的稀疏数组是:::::")
	for i, valNode := range sparseArr {
		fmt.Printf("%d:%d %d %d \n",i,valNode.row,valNode.col,valNode.val)
	}
	// 将这个稀疏数组,存盘 d:/chessmap.data
	// 如果恢复原始的数组
	// 1. 打开这个存盘的文件:d:/chessmap.data => 恢复原始数组
	// 2. 这里使用稀疏数组恢复
	// 先创建一个原始数组
	var chessMap2 [11][11]int
	// 遍历稀疏数组 sparseArr [遍历文件的每一行]
	for index, valNode := range sparseArr {
		if (index == 0) {
			continue
		}
		chessMap2[valNode.row][valNode.col] = valNode.val
	}
	// 看看chessMap2看看是不是恢复了
	for _,value1 := range chessMap2 {
		for _, value2 := range value1 {
			fmt.Printf("%d \t",value2)
		}
		fmt.Println()
	}
}

稀疏数组的作用,对重复量数据大的数据可以使用,减少存储的内容

到此这篇关于golang数据结构之golang稀疏数组sparsearray的文章就介绍到这了,更多相关golang稀疏sparsearray数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用go实现常见的数据结构

    1 golang常见数据结构实现 1.1 链表 举单链表的例子,双向链表同理只是多了pre指针. 定义单链表结构: type LinkNode struct { Data int64 NextNode *LinkNode } 构造链表及打印链表: func main() { node := new(LinkNode) node.Data = 1 node1 := new(LinkNode) node1.Data = 2 node.NextNode = node1 // node1 链接到 nod

  • 浅谈用Go构建不可变的数据结构的方法

    共享状态是比较容易理解和使用的,但是可能产生隐晦以至于很难追踪的 bugs.尤其是在我们的数据结构只有部分是通过引用传递的.切片就是这么一个很好的例子.后续我会作出更加详细的讲解. 在处理经过多级变换或状态的数据时,不可变数据结构是非常有用的.不可变仅意味着原始结构是不可以被改变的,而每一个新的结构副本都是以新的属性值创建. 让我们看个简单的例子: type Person struct { Name string FavoriteColors []string } 显然,我们可以实例化一个Per

  • Golang中数据结构Queue的实现方法详解

    前言 本文主要给大家介绍了关于Golang中数据结构Queue实现的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 需求 队列的特性较为单一,基本操作即初始化.获取大小.添加元素.移除元素等.最重要的特性就是满足先进先出. 实现 接下来还是按照以前的套路,一步一步来分析如何利用Go的语法特性实现Queue这种数据结构. 定义 首先定义每个节点Node结构体,照例Value的值类型可以是任意类型,节点的前后指针域指针类型为node type node struct {

  • 浅析go中的map数据结构字典

    1. map的使用 golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值. 类型表示:map[keyType][valueType] key一定要是可比较的类型(可以理解为支持==的操作),value可以是任意类型. 初始化:map只能使用make来初始化,声明的时候默认为一个为nil的map,此时进行取值,返回的是对应类型的零值(不存在也是返回零值).添加元素无任何意义,还会导致运行时错误.向未初始化的map赋值引起 panic: ass

  • Go语言模型:string的底层数据结构与高效操作详解

    Golang的string类型底层数据结构简单,本质也是一个结构体实例,且是const不可变. string的底层数据结构 通过下面一个例子来看: package main import ( "fmt" "unsafe" ) // from: string.go 在GoLand IDE中双击shift快速找到 type stringStruct struct { array unsafe.Pointer // 指向一个 [len]byte 的数组 length in

  • golang数据结构之golang稀疏数组sparsearray详解

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

  • java数据结构算法稀疏数组示例详解

    目录 一.什么是稀疏数组 二.场景用法 1.二维数组转稀疏数组思路 2.稀疏数组转二维数组思路 3.代码实现 一.什么是稀疏数组 当一个数组a中大部分元素为0,或者为同一个值,那么可以用稀疏数组b来保存数组a. 首先,稀疏数组是一个数组,然后以一种特定的方式来保存上述的数组a,具体处理方法: 记录数组a一共有几行几列 记录a中有多少个不同的值 最后记录不同值的元素所在行列,以及具体的值,放在一个小规模的数组里,以缩小程序的规模. 这个小规模的数组,就是稀疏数组. 举个栗子,左侧是一个二维数组,一

  • Java数据结构实现二维数组与稀疏数组转换详解

    基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: ①记录数组一共有几行几列,有多少个不同的值(0除外). ②把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模. 二维数组转稀疏数组: ①遍历原始的二维数组,得到有效数据的个数 sum(除0外不同值) ②根据 sum 创建稀疏数组 sparseArr int[sum+1][3] ③将二维数组的有效数据数据存入到稀疏数组 (稀疏数组的第一行,三列分别记录二维数组

  • Golang实现AES对称加密的过程详解

    AES加密 AES对称加密简介 AES是一个对称密码,旨在取代DES成为广泛使用的标准.是美国联邦政府采用的一种区块加密标准. AES对称加密过程 加密解密算法的输入是一个128位分组.这些分组被描述成4×4的字节方阵,这个分组被复制到数组中,并在加密和解密的每一阶段都被修改.在字节方阵中,每一格都是一个字,包含了4字节.在矩阵中字是按列排序的. 加密由N轮构成,轮数依赖于密钥长度:16字节密钥对应10轮,24字节密钥对应12轮,32字节对应14轮. AES加密模式 1.电码本模式(Electr

  • Golang配置解析神器go viper使用详解

    目录 前言 viper简介 功能 viper配置优先级 安装viper 支持哪些文件格式 key大小写问题 使用指南 如何访问viper的功能 配置默认值 读取配置文件 写配置文件 WriteConfig SafeWriteConfig WriteConfigAs SafeWriteConfigAs 监听配置文件 从io.Reader读取配置 显示设置配置项 注册和使用别名 读取环境变量 与命令行参数搭配使用 pflag 扩展其他flag 远程key/value存储支持 访问配置 直接访问 序列

  • Golang基础教程之字符串string实例详解

    目录 1. string的定义 2.string不可变 3.使用string给另一个string赋值 4.string重新赋值 补充:字符串拼接 总结 1. string的定义 Golang中的string的定义在reflect包下的value.go中,定义如下: StringHeader 是字符串的运行时表示,其中包含了两个字段,分别是指向数据数组的指针和数组的长度. // StringHeader is the runtime representation of a string. // I

  • Golang 实现 RTP音视频传输示例详解

    目录 引言 RTP 数据包头部字段 Golang 的相关实现 结尾 引言 在 Coding 之前我们先来简单介绍一下 RTP(Real-time Transport Protocol), 正如它的名字所说,用于互联网的实时传输协议,通过 IP 网络传输音频和视频的网络协议. 由音视频传输工作小组开发,1996 年首次发布,并提出了以下使用设想. 简单的多播音频会议 使用 IP 的多播服务进行语音通信.通过某种分配机制,获取多播组地址和端口对.一个端口用于音频数据的,另一个用于控制(RTCP)包,

  • Golang 中的 unsafe.Pointer 和 uintptr详解

    目录 前言 uintptr unsafe.Pointer 使用姿势 常规类型互转 Pointer => uintptr 指针算数计算:Pointer => uintptr => Pointer reflect 包中从 uintptr => Ptr 实战案例 string vs []byte sync.Pool 前言 日常开发中经常看到大佬们用各种 unsafe.Pointer, uintptr 搞各种花活,作为小白一看到 unsafe 就发憷,不了解二者的区别和场景,自然心里没数.

  • Golang控制协程执行顺序方法详解

    目录 循环控制 通道控制 互斥锁 async.Mutex 在 Go 里面的协程执行实际上默认是没有严格的先后顺序的.由于 Go 语言 GPM 模型的设计理念,真正执行实际工作的实际上是 GPM 中的 M(machine) 执行器,而我们的协程任务 G(goroutine) 协程需要被 P(produce) 关联到某个 M 上才能被执行.而每一个 P 都有一个私有队列,除此之外所有的 P 还共用一个公共队列.因此当我们创建了一个协程之后,并不是立即执行,而是进入队列等待被分配,且不同队列之间没有顺

  • Golang拾遗之实现一个不可复制类型详解

    目录 如何复制一个对象 为什么要禁止复制 运行时检测实现禁止复制 初步尝试 更好的实现 性能 优点和缺点 静态检测实现禁止复制 利用Locker接口不可复制实现静态检测 优点和缺点 更进一步 利用package和interface进行封装 优点和缺点 总结 如何复制一个对象 不考虑IDE提供的代码分析和go vet之类的静态分析工具,golang里几乎所有的类型都能被复制. // 基本标量类型和指针 var i int = 1 iCopy := i str := "string" st

随机推荐