信息与信息容量,再加上容量设计

信息的核心作用是消除不确定性。

我理解信息有点像量子力学中的叠加态?不存数据的信息格子相当于是所有可能性的叠加态;存数据的信息格子相当于进行了观察,变成了唯一的确定态。

这边先给出几个概念(后面会慢慢加深理解):信息元、信息容量、信息格子。

  • 描述1:一个使用1个bit作为信息元的信息格子,信息容量是2。
  • 描述2:每个信息元有自己的信息容量,信息格子的容量等于所有信息元的信息容量的乘积。
  • 描述3:信息格子可以容纳多个信息元。

当然信息元也可以使用其他的。比如,如果使用生物学里面的碱基对作为信息元,因为其有4种碱基对,所以一个信息元就能代表4种可能性。

因为咱们主要是和计算机打交道,所以后面使用bit为信息元,举例讲解。

在这里插入图片描述
当1bit信息不存任何数据时,它有着2种可能性。这时(未存储数据)它能承载两种可能性。

但它真正存储了数据时,它就选择了其中的一种可能性,而放弃了其它所有可能性(对于1bit的信息格子来说,也只是一种可能性)。

1bit信息可以消除两个不确定性中的一个,使其确定。比如:是还是否,选择了一个即另一个的可能就消失了,即2中取1。

接下来,我们来看看使用2bit作为信息元的信息格子长什么样:
在这里插入图片描述两个bit信息元分别能代表两种可能性。两个bit信息元各司其职,区分前后。

在这里插入图片描述
两个bit信息元相当于两个维度同时在变。所以类比2维乘法求面积,信息格子的可能性总容量也是各个bit信息元能代表可能性数量的乘积。

在这里插入图片描述
每加一个信息元,相当于多一个维度,就多乘一次信息元本身能表示的可能性的个数。

那信息元的信息容量不同也可以放在同一个信息格子里吗?当然也可以,根据上面的公式,简单乘一下,就可以算出总的信息容量。

对于信息格子来说,每多一个bit信息元,信息格子的信息容量乘2(因为bit信息元的信息容量为2)。

以此类推,含8个bit(1byte)的信息格子的信息容量是256(即能容纳256的可能性);含16个bit(2byte)的信息格子的信息容量是65536(即能容纳256的可能性)。

以下将简化描述:含8个bit信息元的信息格子 简化为 8位的信息格子。

上面这个概念有什么用呢?下面给出几个小案例来一起看看

案例分析:数据库的time类型的容量设计(time精确到秒)

如果让你来设计,你会怎么做?

其实就算它有多少种可能性就好,然后套一下就可以。

一天有86400秒(86400 = 24 *60 * 60)。精确到秒的情况下,time只有86400种可能。即需要一个最小的、承载能力大于86400的信息格子来承载。2的16次方是65535,那2的17次方即可。

所以,仅需要17位的信息格子即可承载精确到秒的time数据。

因为是给计算机设计数据结构,而计算机一般会以8bit(1byte)作为最小单位。所以下一步就是再加两个限制条件:大于等于它(17bit),是8的倍数。即24bit,即3byte。这就设计完了。

然后又获得了一个信息:这24bit中,有7bit其实没用到,后面有需要的地方可以拿出来用。

案例分析:数据库的date类型的容量设计

和上面一样,我们先看看有多少可能性要承载。

但这里发现了,题目其实有未明确的地方:date的范围是多少?

假设范围为100年,每天都能用唯一的信息表示,每年算366天(365和366,取大的那个做容量评估依据)。这种情况下,信息可以表示的就是1970-2069年直接的任意一天。总的可能性数量 = 366 * 100 = 36600种可能。 65536空间的信息格子即可装满,即需要一个16位(2的16次方=65536)的信息格子。

上面计算出了100年范围的date需要16bit(2byte)的信息格子进行数据存储。而且,16bit的空间都占用了,因为15位的信息格子的信息容量为65536/2=32768 < 36600。

100年可能有些情况够了,但在描述历史和未来的时候,可能也会用到上千年的时间范围。

所以接下来再以1万年为范围,重新做一下分析和设计。

一年366种可能,1万年就是3660000种可能。

我算了一下,2的22次方=4194304>3660000。即:精确表示1万年的范围内的每一天,需要22位的信息格子。

因为讨论计算机,所以还是加一个约束:8的整数。所以在计算机中精确表示1万年内的每一天,需要24bit(3byte)的信息格子,而其中2bit没有用。

案例分析:数据库的datetime类型的容量设计

继续沿用上面的设计方法。

那如果精确到秒,且年份范围是1万年datetime的总可能性个数就是86400 * 3660000 = 316,224,000,000。

算了一下,2的39次方比它略大,所以需要39位的信息格子承载。

但如果传统的方式,其实date使用3byte,time使用3byte。datetime应该使用6byte承载,前3byte,后3byte嘛。

这样放在一起比较,新的设计方法就省了一个字节。

另一个分析方法

当然也可以换一个方式分析。上面两个案例其实也提过,time中有7个bit没有用,date中也有2个bit没有用。

24位的信息格子,换一个视图展示:

在这里插入图片描述
灰色格子代表此格子用来承载信息,为信息格子提供信息容量。

那我们再来看看表示time的信息格子:

在这里插入图片描述根据之前提到的,表示time需要24bit(3byte)。而time却只需要17个bit的信息元就足够了,也就是剩下7个bit的信息元没有用到。

再看一下表示date的信息格子:

在这里插入图片描述同样,之前提到过,表示1万年范围的date需要24bit(3byte)。而它却只需要22个bit的信息元就够了,剩下2个bit的信息元没有用。

所以,其实有9个bit的信息元没有使用。

可以拆分一下信息格子:使用22bit做datetime中的date,使用17bit作为datetime中的time。然后作为一个整体,再来满足计算机的约束—8的倍数个bit。这样,就是39bit,向上寻找8的倍数,即40bit(5byte)。

在这里插入图片描述
所以,40个信息格子的空间就够了。即,精确表示1万年间的每一秒,需要40bit(8byte)。

而且,看图还可以发现,还剩下一个bit没有使用。也就是说,整个表示的范围还可以扩大一倍,

即:40bit的信息格子可以精确表示2万年间的每一秒。

总结

信息格子的信息容量=各信息元的信息容量的乘积。

计算机领域的信息元bit的信息容量为2。

可以通过可能性的数量计算需要的信息元的个数,以此为依据设计数据长度(数据占据的空间大小)。

后记

前几天背mysql数据日期相关类型的容量的时候,发现date占3byte,time占3byte,datetime占5byte。其实这不奇怪。

然后继续看datetime能表示的范围和date+time其实是一样的,这时想了想如何实现的,压缩了什么东西,然后发现了这篇文章的基础论点,之后就有了这篇文章。

不知道对大家来说是不是一个新的视角

希望能对大家有点启发吧

内容还感兴趣吗?公众号中会有更多相关内容持续更新哦
在这里插入图片描述

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值