稀疏数组(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+"\n")
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('\n')
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)
}
稀疏数组(Golang版本)的更多相关文章
- golang数据结构之稀疏数组
掌握知识: 数组的初始化和赋值 结构体的初始化和赋值 字符串和整型之间的转换以及其它的一些操作 类型断言 读取文件 写入文件 对稀疏数组进行压缩 package main import ( " ...
- 02稀疏数组(java版本)
1 package com.aixuexi.contact; 2 3 public class SpareArray { 4 public static void main(String[] args ...
- java算法--稀疏数组
数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...
- new Array(n) 的坑 密集数组和稀疏数组
今天写Vue时遇到一个奇怪问题,需要监控网页上的input 是否都有值 // var blanks = new Array(number); // blanks的监控属性 var emptyNumbe ...
- javascript中的稀疏数组(sparse array)和密集数组
学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...
- SparseArray HashMap 稀疏数组 二分法
简介 HashMap是java里比较常用的一个集合类,我们常用其来缓存一些处理后的结果,但是在Android项目中,Eclipse却给出了一个 performance 警告.意思就是说用SparseA ...
- [undefined,1] 和 [,1]的区别在哪里--认识js中的稀疏数组
事情是这样的 今天我想写一个能快速生成一个自然数数组的函数,就是[0,1,2,3]这样的,然后我写了下面的代码: new Array(10).map((item, index) => { ret ...
- 读lodash源码之从slice看稀疏数组与密集数组
卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...
- js中的稀疏数组和密集数组
原文地址: http://www.2ality.com/2012/06/dense-arrays.html 一般来说JavaScript中的数组都是稀疏的,也就是说数组中的元素与元素之间是由空格的,因 ...
- 理解JS里的稀疏数组与密集数组
一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...
随机推荐
- Web前端入门第 6 问:HTML 的基础语法结构
HTML的全称为超文本标记语言(HyperText Markup Language),基础语法结构由标签.元素.属性和内容组成,遵循层级嵌套的树形结构. 关键语法规则 标签(Tags) 双标签语法 标 ...
- 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
效果 来具体介绍之前先来看看效果. 使用C#构建了一个简单的MCP客户端,以下为运行这个简单客户端的截图,同样可以在Cline等其它的一些MCP客户端中玩耍. 创建一个数据库表: 获取数据库中的所有表 ...
- [python]pip换源详解
[python]pip换源详解 前言 现有的各个网站上的pip换源方式,很零散,或者是很单调的重复,又或者只是给出命令,尽管这通常就够用了. 但是,我希望汇总一下,然后再结合pip的官方文档来做一 ...
- C#语言碎片:Switch-Case语句字符串匹配
Switch case语句在处理字符串类型匹配时候,case条件需要设置为静态常量或者一个具体的字符串: 因为工具类ToolHand.Name 为变量,所以编译不通过. 使用if语句来逐个判断: 看A ...
- 前后端不分离中使用 Ajax 请求(Django3.2)
博客地址:https://www.cnblogs.com/zylyehuo/ view.py def get_tokens(request): token = get_token(request) r ...
- pg获取tree完整的数据
一个表: DRGCode DRGParend DRGName 这样一个tree表结构. 任意查询string,希望得到一个查询完整的tree.怎么做? SELECT * FROM "DRG& ...
- 帮客户解决基于surging的物流速运网关内存泄漏问题
一.概述 有surging企业客户找到我,系统已经在线上环境运行,在使用过程中碰到内存不能释放的问题,每次都要和客户打招呼进行重启造成很坏的影响,问能不能彻底解决掉,然后我打包票可以解决,解决不了不收 ...
- Unity资源打包之Asset Bundle
Asset Bundle的作用: 1.AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载: 2.AssetBundle自身保存着互相的依赖关系: ...
- C 冒泡排序和选择排序
冒泡排序 理论概念: 从第一个数开始,将相邻的两个数比较,第一个数和第二个数比较,比如说是从小到大的排序,要是后面的数比前面的小则交换两个的位置,这样第一轮比较基数后最大的数就到了最后面,接着进行第二 ...
- Scrcpy使用入门
1.下载Scrcpy GitHub地址:https://github.com/Genymobile/scrcpy 网盘地址:https://pan.baidu.com/s/1NKosSkQJLbmhz ...