一文带你完整了解数据的编码!!

第三节 数据与编码 第三节 数据与编码 一、进制 (一)基本概念 数制即表示数值的方法,有非进位数和进位数两种。在计算机数制中,需要掌握数码、基数和位权 的概念。 数码:数制中表示基本数值大小的不同数字符号。在一种数制中,只能使用一组固定的符号来表示 数的大小。例如,十进制有 10 个数码,分别为 0,1,2,3,4,5,6,7,8,9 十个数。十六进制有 16 个数码,分别为 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。 基数:一种数制所使用数码的个数。例如,十进制的基数为 10,十六进制的基数为 16。 阅读详情
AI摘要

本文探讨了数据编码的重要性,包括保证数据的完整性和可靠性,以及如何通过不同的编码格式如JSON、XML、CSV、ProtocolBuffers、Thrift和Avro来平衡数据的紧凑性、可读性和兼容性问题。Avro的作者模式和读者模式为模式演变提供了支持,解决了向后和向前兼容性问题。

数据编码是将数据转换为计算机可读取和处理的二进制格式的过程。在数据存储中,正确的数据编码非常重要,因为它能够保证数据的完整性、可靠性和可读性。

  • 数据编码可以确保数据在存储过程中不会发生错误。通过使用适当的数据编码规则,可以防止数据被意外地篡改或损坏,从而确保数据的完整性和可靠性。
  • 数据编码可以节省存储空间。通过使用更紧凑的编码格式,可以将数据占用的存储空间降到最小,从而节省存储空间和存储成本。
  • 数据编码也能够提高数据的可读性和可维护性。通过使用易于理解和维护的编码格式,可以使数据更易于被人类读取和理解,并且在需要修改数据时,也更容易进行维护。
  1. 在内存中,数据保存在对象,结构体,列表,数组,哈希表,树等中。 这些数据结构针对CPU的高效访问和操作进行了优化(通常使用指针)。
  2. 如果要将数据写入文件,或通过网络发送,则必须将其编码(encode)为某种自包含的字节序列(例如,JSON文档)。 由于每个进程都有自己独立的地址空间,一个进程中的指针对任何其他进程都没有意义,所以这个字节序列表示会与通常在内存中使用的数据结构完全不同。从内存中表示到字节序列的转换称为编码、序列化;反过来称为解码、反序列化

如果我们要设计一个数据编码格式,我们需要考虑哪些方面的问题呢?

1、对于数据类型与数据结构的支持。需要确定自己的数据编码格式支持哪些数据类型,并且要能够正确地将数据类型转换为二进制格式,编码格式支持哪些数据结构,例如数组、列表等。这个是基础

2、数据紧凑性与解码效率。这个就涉及到数据编码算法了,考虑如何使用尽可能少的字节来编码数据,从而节省存储空间和传输带宽。越复杂的算法会节省越多的存储空间,但解码需要的时间也越长,所以鱼和熊掌不可兼得

3、易用性和可读性。需要考虑如何使编码格式易于使用和理解,以及如何使编码后的数据易于被人类读取和理解。但通常来说,强大的可读性,意味着对于数据紧凑性的牺牲,比如JSON

4、双向兼容性。向后兼容:新代码可以读旧数据。向前兼容:旧代码可以读新数据。向后兼容性通常并不难实现:新代码当然知道由旧代码使用的数据格式,因此可以显示地处理它;向前兼容性可能会更棘手,因为旧版的程序需要忽略新版数据格式中新增的部分。

语言特定的格式

不同的编程语言本身具有其特有的编码格式,比如Java的java.io.Serializable、Kryo,Ruby有 Marshal,Python有 pickle等。这些编码格式与编程语言深度绑定的同时,也带来了一些问题:

  1. 与特定的编程语言深度绑定,其他语言很难读取这种数据。
  2. 安全问题:如果攻击者可以让应用程序解码任意的字节序列,他们就能实例化任意的类,这会导致一些安全隐患,如远程执行任意代码
  3. 前向后向兼容性问题
  4. 效率问题

所以除非临时使用,采用语言特定的内置编码格式缺乏扩展性,一般尽量减少去使用,特别是对外开放的接口服务

JSON,XML和CSV

JSON,XML是总所周知的可以被很多编程语言编写与读取的标准化编码格式,JSON,XML和CSV是文本格式,因此具有可读性,但对应的也有各自的问题,比如XML太冗长复杂(复杂的嵌套关系);CSV能够支持的功能太弱。除此之外,还有一些其他问题:

  1. 数字的编码多有歧义之处。XML和CSV不能区分数字和字符串(除非引用外部模式)。JSON虽然区分字符串和数字,但不区分整数和浮点数,而且不能指定精度。
  2. 大数据精度丢失
  3. JSON和XML对Unicode字符串(即人类可读的文本)有很好的支持,但是它们不支持二进制数据(不带字符编码(character encoding)的字节序列)。虽然我们可以用Base64将二进制编码为文本,但会增加33%左右的大小
  4. CSV没有任何模式,因此应用程序需要定义每行和每列的含义。如果应用程序更改添加新的行或列,则必须手动处理该变更。

他们与其他编码格式相比,占用了更多的存储空间,JSON比XML简洁,但与二进制格式一比,还是太占空间。这一原因导致大量二进制编码版本JSON & XML的出现,JSON(MessagePack,BSON,BJSON,UBJSON,BISON和Smile等)(例如WBXML和Fast Infoset)。但这些都是在某一特定的领域使用场景比较多,没有JSON比XML这样广泛的应用。这些格式中的一些扩展了一组数据类型(例如,区分整数和浮点数,或者增加对二进制字符串的支持),另一方面,它们没有盖面JSON / XML的数据模型。特别是由于它们没有规定模式,所以它们需要在编码数据中包含所有的对象字段名称。

例如MessagePack的编码:
在这里插入图片描述
存储形式如下

  1. 第一个字节 0x83 表示接下来是3个字段(低四位= 0x03 )的对象 object(高四位=
    0x80 )。 (如果想知道如果一个对象有15个以上的字段会发生什么情况,字段的数量
    塞不进4个bit里,那么它会用另一个不同的类型标识符,字段的数量被编码两个或四个字
    节)。
  2. 第二个字节 0xa8 表示接下来是8字节长的字符串(最高四位= 0x08)。
  3. 接下来八个字节是ASCII字符串形式的字段名称 userName 。由于之前已经指明长度,不
    需要任何标记来标识字符串的结束位置(或者任何转义)。
  4. 接下来的七个字节对前缀为 0xa6 的六个字母的字符串值 Martin 进行编码,依此类推。

Thrift与Protocol Buffers

Thrift和Protocol Buffers都是一种高效的数据序列化/反序列化框架,它们都被广泛应用于分布式系统中。

Thrift是由Facebook公司开源的一种数据序列化框架,它最初被设计用于解决跨语言服务调用的问题。它支持多种编程语言,并提供了自己的IDL(Interface Definition Language)语言,用于定义接口和数据结构。通过IDL定义,Thrift可以生成对应的客户端和服务端代码。Thrift使用二进制格式进行数据序列化,因此在网络传输中传输效率较高。

Protocol Buffers是由Google公司开源的一种数据序列化框架,类似于Thrift,它也支持多种编程语言,并且提供了自己的IDL语言,用于定义数据结构。Protocol Buffers的IDL语言相比Thrift更加简单,但是却可以定义更加丰富的数据类型。Protocol Buffers同样使用二进制格式进行数据序列化,并且具有较高的序列化和反序列化效率。

Thrift和Protocol Buffers都需要一个模式来编码任何数据。是基于相同原理的二进制编码库。

Thrift接口定义语言(IDL)来描述模式:
在这里插入图片描述
Protocol Buffers的等效模式:
在这里插入图片描述

每个字段都有一个类型注释(用于指示它是一个字符串,整数,列表等),还可以根据需要指定长度(字符串的长度,列表中的项目数) 。出现在数据中的字符串 (“Martin”, “daydreaming”, “hacking”) 也被编码为ASCII(或者说,UTF-8)。

Thrift和Protocol Buffers每一个都带有一个代码生成工具,它采用了类似于这里所示的模式定义,并且生成了以各种编程语言实现模式的类。

使用Thrift 二进制协议的编码内容:
在这里插入图片描述
与JSON等相比,最大的区别是没有字段名 (userName, favoriteNumber, interest) 。相反,编码数据包含字段标签,它们是数字 (1, 2和3) 。这些是模式定义中出现的数字。字段标记就像字段的别名,这样就不用记录字符串名称,节省空间。

使用Protocol编码内容:
在这里插入图片描述
从上面的内容我们可以看出,编码识别的关键在于标签号码的标识(“userName”这个字符串可以理解为仅仅是一个标记,不会影响实际的数据内容),比如上面的userName用序号1标识,favoriteNum用序号2标识,一次类推。序号的标记让我们能够确认在什么位置应该解析什么样的数据。可以更改架构中字段的名称,因为编码的数据永远不会引用字段名称,但不能更改字段的标记,因为这会使所有现有的编码数据无效。

那么如何维护前后兼容性问题呢?

对于向前兼容,忽略不能识别的标签号码字段,但必须保证第一版数据模式部署后,后面新加的字段都应该是非必须的,不然就肯定会检查失败;对于向后兼容,只要每个字段都是一个唯一的标签号码,新代码就可以读取旧数据。因此,一个重要的细节就是模式的初始部署之后添加的每个字段必须是可选的或具有默认值。删除一个字段就像添加一个字段,倒退和向前兼容性问题相反,只能删除非必须字段。

问题来了,有没有可能我们可以去掉标签号码标识。当然可以,那就要介绍Avro了

Avro

Apache Avro是一种数据序列化系统,它使用JSON格式定义数据结构和协议,支持快速、紧凑、跨语言和跨平台的数据序列化和反序列化。它是一种可扩展的数据交换格式,通常用于大规模数据存储、数据处理和数据通信等领域。

Avro也使用模式来指定正在编码的数据的结构。 它有两种模式语言:一种(Avro IDL)用于人工编辑,一种(基于JSON),更易于机器读取。

Avro IDL编写的示例模式:
在这里插入图片描述
等价的JSON表示:
在这里插入图片描述
首先,请注意架构中没有标签号码。 如果我们使用这个模式编码我们的例子记录,Avro二进制编码只有32个字节长,这是我们所见过的所有编码中最紧凑的。
在这里插入图片描述
那么问题是如何支持模式演变?或者说如果字段顺序错乱,能否识别并正确解析?如果我新增一个字段,新旧版本如何兼容呢?

答案就是读者模式与作者模式。

我用一个简单的比喻:假设你是一家快递公司的快递员,需要将包裹从寄件人送到收件人手中。在这个场景中,快递员就是数据的传输通道,寄件人就是数据的“作者”,收件人就是数据的“读者”。

在Avro中,数据的“作者模式”就好比是寄件人将包裹交给了快递员,快递员将包裹送到收件人手中。在这种模式下,数据的“作者”可以自由地定义和修改数据结构和协议,而数据的“读者”需要根据定义好的数据结构和协议来读取数据。因此,这种模式也被称为“寄信人先写信”。

而数据的“读者模式”就好比是收件人在快递员手中收到了包裹,根据包裹上的信息来确认包裹是否正确。在这种模式下,数据的“读者”需要先定义好数据结构和协议,然后再去读取数据。因此,这种模式也被称为“先知道信的样子再收信”。

在Avro中,读者模式和作者模式分别用于定义数据结构和协议以及读取数据。作者模式用于“寄信人先写信”,可以自由地定义和修改数据结构和协议;而读者模式用于“先知道信的样子再收信”,可以根据定义好的数据结构和协议来读取数据。
在这里插入图片描述
同样需要注意的一点是,为了保持兼容性,只能添加或删除具有默认值的字段。在一些编程语言中,null是任何变量可以接受的默认值,但在Avro 中并不是这样:如果要允许一个字段为 null ,则必须使用联合类型。例如, union {null,long,string} 字段;表示该字段可以是数字或字符串,也可以是 null 。如果它是union的分支 之一,那么只能使用null作为默认值。Avro没有像Protocol Buffers和Thrift那样的 optional 和 required 标记(它有联合类型
和默认值)

以上对于Avro讲述了这么多,那么我们去掉了标签号码标识,除了能节省空间外,更重要的优势是什么?或者说在模式中保留一些数字有什么问题?

关键在于支持了动态生成模式

假如你有一个关系数据库,你想要把它的内容转储到一个文件中,使用Avro,你可以很容易地从关系模式生成一个Avro模式(在 我们之前看到的JSON表示中),并使用该模式对数据库内容进行编码,并将其全部转储到Avro对象容器文件中。您为每个数据库表生成一个记录模式,每个列成为该记录中的一个字段。数据库中的列名称映射到Avro中的字段名称。

现在,如果数据库模式发生变化(例如,一个表中添加了一列,删除了一列),则可以从更新的数据库模式生成新的Avro模式,并在新的Avro模式中导出数据。数据导出过程不需要注 意模式的改变 - 每次运行时都可以简单地进行模式转换。任何读取新数据文件的人都会看到记 录的字段已经改变,但是由于字段是通过名字来标识的,所以更新的作者的模式仍然可以与 旧的读者模式匹配。如果使用Thrift或Protocol Buffers,则字段标记可能必须手动分配

机器学习笔记-数据预处理-数据编码 机器学习笔记数据预处理-特征数据编码1.LabelEncoder(进行数据自编码)2.map(进行字典的数字编码映射)3.OnehotEncoder(进行one-hot编码) 数据预处理-特征数据编码 特征数据一般分为数值特征和对象特征,对于对象特征我们一般采用数据编码的方式转换为可进行处理的数值 1.LabelEncoder(进行数据自编码) 对分类型特征值进行编码,即对不连续的数值或文本进行编码 对于数字映射的编码方式,存在一个编码映射表:比如{‘A’: 1, ‘B’: 2, ‘C’: 3} 那么上述的 阅读详情

相关推荐

别急着重装!Win10蓝屏报错SrtTrail.txt,试试这个系统自带的修复命令

本文详细解析了Win10蓝屏报错SrtTrail.txt的成因及修复方法,重点介绍了系统自带的`sfc /scannow`命令,帮助用户在不重装系统的情况下解决文件损坏问题。通过高级启动环境和详细操作指南,有效修复System32目录下的错误日志,提升系统稳定性。

weixin_30603633的博客 485

机器学习中最常使用的10种数据编码方式

大家好,在机器学习中,很多算法都需要我们对分类特征进行转换(编码)。 为了方便讲解,下面创建示例DataFrame 数值型数据 让我们先来讨论连续型数据的转换,也就是根据Score列的值,来新增一列标签,即如果分数大于90,则标记为A,分数在80-90标记为B,以此类推。 自定义函数 + 循环遍历 首先当然是最简单,最笨的方法,自己写一个函数,并用循环遍历,那肯定就是一个def加一个for df1 = df.copy() def myfun(x): if x>90: ret

Python数据挖掘 6656

一篇文章带你了解——EC11编码器

本文旨在帮助大家快速深入了解EC11编码器的原理及应用,并提供单片机驱动EC11基础代码和消抖代码供大家学习。

Xhw3f586的博客 2万+

常见数据编码方式

常见的数据编码方式

zdd56789的博客 5125

赫夫曼编码树(图解+完整代码)

赫夫曼树的构建与赫夫曼编码的图解剖析与完整代码,包含定长编码、变长编码、前缀码

weixin_54186646的博客 2万+

一文带大家初了解Speechbrain

Speechbrain是一个基于pytorch的语音工具包,它的野心也是很大的,定位是将所有功能集于一身的语音工具包。涉及到各种语音技术,比如语音识别系统、说话人识别系统、语音增强系统、多麦克风信号处理系统等等。接下来,我主要是从github简介入手,做一个中文翻译这样的工作。

梁先森的博客 1万+

MySQL数据库编码

1 MySQL数据库编码解析     登录MySQL之后,输入如下命令来查询数据库编码, show variables like "char%";     可得到如下查询结果,     查询结果所含信息如下,         ①character_set_client:utf8,表示MySQL

席木木的博客 7357

一张图带你了解数据分析的完整流程

在数据存储阶段,数据分析师需要了解数据存储内部的工作机制和流程,最核心的因素是在原始数据基础上经过哪些加工处理,最后得到了怎样的数据。数据分析相对于数据挖掘更多的是偏向业务应用和解读,当数据挖掘算法得出结论后,如何解释算法在结果、可信度、显著程度等方面对于业务的实际意义,如何将挖掘结果反馈到业务操作过程中便于业务理解和实施是关键。在业务理解数据的基础上,推动业务落地实现数据建议。数据项目工作是循序渐进的过程,无论是一个数据分析项目还是数据产品项目,都需要数据分析师具备计划、领导、组织、控制的项目工作能力。

xuezhangmen的博客 4364

一文带你了解 Base64 编码知识

开发工程师肯定对 Base64 毫不陌生了,那么你知道 Base64 究竟是什么,为什么要使用 Base64,以及 Base64 的优缺点吗?

github_36774378的博客 560

MATLAB实现的语音信号子带编码全面解析

取样定理(也称为奈奎斯特取样定理)是数字信号处理中的一个基础理论,它提供了从连续信号到离散信号转换的基本方法。按照取样定理,如果一个带宽有限的模拟信号的最大频率为( f_m ),那么该信号可以由其在等时间间隔内的样点准确重构出来,只要样点的取样频率( f_s )满足以下条件:这个最小取样频率也被称为奈奎斯特频率。在理想情况下,取样后的信号是可以通过低通滤波器恢复出原模拟信号的。取样定理的应用包括音频CD、数字电视广播、数字通信系统等,确保了数字化过程中的信息完整性与准确性。

weixin_35754962的博客 1227

HFSS实战:手把手教你设计微带发夹线滤波器(附完整参数计算流程)

本文详细介绍了使用HFSS设计微带发夹线滤波器的完整流程,包括参数计算、HFSS建模和优化策略。通过实战案例,帮助读者掌握微波滤波器设计的核心技巧,特别是奇偶模阻抗计算和HFSS仿真中的关键设置,适用于通信系统设计和射频工程应用。

weixin_29251567的博客 441

一文了解视觉Transformer解析 !!

自2017年“注意力就是一切”的理念问世以来,Transformer模型便迅速再自然语言处理(NLP)领域展露头角,确立了其领先地位。到了2021年,“一张图片等于16x16个单词”的理念成功将Transformer模型引入计算机视觉任务中。自此以后,众多基于Transformer的架构纷纷涌现,应用于计算机视觉领域。本文将详细介绍“一张图片等于16x16个单词”中阐述的Vision Transformer(ViT),包括其开源代码和对各组件的概念解释。所有代码均使用PyTorch Python实现。

不要给自己设限,尝试更多可能(思所向 皆可往) 1392

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 374

一文带你了解数据保护的重要性

↑关注 + 置顶 ~有趣的不像个技术号前人种瓜,小七吃瓜。本文阅读需要七分钟。废话不多说,直奔主题。相信不小心点进来的客官,要么是已经从事数据分析的,要么是打算找一份这样工作的你,...

zhuxiao5的博客 2980

长短期记忆网络(Long Short-Term Memory networks, LSTM)

如何简单的理解LSTM——其实没有那么复杂:

weixin_39910711的博客 2万+

Spring AI Alibaba Graph进阶:如何用图算法优化你的推荐系统?

本文深入探讨了如何利用Spring AI Alibaba Graph的图算法优化推荐系统。通过分析用户行为数据的网络化特征,结合加权随机游走和社区发现算法,显著提升推荐精准度和用户点击率。文章还分享了混合推荐架构设计、性能优化技巧及生产环境中的实战经验,为开发者提供了一套完整的图算法推荐解决方案。

weixin_33738555的博客 128

一张图带你了解数据分析的完整流程,建议收藏

一个完整的数据分析流程,应该包括以下几个方面,建议收藏此图仔细阅读。 (注:图保存下来,查看更清晰) 作为数据分析师,无论最初的职业定位方向是技术还是业务,最终发到一定阶段后都会承担数据管理的角色。因此,一个具有较高层次的数据分析师需要具备完整的知识结构。 1. 数据采集 了解数据采集的意义在于真正了解数据的原始面貌,包括数据产生的时间、条件、格式、内容、长度、限制条件等。这会帮...

Leo的博客 7540

r语言svr模型_R语言初探强化学习中的马尔可夫模型

强化学习大家这几年应该不陌生,从AlphaGo到AlphaZero让大家见识到了强化学习的力量。我们今天给大家介绍一个在强化学习中核心思维马尔可夫决策过程(MDP)。马尔科夫决策过程是基于马尔科夫论的随机动态系统的最优决策过程。它是马尔科夫过程与确定性的动态规划相结合的产物,故又称马尔科夫型随机动态规划,属于运筹学中数学规划的一个分支。今天我们给大家介绍下马尔可夫决策过程中用到一些算法以...

weixin_28994357的博客 1111

【数据结构】哈夫曼树 哈夫曼编码 解析+完整代码

(2)构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左右子树,并且将新结点的权值置为左右子树上根结点的权值之和;1.每个初始结点最终都会成为叶结点,且权值越小的结点到根结点的路径长度越大;(1)将这n个结点分别作为n棵仅含一个结点的二叉树,构成森林F;从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积。(3)从F中删除刚才选出的两棵树,同时将新得到的树加入F中。有某种现实含义的数值(如:表示结点的重要性等)树中所有叶结点的带权路径长度之和。3.哈夫曼树中不存在度为1的结点;

m0_61628700的博客 1914

【AUTOSAR-DEM】-2.1-APP SWC设置UDS/OBD DTC检出和恢复

点击返回「《Autosar_BSW高阶配置》总目录」 案例背景(共6页精讲): DEM模块提供两种不同类型的Event: • BSW-related events:DEM_EVENT_KIND_BSW(通过C-API报告 - Dem_SetEventStatus) • SW-C-related events:DEM_EVENT_KIND_SWC(通过RTE operation - SetEventStatus) 下面我们讲讲在APP SWC中设置BusOff(总线关闭) DTC故障成立/恢复(其它

「汽车电子助手」的博客 3944

14、5G物理层的灵活解决方案:广义频分复用(GFDM)

广义频分复用(GFDM)作为一种高度灵活的5G物理层多载波调制方案,能够满足多样化应用场景的需求,包括高吞吐量的比特管道通信、低功耗高连接数的物联网、超低延迟的触觉互联网以及广覆盖的无线区域网。通过参数化配置,GFDM可适配LTE资源网格,实现与现有系统的兼容与共存。其支持多种解调方式、干扰消除技术、OQAM映射及预编码机制,兼具低带外发射、高频谱效率和强鲁棒性。GFDM还能统一描述OFDM、FBMC、FTN等多种经典与先进波形,成为5G及未来通信系统中极具潜力的通用波形框架。

gold8的专栏 108

Transformer编码器深度解析:带你亲历数据流的完整旅程!

本文详细解析了Transformer编码器的数据流动过程:输入文本首先通过嵌入和位置编码转换为初始向量表示;随后经过N层编码器层处理,每层包含多头自注意力机制(捕捉全局上下文)、残差连接与层归一化(稳定梯度流)、以及前馈网络(深度特征提取);最终每个词被转换为融合全句信息的"超级向量"。这种设计使模型能理解词语间依赖关系,为解码器生成目标序列奠定基础。

m0_65555479的博客 965

prometheus普罗米修斯集监控外部k8s

prometheus普罗米修斯集监控外部k8s

你是我一生的追求 2247

“锟斤拷” 是什么意思?一文带你深入了解

在数字化程度日益加深的今天,理解字符编码这样的基础技术概念,不仅对技术人员重要,对每一个使用数字设备的现代人都具有重要意义。下次当你看到「锟斤拷」时,希望你能会心一笑,然后准确地找出并解决背后的编码问题。 记住,每一个技术梗的背后,都有一段值得了解的技术历史。「锟斤拷」如此,其他技术文化现象也是如此。

爱编程的鱼的博客 5074

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一文带你抢先了解腾讯云AI代码助手

具体表现在沟通,编码,排错,评审,测试。支持多种编程语言、主流开发框架、常用IDE:腾讯云AI助手支持多种编程语言,如Python、Java、C++等,以及主流的开发框架如TensorFlow、PyTorch等,同时还兼容常用的IDE如VSCode、IDEA、Eclipse等,为开发者提供了灵活的选择。覆盖从沟通到测试的开发全流程:腾讯云AI助手不仅提供了丰富的API接口,还提供了一整套完整的开发工具链,包括代码编辑器、调试工具、版本控制等,帮助开发者从需求分析、设计、开发到测试的全流程进行高效管理。

知无涯 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 应用层
下一篇: 你真的了解索引吗
抠脚的鱼
博客等级 码龄9年 3粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值