是否可以存储千字节块和指针的所有可能排列?


23

这是一个很难缠住我的主意的想法,我将不胜感激任何编辑/帮助,以使其对于那些熟悉的人来说更具可读性。

从理论上讲,是否有可能在硬盘上保存一个千字节的每个可能二进制排列的一个副本,然后让系统的其余部分简单地创建指向这些位置的指针?

这样制作的系统会比简单地直接存储信息快吗?

要解释另一种方式,请说而不是句子:

“你好,我是鲍勃。” 和“那个三明治看起来很好吃。”

...存储在硬盘驱动器上,我们会将字母和其他字符的所有排列替换为某个数字(例如1000个字符左右),然后将句子存储为:

[Pointer#21381723]


21
您不妨考虑一下,可能有多少条独特的英语推文?世界人口需要多长时间才能大声朗读它们?。您正在处理非常大的数字。

您可能会发现有趣的git如何工作,称为content addressable
JDługosz

5
github.com/philipl/pifs基于与您的想法相同的原理,除了使用pi而不是全部kb进行排列。
Waxen

12
您的指针必须为1千字节长。您可以选择不存储英语中没有意义的块-在这种情况下,您已经独立地重新发明了压缩的思想!
user253751

基本答案是否定的-由于排列的数目和大小,这是不可能的,但是您认为有什么可能的应用对可能有用呢?
2015年

Answers:


91

有2 8192个可能的不同1K块。将它们全部存储将需要2 8202位存储。由于宇宙中只包含约10 80(或约2 266)的颗粒,这是一个安全的赌注,这是不是可以存储所有这些,你不必了解它是否会节省时间,或不奇怪。

但实际上,有一种更有趣的答案。您建议在庞大的常量池中创建索引。但是您怎么知道要取消引用哪个索引?想象一下,一个参数的缘故,你要只存储1个字符块:abc...想必你的指数是0,1,2等,因为这是存储这些块的最有效的布局。

您是否注意到有关安排?实际上,您的索引是存储数据的编码表示!换句话说,您根本不必取消引用,只需要将索引转换为所需的数据即可。

当您将某物的所有可能值存储在表中时,总是会发生这种情况:索引仅是数据本身的编码版本,因此首先不需要存储数据。这就是为什么在现实世界中,索引仅对稀疏数据有用(例如,您访问过的所有网页,并非所有可能存在的网页,甚至所有确实存在的网页)。


17
所以,在某种程度上,我们已经使用这个系统-但我们正在与千字节大小的位模式的懒惰的评价,这让我们节省做的存储空间!
Theodoros Chatzigiannakis 2015年

3
由于重叠(1024个零,后跟1024个零,其中包含1025个唯一模式),因此存储量有所减少……虽然减少了,但仍然过大。另外,一个1KB的块是2 <sup> 13 </ sup>位,而不是2 <sup> 10 </ sup>。
Ben Voigt

2
请注意,宇宙中粒子的10 ^ 80限制并不直接意味着您不能在宇宙中存储超过10 ^ 80位-因为对于每个粒子,您都可能存储超过一位的信息(取决于它在宇宙中的位置,以及可能的速度等)。但这并不意味着您可以存储每个1K块-块的数量比粒子的数量大得多,因此,您不能将它们全部存储还是很安全的选择!
psmears

2
@Neil如果您有一个编码系统,可以通过将其编码为“ 10 ^ 80”来存储10 ^ 80,那么如何存储“ 10 ^ 80”呢?如果某些数据的编码比实际数据短,则其他数据必须编码更长。或者,如果您所有的数据都是数字,那么您会将每个十进制数字存储为一个字节。
Random832

3
使用de Bruijn序列, 2 ^ 1024位就足够了。
gronostaj

20

正如其他人已经指出的,1k块有2 ^ 8192个可能性。这意味着,如果所有块地址都用相同数量的比特编码,则需要8192个比特对一个块的地址进行编码,因此您的地址长度为1k。除了添加间接层之外,您将不会获得任何好处,因此您将不会获得任何性能。

如果您想使用较短的地址,则必须对一些具有较短地址的块进行编码,而对具有较长地址的块进行编码,以使较长的块不会经常出现,而现在您只是在压缩数据(可能使用类似一个霍夫曼码)。在存储数据或对编码进行定期更改之前,这需要了解您存储的数据。它也可能不如使用不同长度块的其他压缩算法有效。


1

这有两个问题。

首先,“一个千字节的所有可能二进制排列”是大量数据。1024字节*每字节8位=千字节中的8192位。所有可能的排列将是2 ^ 8192。大约1.09e+2466千字节!(出于比较目的,1 TB驱动器为1e09千字节。)

其次,即使您确实有这么大的表,并且使用指针对其进行了索引,但是如果您要引用一些小于1 KB的数据,该怎么办?


2
此外,存储所有小于1 KB的块不会占用太多空间。假设仅字节大小的块,则较小块的大小加在一起仅略大于1KB块大小的1/256。假设位大小为块,则再次添加大约相同的大小。
圣保罗Ebermann

-1

正如其他发布者所指出的,在某些时候,索引到所有可能值列表中所需的指针大小会使您的收益无效。

但是,某些语言会使用您建议内容的有限版本,以优化内存使用。Python使用字符串“ interning”来减少内存中重复字符串的数量。您可以通过搜索“ python string intern”找到更多信息。


1
OP正在询问一个密集集,其中包含每个排列。指针仅对稀疏数据有用,在稀疏数据中,保持指针所需的位小于所指向的位。如果存在重复项,则实习可以使空间更加稀疏,因此那里存在联系,但是您的回答并不能很好地说明问题。
彼得·科德斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.