稀疏数组

基本介绍

当一个数组中大部分元素为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版本)的更多相关文章

  1. golang数据结构之稀疏数组

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

  2. 02稀疏数组(java版本)

    1 package com.aixuexi.contact; 2 3 public class SpareArray { 4 public static void main(String[] args ...

  3. java算法--稀疏数组

    数据结构必要知识 线性结构 线性结构是最常用的数据结构,数据元素之间存在一对一的线性关系. 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是 ...

  4. new Array(n) 的坑 密集数组和稀疏数组

    今天写Vue时遇到一个奇怪问题,需要监控网页上的input 是否都有值 // var blanks = new Array(number); // blanks的监控属性 var emptyNumbe ...

  5. javascript中的稀疏数组(sparse array)和密集数组

    学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...

  6. SparseArray HashMap 稀疏数组 二分法

    简介 HashMap是java里比较常用的一个集合类,我们常用其来缓存一些处理后的结果,但是在Android项目中,Eclipse却给出了一个 performance 警告.意思就是说用SparseA ...

  7. [undefined,1] 和 [,1]的区别在哪里--认识js中的稀疏数组

    事情是这样的 今天我想写一个能快速生成一个自然数数组的函数,就是[0,1,2,3]这样的,然后我写了下面的代码: new Array(10).map((item, index) => { ret ...

  8. 读lodash源码之从slice看稀疏数组与密集数组

    卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...

  9. js中的稀疏数组和密集数组

    原文地址: http://www.2ality.com/2012/06/dense-arrays.html 一般来说JavaScript中的数组都是稀疏的,也就是说数组中的元素与元素之间是由空格的,因 ...

  10. 理解JS里的稀疏数组与密集数组

    一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...

随机推荐

  1. 编写你的第一个 Django 应用程序,第7部分

    本教程从教程 6 停止的地方开始.我们将继续使用网络投票应用程序,并将专注于自定义 Django 自动生成的管理站点,这是我们在教程 2 中首次探索的. 一.自定义管理表单 通过用 admin.sit ...

  2. Linux运维必备:sort 命令快速上手指南

    作为运维工程师,处理日志.分析数据是家常便饭.sort命令是Linux中高效整理文本的神器,能快速对文件内容排序.去重.统计.本文用最简洁的方式,帮你掌握sort的核心用法. 一.基础排序:秒杀杂乱文 ...

  3. oracle修改用户密码的方法

    Oracle用户名及默认密码 修改oracle用户的密码有以下方法: 普通用户 (1)通过alter user语法来进行修改 ,这也是最常见的方式: (2) 第二种方式,是通过password命令来修 ...

  4. 基于DotNetty实现自动发布 - 背景篇

    故事背景 小公司,单体项目,接口和页面都在一起,生产和测试环境都是 Windows 服务器和 IIS, 本地编译完成,把相关的页面和程序集拷贝到服务器上,尤其是涉及到多个页面,一个个页面找到对应的位置 ...

  5. Windows Terminal 添加 git-bash

    配置文件中 profiles 节点补充配置 { "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b7}", " ...

  6. 卸载重装vscode

    最近工作需要长期用到python,但我的老电脑又实在拉不起pycharm那配置,干脆就用vscode了,但本来我的vscode是用来写c/c++的,安装配置一通乱搞,现在也不知道怎么配置回来了. 干脆 ...

  7. python爬虫(BeautifulSoup)爬取B站视频字幕

    比如"https://www.bilibili.com/video/BV1zU4y1p7L3"这个视频,有1.2万条弹幕 首先,B站视频的弹幕是有专门的接口传递数据的:http:/ ...

  8. DPDI(Dispatch PDI)kettle调度管理平台环境部署升级

    1.DPDI演示环境 DPDI online登录域名:http://dpdi.pizzalord.site 用户名:dpdi 密 码:dpdi 2.DPDI下载 DPDI online部署包下载地址: ...

  9. 关于用nw(node-webkit)开发windows桌面软件遇到的问题,包括nw项目打包、win10 C盘读写文件没权限等问题的解决方法

    原文: 关于用nw(node-webkit)开发windows桌面软件遇到的问题,包括nw项目打包.win10 C盘读写文件没权限等问题的解决方法 - 搜栈网 (seekstack.cn)https: ...

  10. PHP 实现微信异步回调数据打印知识分享

    一.引言 在微信支付.微信公众号消息推送等场景中,微信服务器会通过异步回调的方式将处理结果发送给我们的服务器.为了便于调试和监控,我们需要获取并打印这些回调数据.本文将详细介绍如何使用 PHP 的 f ...