当前位置: 首页 > 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()  }  
}

相关文章:

Go 稀疏数组学习与实现

仍然还是一个数组 基本介绍 一般就是指二维以上的数组 当一个数组中大部分元素是0 ,或者为同一个值的数组时,可以使用系数数组来保存该数组. 稀疏数组的处理方法: 记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程…...

MySQL 学习笔记(借鉴黑马程序员MySQL)

MySQL视频课链接 MySQL概述 数据库相关概念 数据库是存储数据的仓库&#xff0c;数据是有组织的进行存储&#xff08;DataBase&#xff09; 数据库管理系统是操纵和管理数据库的大型软件&#xff08;DataBase Management System&#xff09; SQL是操作关系型数据库的编程语…...

中级工程师职称申报到底需要参加答辩不?

获得中级工程师职称的方式有认定、评审、考试这几种形式。 甘建二老师先来简单说一下关于认定和考试这两种&#xff1a; 1.认定&#xff1a;中级职称认定一般是根据各地职称认定政策&#xff0c;如果你想走认定渠道&#xff0c;首先本人简历条件、业绩、奖项等非常优秀&#…...

MM32开发教程(LED灯)

文章目录前言一、MM32介绍和STM32的区别二、板载LED灯原理图三、代码编写总结前言 今天将为大家介绍一款性能高体积小的MM32&#xff0c;这款开发板出自百问网团队。他就是灵动的MM32F3273&#xff0c;他体积非常小便于携带。 有128KB的SRAM、512KB的Flash、而且还支持双TypeC…...

win10安装docker

1.win10安装docker&#xff0c;前提必须是要安装WSL2。 现在Docker Desktop默认使用WSL 2来运行&#xff0c;而不是以前的Hyper-V。 WSL2 全称是Windows Subsystem on Linux。意思是&#xff0c;在win10&#xff0c;可以直接启动一个Linux。因为docker依赖Linux内核。 可查看…...

设计模式系列 - 代理模式及动态代理详解

定义 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作用。 结构 抽象角色&#xff1a;通过接口或抽象类声明真实角色实现的业务方法。 代…...

【分享】订阅集简云畅捷通T+cloud连接器自动同步财务费用单至畅捷通

方案场景 伴随公司发展和数字化水平提高&#xff0c;大量的财务单据需要手动审核和录入&#xff0c;这些重复机械的操作占据大量人力&#xff0c;同时极容易出现数据出错或丢失等情况&#xff0c;严重影响着企业经营效率。 使用集简云提供服务的畅捷通TCloud钉钉连接器完成财…...

GPT的发展历程

GPT是当前最火的人工智能技术之一&#xff0c;自推出以来就广受关注。但大家对这个技术了解多少&#xff0c;又知道它经历了什么&#xff1f; GPT的诞生离不开谷歌在人工智能领域的努力和研究。2004年&#xff0c;谷歌成立了人工智能实验室&#xff08;现已成为谷歌 AI实验室&…...

iOS开发笔记之九十八——关于Memory Leak总结笔记

*****阅读完此文&#xff0c;大概需要3分钟******关于Memory leak&#xff08;内存泄漏&#xff09;的问题&#xff0c;如果是面试被问这个问题以及此类问题&#xff0c;主要涉及下面3个方面&#xff1a;内存泄漏的常见场景有哪些&#xff0c;列举几个常见的例子&#xff1f;开…...

HTML基础语法

一 前端简介构成语言说明结构HTML页面元素和内容表现CSS网页元素的外观和位置等页面样式&#xff08;美化&#xff09;行为JavaScript网页模型的定义和页面交互二 HTML1.简介HTML&#xff08;Hyper Text Markup Language&#xff09;&#xff1a;超文本标记语言。网页结构整体&…...

微软新版必应gpt人工智能体验教程

大家好,我是雄雄,欢迎关注微信公众号:** 雄雄的小课堂 ** 现在是:2023年2月28日18:35:02 前言 前几天,发了一篇文章,主要介绍了如何申请新必应的内测名单,其实一共也就那几步,然后等着就行: 文章连接:new bing如何快速申请内测资格,从而体验人工智能? 今天,终于…...

你问我答|虚拟机、容器和无服务器,怎么选?

在新技术层出不穷的当下,每家企业都希望不断降低成本,并提高运营效率,一个方法就是寻找不同的技术方案来优化运营。      例如,曾经一台服务器只能运行一个应用(裸机);接着,一台服务器的资源可以划分为多个块,从而运行多个应用(虚拟化);再到后来,应用越来越多,为了方便它们…...

某建筑设计研究院“综合布线管理软件”应用实践

某建筑设计研究院有限公司&#xff08;简称“某院”&#xff09;隶属于国务院国资委直属的大型骨干科技型中央企业。“某院”前身为中央直属设计公司&#xff0c;创建于1952年。成立近70年来&#xff0c;始终秉承优良传统&#xff0c;致力于推进国内勘察设计产业的创新发展&…...

R语言绘制SCI论文中常见的箱线散点图,并自动进行方差分析计算显著性水平

显著性标记箱线散点图 本篇笔记的内容是在R语言中利用ggplot2&#xff0c;ggsignif&#xff0c;ggsci&#xff0c;ggpubr等包制作箱线散点图&#xff0c;并计算指定变量之间的显著性水平&#xff0c;对不同分组进行特异性标记&#xff0c;最终效果如下。 加载R包 library(ggplo…...

redux-saga

redux-saga 官网&#xff1a;About | Redux-Saga 中文网&#xff1a;自述 Redux-Saga redux-saga 是一个用于管理 异步获取数据(副作用) 的redux中间件&#xff1b;它的目标是让副作用管理更容易&#xff0c;执行更高效&#xff0c;测试更简单&#xff0c;处理故障时更容易… …...

【C++】-- 智能指针

目录 智能指针意义 智能指针的使用及原理 RAII 智能指针的原理 std::auto_ptr std::auto_ptr的模拟实现 std::unique_ptr std::unique_ptr模拟实现 std::shared_ptr std::shared_ptr的模拟实现 循环引用问题 智能指针意义 #问&#xff1a;为什么需要智能指针&#…...

数据结构与算法——4时间复杂度分析2(常见的大O阶)

这篇文章是时间复杂度分析的第二篇。在前一篇文章中&#xff0c;我们从0推导出了为什么要用时间复杂度&#xff0c;时间复杂度如何分析以及时间复杂度的表示三部分内容。这篇文章&#xff0c;是对一些常用的时间复杂度进行一个总结&#xff0c;相当于是一个小结论 1.常见的大O…...

IIS解析漏洞

IIS 6.0在解析文件时存在以下两个解析漏洞。 ①当建立*.asa、*.asp格式的文件夹时&#xff0c;其目录下的任意文件都将被IIS当作asp文件来解析。 例如&#xff1a;建立文件夹 parsing.asp&#xff0c;在 parsing.asp 文件夹内新建一个文本文档 test.txt&#xff0c;其内容为&…...

2023 年腾讯云轻量和CVM服务器租用价格表出炉(CPU/内存/带宽/系统盘)

腾讯云服务器的价格表是用户比较关心的问题&#xff0c;服务器的价格组成包括云服务器的机型价格、磁盘价格和宽带价格&#xff0c;主机教程网来详细说下腾讯云最新的云服务器价格表。我们以北京一区、Linux系统的云服务器为例&#xff0c;其他地域的价格会有所差异&#xff0c…...

Java学习之路002——面向对象编程

【说明】部分内容来源于网络&#xff0c;如有冲突&#xff0c;请联系作者删除。 一、面向对象编程(OOP) 2.1 对象和类的关系 2.2 面向对象的特征 2.2.1 封装 2.2.2 继承 2.2.3 多态 3、抽象 使用abstract关键字修饰的类或者方法 定义抽象类(使用abstract) // 1、定义抽象方法…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...