用信息论理解排序算法

信息论

信息是个很抽象的概念。人们常常说信息很多,或者信息较少,但却很难说清楚信息到底有多少。比如一本五十万字的中文书到底有多少信息量。直到1948年,香农提出了“信息熵”的概念,才解决了对信息的量化度量问题。(摘自百度百科)

一条信息的信息量大小和它的不确定性有直接的关系。比如说,我们要搞清楚一件非常非常不确定的事,或是我们一无所知的事情,就需要了解大量的信息。相反,如果我们对某件事已经有了较多的了解,我们不需要太多的信息就能把它搞清楚。所以,从这个角度,我们可以认为,信息量的度量就等于不确定性的多少。(摘自数学之美)

熵在信息论中代表随机变量不确定度的度量,一个离散型随机变量 X X 的熵H(X)计算公式如下:

H(X)=i=0n1p(xi)logp(xi) H ( X ) = − ∑ i = 0 n − 1 p ( x i ) l o g p ( x i )

其中 x0,x1,,xn1 x 0 , x 1 , · · · , x n − 1 X X 的所有可能取值,p(x) x x 事件发生的概率。如果对数以2为底,信息熵的单位为比特(bit),如果对数以 e e 为底那么信息熵的单位为莱特,这里主要讨论以2为底的情况。

香农总结出了信息熵的三条性质:

  • 单调性,即发生概率越高的事件,其所携带的信息熵越低。极端案例就是“太阳从东方升起”,因为为确定事件,所以不携带任何信息量。从信息论的角度,认为这句话没有消除任何不确定性。
  • 非负性,即信息熵不能为负。这个很好理解,因为负的信息,即你得知了某个信息后,却增加了不确定性是不合逻辑的。
  • 累加性,即多随机事件同时发生存在的总不确定性的量度是可以表示为各事件不确定性的量度的和。写成公式就是:事件A,B同时发生,两个事件相互独立,那么信息熵H(A,B)=H(A)+H(B)。

举个例子:在一次足球比赛之后,怎么知道32个球队里谁是冠军,最少需要询问多少次。当每个球队获胜概率相等时,每次询问用折半查找的原理(如“冠军队伍在1-16吗?”)可以减少一半的队伍,这样就需要5次就能知道结果了( log32=5 l o g 32 = 5 ),使用信息熵计算公式计算信息量: 31i=0132log132=5 − ∑ i = 0 31 1 32 l o g 1 32 = 5 ,也就是这个问题的信息量是5Bit。而在问过一次之后,我们可以知道冠军在哪16个队伍中,也就是说我们获得了1bit的信息后不确定性减少,等于信息熵变成了 l5bit1bit=4bit=log16 l 5 b i t − 1 b i t = 4 b i t = l o g 16 ,这里的16,32可以视为当前事件的所有可能性。

排序算法

对于一个排序问题来说,因为n个数据的先后顺序是随机的,我们可以看做不确定性相等。信息熵则为 H(x)=log()=log(n!) H ( x ) = l o g ( 所 有 可 能 性 ) = l o g ( n ! ) ,而n趋近无穷时 log(n!) l o g ( n ! ) 近似于 lognn=nlogn l o g n n = n l o g n (事实上是 nlog2nnlog2e n l o g 2 n − n l o g 2 e ),关于这个结论更详细的从讨论在这里

对于基于比较的排序算法而言,假设我们一次比较所得到的平均信息量是1bit(当每次比较的结果是等概率时为1bit,如果结果不是等概率的就会小于1bit,类似于球赛问题),那么要想消除消息的不确定性至少需要获得(nlogn)bit数据,也就是要比较nlogn次。但因为各种基于比较的排序算法策略不同,我们不可能每次都能获得1bit数据,所以按照信息熵的定义这是理论上基于比较的排序算法的最优的结果。而最佳的排序算法就是要每次获得1bit数据,越接近于1则越有效。

这篇博客用信息熵的观点解释了在实际中为什么堆排序的比较次数多于快速排序,博客的译文。一句话总结就是:堆排的比较产生的结果不是等概率的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值