信息的核心作用是消除不确定性。
我理解信息有点像量子力学中的叠加态?不存数据的信息格子相当于是所有可能性的叠加态;存数据的信息格子相当于进行了观察,变成了唯一的确定态。
这边先给出几个概念(后面会慢慢加深理解):信息元、信息容量、信息格子。
- 描述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其实是一样的,这时想了想如何实现的,压缩了什么东西,然后发现了这篇文章的基础论点,之后就有了这篇文章。
不知道对大家来说是不是一个新的视角
希望能对大家有点启发吧
内容还感兴趣吗?公众号中会有更多相关内容持续更新哦