WOM编码与一次写入型存储器的重复使用Word格式文档下载.docx
《WOM编码与一次写入型存储器的重复使用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《WOM编码与一次写入型存储器的重复使用Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
这听上去似乎是神乎其神的“黑科技”,然而原理却异常简单。
由于“一次写入型存储器”(write-oncememory)的首字母缩写为WOM,因此重复多次使用一次写入型存储器的编码方案也就叫做WOM编码了。
上面展示的编码系统就是一个WOM编码,它可以重复2次利用3个bit的空间,每次都能写入2个bit的数据。
RonaldRivest和AdiShamir把这个WOM编码扩展为了一系列更大的WOM编码,使得我们能重复2k–2
+1次利用2k
–1个bit的空间,每次都能写入k个bit的数据。
不妨让我们以k=5为例,对此做一个简单的介绍吧。
所以,我们现在要说明的就是,如何重复9次利用31个bit的空间,每次都能写入5个bit的数据。
首先,把这31个bit的位置分别编号为00001,00010,00011,…,11110,11111。
然后我们规定,一个31位01串究竟表示哪5个bit,就看数字1的位置编号全都合在一起,各个位置上究竟有奇数个1还是偶数个1。
假设某个31位01串的第1位、第3位和第31位是1,其余的地方都是0。
把这3个位置的编号列出来,就得到00001,00011,11111。
在这3个编号中,左起第1位上的数字1共有1个,左起第2位上的数字1共有1个,左起第3位上1个,左起第4位上2个,左起第5位上3个。
其中,左起第1、2、3、5位上都是奇数个1,左起第4位上共有偶数个1。
因此,这个31位01串最终表达的值就是11101。
我们将会说明,只要这个31位01串里还有至少16个数字0,我们都能把最多两个0改成1,使得整个31位01串转而表达任意一个我们想要的新的值。
不妨假设这个31位01串当前表达的是11101,而我们现在想让它表达10110。
显然,如果在这个31位01串中,编号01011对应位置上的是数字0,我们把它改成数字1就行了。
如果在这个31位01串中,编号01011对应位置上的是数字1,这又该怎么办呢?
我们可以按照“同-异-同-异-异”的原则,把除了01011以外的30个编号分成15组:
(00001,01010)
(00010,01001)
(00011,01000)
(00100,01111)
(00101,01110)
(00110,01101)
(00111,01100)
(10000,11011)
(10001,11010)
(10010,11001)
(10011,11000)
(10100,11111)
(10101,11110)
(10110,11101)
(10111,11100)
于是,每一组里的两个编号都满足,左起第1位一共有0个或2个数字1,左起第2位一共有恰好1个数字1,左起第3位一共有0个或2个数字1,左起第4位一共有恰好1个数字1,左起第5位一共有恰好1个数字1。
其实,01011本来应该和00000配对,但00000并不在我们的编号范围里。
所以,01011也就没在上面的列表里出现。
但别忘了,这个31位01串里至少有16个数字0。
由于编号01011所对应的是数字1,因此所有的数字0都落在了上面30个编号上,其中必然会有两个数字0落到了同一组里。
把这两个0都改成1,整个31位01串所表达的值就能从11101变为10110了。
初始时,这个31位01串为000…00。
只要里面还有至少16个数字0,我们就可以对数据进行改写。
第一次改写显然只需要把一个0变成1即可,今后的每次改写也最多只会把两个0变成1。
因此,这个31位01串可以被我们重复使用9次。
根据同样的道理,一个2k
–1位01串就能被我们重复使用2k–2
+1次,每次写入的都是k个bit的数据。
这正是由RonaldRivest和AdiShamir扩展出来的WOM编码,它对于一切大于等于2的整数k都适用。
之前那个把300KB当两个200KB用的“黑科技”,其实不过是k=2时的一个特例罢了。
随着k值的增加,这个科技是“越来越黑”呢,还是“越来越不黑”呢?
在这类WOM编码中,我们可以把每2k
–1个bit当作k·
(2k–2
+1)个bit来用,其比值为k·
+1)/(2k
–1)。
这个比值越高,就代表每个bit的利用率越高。
当k=2时,这个比值只有1.333…;
当k=5时,这个比值为1.4516…;
当k=10时,这个比值增加到了2.51222…。
可见,这个科技是“越来越黑”的。
事实上,我们有(2k–2
–1)>
2k–2
/2k
=1/4,因此不管k是多少,整个比值都大于k/4了。
这立即证明了,在WOM编码中,单个bit的利用率可以达到任意大。
不过,k/4虽然成为了一个下界,但同时也成为了一个“槛”。
当k=20时,单个bit的利用率为5.00002384…;
当k=50时,单个bit的利用率为12.5000000000000555…。
随着k的增加,单个bit的利用率最终稳定在了k/4的水平。
单个bit的利用率能超越k/4的水平吗?
能!
我们可以让每个编号下都有多个bit。
例如,我们干脆用3100个bit的存储空间来表示5个bit的值,其中前100位的编号都是00001,下100位的编号都是00010,等等。
为了确定出这个3100位01串究竟表达了哪5个bit的值,我们就要先找出哪些编号所对应的100位01串里含有奇数个数字1,再把这些编号全都合在一起,看看各个位置上究竟有奇数个1还是偶数个1。
编码过程也就变得更简单了。
刚开始,这个3100位01串全是0,代表的值也就是00000。
如果你想写入数据00010,即对左起第4位取反,你就把编号为00010的那100个bit中的其中一个0改成1;
如果你想把它改写成01101,即对左起第2位、第3位、第4位、第5位都取反,你就把编号为01111的那100个bit中的其中一个0改成1;
如果你想再把它改写成01111,即再次对左起第4位取反,你就从编号为00010的那100个bit中再选一个0,并把它改成1……但是,这种新的WOM编码方案没什么实质性的意义,重复写入次数成倍增加了的同时,所用的存储空间也成倍增加了,单个bit的利用率仍然没有提高。
这里面有个原因:
频繁用到某个编号,对应的数字0将会很快用光。
为了解决这个问题,我们再出奇招:
允许用户根据需要给某个编号里再“充”一些的0。
把这些想法结合起来,我们就得到了一类更加“黑”的“表格式WOM编码”。
我们列一个大表格,表格里一共有100行,每一行都是105个bit,其中前5个bit表示编号,后100个bit则用于标记这个编号是否被选中,有奇数个数字1代表该编号要选,有偶数个数字1代表该编号不选。
所有选中的编号里,各个位置上究竟有奇数个1还是偶数个1,就决定了这10500个bit的存储空间究竟表达了哪5个bit的值。
每次改写本质上都是选中某个没选中的编号,或者取消掉某个选中了的编号。
如果这个编号所在的行里还有空余的0,我们只需要把其中一个0改成1即可;
如果这个编号所在的行都满了,或者整个表格里根本还没出现这个编号(比如初始时),我们就把新的一行的前5个bit设为这个编号,再把它后面的某个0改成1。
注意到,所有可能的编号也就只有00001,00010,…,11111共31种,并且每种编号都是用满一行才会再开一行。
这说明,我们每次都能顺利完成改写操作,直到表格中没填满的行不足31行为止。
在此之前,我们已经成功改写了(100–31)×
100=6900次。
总共10500个bit的存储空间,竟能6900次写入5个bit的数据,可见单个bit的利用率为5×
6900/10500=3.2857…。
进一步增加行数和列数,可以进一步增加单个bit的利用率。
如果整个表格一共有r行,每一行里都有5+s个bit,我们就能重复使用至少(r–31)·
s次,每次都能写入5个bit的数据。
因此,单个bit的利用率就是5·
(r–31)·
s/(r·
(5+s))。
当r和s足够大时,(r–31)/r会非常接近1,s/(5+s)也会非常接近1,因而整个分数就会非常接近5。
类似地,如果把5换成更大的k,单个bit的利用率也就能跟着上升为k,这优于之前的那个k/4。
但是,如此高的bit利用率,是由极其庞大的存储空间以及极其庞大的重写次数来支撑的,这很难有什么实际用途。
在生活中,我们可能更关心的是:
为了写入t次数据,每次数据量都是k个bit,至少需要几个bit的空间?
这个问题分析起来就非常困难了。
不妨让我们先从一些最简单的情形出发,一点一点开始探究。
为了重复2次写入2个bit的数据,我们可以只用3个bit的空间(即本文最开始讲到的WOM编码);
那么,同样是每次写入2个bit的数据,为了把写入次数从2次提升到3次,我们需要几个bit的空间呢?
我们先给出一个下界:
4个bit的空间是不够的。
事实上,我们将会证明,当t≥3时,要想重复t次写入2个bit的数据,只用t+1个bit的空间是办不到的。
首次写入的数据有00、01、10、11共四种可能,初始时的01串000…00最多只能表达其中一种可能,其他情况下我们都必须要往存储器里写数字1。
不妨假设首次写入数据a和数据b时,我们必须要往存储器里写数字1,其中a和b是{00,01,10,11}中的两个不同的元素。
在这段文字和下段文字中,我们假设,首次写入的总是a和b之一。
那么,下一步改写时写入的有可能是什么呢?
首次写入a后,接下来我们可以把它改写成b、c、d;
首次写入b后,接下来我们可以把它改写成a、c、d。
这里,c、d是{00,01,10,11}中的另外两个不同的元素。
这意味着,下一步改写时写什么都有可能。
容易看出,今后每次改写时更是写什么的都有了。
由于每次改写都会把至少一个0改成1,因此这就说明了,不管第t–1次写入的是{00,01,10,11}中的哪个元素,存储器里都有至少t–1个1。
为了给最后一次改写留下足够的空间,此时存储器里还得有至少两个0。
如果存储器一共只有t+1个bit的空间的话,你会发现这一切都抵得非常死:
不管第t–1次写入的是什么,存储器里都只能有恰好t–1个1,并且在最后一次改写时,把其中一个0改成1,把另外一个0改成1,以及把剩下的两个0都改成1,必须正好对应三种可能的改写值。
这说明,如果第t–1次写入的是a,把剩下的两个0都改成1就会得到一个与a不同的值;
如果第t–1次写入的是b,把剩下的两个0都改成1就会得到一个与b不同的值;
对于c和d也是同理。
因而,当存储器里写满了1时,它所表达的值既不能是a,也不能是b,也不能是c和d。
这个矛盾就表明,存储器里只有t+1个bit的空间的话是不够的。
别忘了我们正在探究的问题:
同样是每次写入2个bit的数据,为了把写入次数从2次提升到3次,我们需要几个bit的空间?
现在我们知道了,4个bit的空间是不够的。
那么,5个bit的空间够不够呢?
答案是肯定的。
我们可以把这5个bit分成两部分,前面一部分有2个bit,后面一部分有3个bit。
注意到,利用2个bit的空间可以写入1次2个bit的数据,利用3个bit的空间可以写入2次2个bit的数据,按照下面给出的方法把两者结合起来,我们就能利用5个bit的空间写入1+2=3次数据了。
下面,我们将会说明,假设每次所写的数据量都相同,如果重写t1
次可以用r个bit的空间办到,重写t2
次可以用s个bit的空间办到,那么重写t1
+t2
次一定可以用r+s个bit的空间办到。
这看起来似乎非常简单:
把r个bit和s个bit并排放置,先在前r个bit里使用前一种子编码系统,把t1
次重写用光了之后,再在后s个bit里使用后一种子编码系统,直到把t2
次重写用光。
解码时,我们就视情况只看前r个bit或者只看后s个bit:
如果后s个bit为空,则解码结果完全以前r个bit为准;
如果后s个bit里有东西,则解码结果完全以后s个bit为准。
太简单了,不是吗?
只可惜,这个办法有个问题。
如果在后一种子编码系统中,000…00正好对应了某个值(正如本文最开始讲到的WOM编码一样,000表示00),那么首次往后s个bit里写数据时就有可能让后s个bit仍然为空,解码也就出错了。
当然,我们可以额外用一个bit,专门用来表示刚才是在哪边写的数据。
但是,这样我们就用了r+s+1个bit的空间了。
那怎么办呢?
之前那些奇数个1偶数个1之类的思路,现在就又派上用场了。
我们仍然像刚才那样,前t1
次都在前r个bit里写,后t2
次都在后s个bit里写,但解码的方法有所变化:
假设前r个bit表示的值为a,假设后s个bit表示的值为b,那么所有r+s个bit表示什么值,就看a和b的各个位置上的数字1的总数的奇偶性。
举个例子吧:
假如在前一个子编码系统中,1101表示的值是10;
假设在后一个子编码系统中,001表示的值是11;
由于10和11的左起第1位上一共有偶数个1,左起第2位上一共有奇数个1,因此在整个编码系统中,1101001就表示01。
在编码时,不管是往哪边写东西,我们都只消写入要表达的值和另一边当前表达出的值在哪些位置上有差即可。
由于仅写1次2个bit的数据只需要2个bit的空间,重复2次写入2个bit的数据只需要3个bit的空间,因此重复3次写入2个bit的数据就只需要2+3=5个bit的空间了。
我们还可以把这种“合成式编码”继续用于t值更大的情况。
重复4次写入2个bit的数据需要多少个bit的空间呢?
我们可以把这4次拆成1次加上3次,也可以把这4次拆成2次加上2次,从而得到两种不同的WOM编码。
前一种需要2+5=7个bit的空间,后一种需要3+3=6个bit的空间,因而后者更优。
类似地,重复5次写入2个bit的数据可以用2+6=8个bit的空间办到,也可以用3+5=8个bit的空间办到,两者的效果相同。
我们来总结一下目前的发现。
不妨用f(t)来表示,为了重复t次写入2个bit的数据,目前已知的最优方案用了多少bit的空间。
当t=1,2,3,4,5时,f(t)的值分别为:
t
1
2
3
4
5
f(t)
6
8
仅写1次2个bit的数据,显然1个bit的空间是不够的,我们至少要用2个bit的空间。
为了重复2次写入2个bit的数据,显然2个bit的空间是不够的,我们至少要用3个bit的空间。
回想我们之前证明过的结论:
当t≥3时,要想重复t次写入2个bit的数据,只用t+1个bit的空间是办不到的,我们至少需要t+2个bit的空间。
不妨用g(t)来表示,为了重复t次写入2个bit的数据,目前已知的理论最少所需空间是多少bit。
当t=1,2,3,4,5时,g(t)的值分别为:
g(t)
7
容易看出,当t=1,2,3,4时,上界与下界是一致的,对应的最优化问题也就有了圆满的回答。
但是,t=5时的情形就不尽人意了:
我们有了一种只使用8个bit的方案,但只证明了7个bit是必需的。
那么,究竟是我们给出的方案还不够好,还是我们证明的结论还不够强呢?
RonaldRivest和AdiShamir给出了t=5时的一种只需要7个bit的编码方案,从而把t=5时的情形也完美地解决了。
为了说明这种新的编码是怎么工作的,我们不妨先讲一下它的解码过程。
我们把这7个bit看作一个7位01串,假设它是abcdefg。
如果这个01串中,数字1的个数小于等于4,则按照下述过程确定整个01串所表达的值。
∙初始值为00。
∙如果ab为10,则左边那一位取反。
∙如果ab为11,并且cd或ef之一为01,则左边那一位取反。
∙如果cd为10,则右边那一位取反。
∙如果cd为11,并且ab或ef之一为01,则右边那一位取反。
∙如果ef为10,则左右两位都取反。
∙如果ef为11,并且ab或cd之一为01,则左右两位都取反。
如果数字1的个数大于4,则按照下述过程确定整个01串所表达的值。
∙如果a、c、e、g中有偶数个1,则左边那一位为0。
∙如果a、c、e、g中有奇数个1,则左边那一位为1。
∙如果b、d、f、g中有偶数个1,则右边那一位为0。
∙如果b、d、f、g中有奇数个1,则右边那一位为1。
然后我们再来叙述一下,如何利用这个7位01串,5次得出任何我们想要表达的值。
首先注意到,最开始abcdefg=0000000所表达的值就是00。
表达一个新的值,本质上就是对当前的值进行下述三种操作之一:
左边那一位取反,右边那一位取反,左右两位都取反。
接下来我们就来说明,我们可以连续五次实现任何一种取反操作。
在数字1的个数小于等于4的时候,ab、cd、ef各对应一种取反操作。
刚开始,ab、cd、ef都为00。
如果把其中一个00变为10,就相当于执行了对应的取反操作;
如果再把这个10变成11,则相当于第二次执行该取反操作(即消除第一次取反的效果);
如果再把剩下的某个00变成01,则相当于第三次执行该取反操作;
如果再把这个01也变成11,则相当于第四次执行该取反操作(即消除第三次取反的效果)。
注意,取反的标记是10,让别人再次取反的标记是01,我们很容易把两者区分开来。
另外,ab、cd、ef当中一定是先出现11再出现01,并且不会出现两个11一个01的情况(否则数字1的个数就超过4个了)。
这说