当前位置: 首页 > news >正文

Go 稀疏数组学习与实现

仍然还是一个数组

基本介绍

一般就是指二维以上的数组
当一个数组中大部分元素是0 ,或者为同一个值的数组时,可以使用系数数组来保存该数组.

稀疏数组的处理方法:

  • 记录数组一共有几行几列,有多少个不同的值
  • 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SlBq9xxF-1677594413402)(…/…/images/Pasted%20image%2020230228201055.png)]
这就是一个六行七列的二维数组.
所以用一个n行三类的二维数组来记录这个数组
第一列是行数, 第二列是列数, 第三列是值
6 7 0
0 3 22
0 6 15

5 2 28

这里的6 7 0 记录的是这个二维数组有6 行7 列 的0 值
其余行记录不一样的值的位置

这是一种压缩
但是我们可以发现,一个数值会多出两个值(行列)来表示,所以如果有值的数,大于了原来数组的1/3 就得不偿失了

代码实现

一个二维数组转换成稀疏数组

package main  //稀疏数组  type ValueNode struct {  row int  col int  Val int  
}  func main() {  // 创建一个原始的数组  var chessMap [11][11]int  chessMap[1][2] = 1  chessMap[2][3] = 2  // 1 代表黑子  //2 代表白子  //输出原始数组  for _, item1 := range chessMap {  for _, item2 := range item1 {  print(item2)  }  println()  }  // 转换成稀疏数组  /*  思路  1.遍历数组,如果发现有一个元素的值不是0 ,就创建一个node结构体  2.将其放入到对应的切片中就可以了  */  var SparseArr []ValueNode  //标准的稀疏数组要记录二维数组的行和列  valueNode := ValueNode{  row: 11,  col: 11,  Val: 0,  }  SparseArr = append(SparseArr, valueNode)  // 结构体切片  //还是要全部扫描一遍的  for i, item1 := range chessMap {  for j, item2 := range item1 {  if item2 != 0 {  // 创节点了  valueNode = ValueNode{  row: i,  col: j,  Val: item2,  }  SparseArr = append(SparseArr, valueNode)  }  }  }  // 输出稀疏数组  for i, valueNode := range SparseArr {  println(i, valueNode.row, valueNode.col, valueNode.Val)  }  }

将稀疏数组输入到一个文件中

package main  import (  "bufio"  "fmt"   "os")  //稀疏数组  type ValueNode struct {  row int  col int  Val int  
}  func main() {  path := "./resources/class.data"  // 创建一个原始的数组  var chessMap [11][11]int  chessMap[1][2] = 1  chessMap[2][3] = 2  // 1 代表黑子  //2 代表白子  //输出原始数组  for _, item1 := range chessMap {  for _, item2 := range item1 {  print(item2)  }  println()  }  //Arr2Sparse(chessMap)  // 转换成稀疏数组  /*  思路  1.遍历数组,如果发现有一个元素的值不是0 ,就创建一个node结构体  2.将其放入到对应的切片中就可以了  */  var SparseArr []ValueNode  //标准的稀疏数组要记录二维数组的行和列  valueNode := ValueNode{  row: 11,  col: 11,  Val: 0,  }  SparseArr = append(SparseArr, valueNode)  // 结构体切片  //还是要全部扫描一遍的  for i, item1 := range chessMap {  for j, item2 := range item1 {  if item2 != 0 {  // 创节点了  valueNode = ValueNode{  row: i,  col: j,  Val: item2,  }  SparseArr = append(SparseArr, valueNode)  }  }  }  //输出稀疏数组  file, err := os.OpenFile(path, os.O_WRONLY, 0666)  if err != nil {  fmt.Println("文件打开失败", err)  }  defer file.Close()  for _, valueNode := range SparseArr {  s := fmt.Sprintf("%d %d %d\n", valueNode.row, valueNode.col, valueNode.Val)  write := bufio.NewWriter(file)  write.WriteString(s)  write.Flush()  if err != nil {  println("写入失败")  }  }  }

稀疏数组变成二维数组

package main  import (  "bufio"  "fmt"   "os")  //稀疏数组  type ValueNode struct {  row int  col int  Val int  
}  func main() {  path := "./resources/class.data"  // 恢复原始的数组  // 打开稀疏数组的文件  //     文件转换成稀疏数组(切片)  var sparse []ValueNode  file, _ := os.Open(path)  defer file.Close()  r := bufio.NewReader(file)  for true {  line, _, err := r.ReadLine()  if err != nil {  break  }  str := string(line)  var (  num1 int  num2 int  num3 int  )  fmt.Sscanf(str, "%d %d %d", &num1, &num2, &num3)  //println(num1, num2, num3)  valnode := ValueNode{  row: num1,  col: num2,  Val: num3,  }  sparse = append(sparse, valnode)  }  //fmt.Println(sparse)  // 得到数据  //创建一个二维数组  chessMap := make([][]int, sparse[0].row)  for i := 0; i < sparse[0].row; i++ {  chessMap[i] = make([]int, sparse[0].col)  }  //fmt.Println(chessMap)  // 遍历稀疏数组  for _, valNode := range sparse {  //跳过第一个,不然会数组越界  if valNode.Val == 0 {  continue  }  /*  或者 if index !=0 {         chessMap[valNode.row][valNode.col] = valNode.Val         }      */      chessMap[valNode.row][valNode.col] = valNode.Val  }  // 输出恢复后的数据  for _, v := range chessMap {  for _, v2 := range v {  print(v2)  }  println()  }  
}
http://www.lryc.cn/news/24121.html

相关文章:

  • MySQL 学习笔记(借鉴黑马程序员MySQL)
  • 中级工程师职称申报到底需要参加答辩不?
  • MM32开发教程(LED灯)
  • win10安装docker
  • 设计模式系列 - 代理模式及动态代理详解
  • 【分享】订阅集简云畅捷通T+cloud连接器自动同步财务费用单至畅捷通
  • GPT的发展历程
  • iOS开发笔记之九十八——关于Memory Leak总结笔记
  • HTML基础语法
  • 微软新版必应gpt人工智能体验教程
  • 你问我答|虚拟机、容器和无服务器,怎么选?
  • 某建筑设计研究院“综合布线管理软件”应用实践
  • R语言绘制SCI论文中常见的箱线散点图,并自动进行方差分析计算显著性水平
  • redux-saga
  • 【C++】-- 智能指针
  • 数据结构与算法——4时间复杂度分析2(常见的大O阶)
  • IIS解析漏洞
  • 2023 年腾讯云轻量和CVM服务器租用价格表出炉(CPU/内存/带宽/系统盘)
  • Java学习之路002——面向对象编程
  • VR直播丨颠覆性技术革命,新型直播已经到来
  • 【微信小程序】-- WXSS 模板样式- rpx import (十三)
  • Biotin-PEG-SVA,生物素聚乙二醇琥珀酰亚胺戊酸酯,可用于检测或分子标记
  • 云原生是什么?核心概念和应用方法解析
  • Editor工具开发实用篇:EditorGUI/EditorGUILayout的区别和EditorGUILayout的方法介绍
  • (五十二)大白话不断在表中插入数据时,物理存储是如何进行页分裂的?.md
  • Unity 渲染顺序
  • 短视频美颜sdk人脸编辑技术详解、美颜sdk代码分析
  • error: expected declaration specifiers or ‘...’ before ‘(’ token
  • 系列七、索引
  • Java开发 - Elasticsearch初体验