基本介绍

所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。

稀疏数组的处理方法:
1. 记录数组一共有几行即列,有多少个不同的值
2. 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

假设有一个9*7的数组,其内容如下:

在此数组中,共有63个空间,但却只使用了5个元素,造成58个元素空间的浪费。以下我们就使用稀疏数组重新来定义这个数组:

其中在稀疏数组中第一部分所记录的是原数组的列数和行数以及元素使用的个数、第二部分所记录的是原数组中元素的位置和内容。

经过压缩之后,原来需要声明大小为63的数组,而使用压缩后,只需要声明大小为6*3的数组,仅需18个存储空间。

package mainimport ("bufio""fmt""log""os""strconv""strings"
)type nodeval struct {row intcol intval interface{}
}func ReadSparseArray(filename string) {file, err := os.OpenFile(filename, os.O_RDONLY, 0666)if err != nil {log.Fatalf("%s", err)}defer file.Close()bfrd := bufio.NewReader(file)var index = 0var arr [][]intfor {line, err := bfrd.ReadBytes('\n')if err != nil {break}index++temp := strings.Split(string(line), " ")row, _ := strconv.Atoi(temp[0])col, _ := strconv.Atoi(temp[1])value, _ := strconv.Atoi(temp[2])if index == 1 {for i := 0; i < row; i++ {var arr_temp []intfor j := 0; j < col; j++ {arr_temp = append(arr_temp, value)}arr = append(arr, arr_temp)}}if index != 1 {arr[row][col] = value}}// 打印数据fmt.Println("从磁盘读取后的数据")for _, v := range arr {for _, v1 := range v {fmt.Printf("%d\t", v1)}fmt.Println()}
}func main() {var chessmap [11][11]intchessmap[1][2] = 1chessmap[2][3] = 2chessmap[2][2] = 1chessmap[3][2] = 2chessmap[4][2] = 1chessmap[4][1] = 2// 查看原始数据for _, v := range chessmap {for _, v1 := range v {fmt.Printf("%d\t", v1)}fmt.Println()}// 转成稀疏数据var sparseArr []nodeval// 数据模型sparseArr = append(sparseArr, nodeval{row: 11,col: 11,val: 0,})//创建稀疏数组for row, val := range chessmap {for col, val1 := range val {if val1 != 0 {sparseArr = append(sparseArr, nodeval{row: row,col: col,val: val1,})}}}//输出稀疏数组fmt.Println("当前的稀疏数组是:")for i, valNode := range sparseArr {fmt.Printf("%d: %d %d %d\n", i, valNode.row, valNode.col, valNode.val)}// 稀疏数组存盘filepath := "SparseArray.txt"file, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {fmt.Printf("open file err=%v\n", err)}defer file.Close()writer := bufio.NewWriter(file)for _, node := range sparseArr {str := fmt.Sprintf("%d %d %d \n", node.row, node.col, node.val)writer.WriteString(str)}writer.Flush()ReadSparseArray(filepath)
}

golang实现稀疏数组(Sparse array)相关推荐

  1. 数据结构与算法--稀松数组(Sparse Array)

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.概述 需要强调的是,稀松数组适用于二维数组中大部分数据具有相同的值的情 ...

  2. 算法与数据结构(稀疏数组)

    稀疏数组 Sparse Array 当一个数组中有大量元素相同时,可以用稀疏数组来表示,通过将有用信息记录在小规模的数组中来缩减程序规模 原数组: [0000102000300000004000000 ...

  3. JavaScript中的稀疏数组与密集数组

    一般而言,javaScript中的数组是稀疏的,也就是说数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.这篇本文解释了如何创建稀疏数组和不稀疏的数组,以及稀疏数组和密集数组之间的区别. ...

  4. golang数据结构与算法——稀疏数组、队列和链表

    文章目录 一 稀疏数组 1.1 先看一个实际的需求 1.2 稀疏数组基本介绍 1.3 稀疏数组举例说明 1.4 把数组转换为稀疏数组实现 1.5 把稀疏数组还原为原数组 二 队列 2.1 队列的介绍 ...

  5. 稀疏数组(golang实现)

    稀疏数组就是数组中大部分的内容都没有被使用(或都为零),在数组中仅有少部分的空间使用,这样造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的 ...

  6. 稀疏数组真心话大冒险

    An adventure in sparse arrays JavaScript 稀疏数组与孔(hole) - 简书 概念 稀疏数组(sparse array) 稀疏数组与密集数组最大的不同,就是稀疏 ...

  7. matlab 稀疏随机矩阵,MATLAB中的稀疏数组

    本文概述 声明普通数组后, MATLAB将为数组中的每个元素创建一个内存位置.例如, 函数a =眼睛(10)将创建100个元素, 这些元素排列为10 x 10结构.在此数组中, 其中90个元素为零! ...

  8. 【月光宝盒get√】用时间置换空间,聊聊稀疏数组的那些事儿

    背景 数据结构是指带有结构特性的数据元素的集合.在数据结构中,数据之间通过一定的组织结构关联在一起,便于计算机存储和使用.从大类划分,数据结构可以分为线性结构和非线性结构,适用于不同的应用场景. 线性 ...

  9. Qz学算法-数据结构篇(稀疏数组、队列)

    目录 1.稀疏(sparse array)数组 需求引入 分析问题 2.队列(queue) 1.数组模拟队列 需求引入 1.1介绍 1.2数组模拟队列 1.3思路分析 1.4代码实现 2.数组模拟环形 ...

最新文章

  1. 把博士男友的论文和资料全删了,然后……
  2. linux——(8)数据流重定向、管道命令
  3. HIbernate的检索方式
  4. rlm sql mysql.so_UBUUTU7.10上安装配置freeradius+mysql+rp-pppoe手记
  5. MATLAB 与 Excel 接口
  6. JavaFX的响应式设计
  7. 理论基础 —— 索引 —— 稠密索引
  8. Selenium with Python 006 - 操作浏览器
  9. 中药和西药的历史渊源,到底谁才是科学好药
  10. 6选择内核启动项_Linux内核都没搞懂,Alot和你还有什么关系?
  11. 数学公式的规约(reduce)和简化(simplify)
  12. C++对象数组的实例学习
  13. docker镜像下载及docker镜像管理
  14. php 进销存 源代码_PHP 进销存源码
  15. 蓝鸽集团云计算机,‎App Store 上的“蓝鸽教育云”
  16. python小白的word转excel
  17. [UESTC878]温泉旅店
  18. banner设计怎么思考
  19. cf 667div3
  20. Spring Cloud(14)——Function

热门文章

  1. Lenet5实现及代码详解——以MINST数据集为例
  2. python将object转换为float_object格式怎样无损转换成float64格式
  3. wxpython表格怎么分页_Word表格跨页断行如何排版?Word表格换页脱节怎么办?
  4. {__ob__: Observer }的解决方式
  5. linux信号11sigtstp,Linux信号(signal)机制
  6. 拼音读数字(难度系数:1颗星)
  7. 数据结构之ElemType
  8. RHEL-7.4-Server系统安装
  9. ada首届_首届资产商店竞赛获胜者访谈
  10. 【机试】2011-2020年复旦大学考研复试机试真题