如何快速搜索巴别图书馆?

时间:2015-12-04 22:22:45

标签: string search random search-engine

以下是来自用户@David

的巴别图书馆的描述
  

巴别图书馆网站(libraryofbabel.info)包含书籍   伪随机生成的文本,每个文本有410页,位于   图书馆的“地板”,“墙壁”和“架子”。任何序列都少   超过3200个字符(包括所有26个字母和句点,空格,   和逗号)可以在至少一本书中找到。

在网站上,您可以搜索字符串(最多3200个字符),该网站将返回3个结果: 1)只是一串文本本身,这是一个独特的页面 2)在随机字符中出现该字符串的任何地方 3)在实际英语单词的随机组合中出现该字符串的任何地方

令我难以理解 fast 搜索是怎样的。据推测,该网站实际上并不存储任何页面,它都是通过算法生成的(如果我错了,请纠正我)。如果是这样的话,几乎可以立即生成所有可能的组合,将它们分成随机字符,与英语单词相比,并告诉我字符串显示的页数是多少?即使有一些统计手淫,如果它告诉我有78482018页面符合我的查询,它更多的是估计,它仍然会立即返回20页。不认真。 右。程。

怎么这么快?

1 个答案:

答案 0 :(得分:1)

注意:这是一种数学答案

巴贝尔图书馆实际上并不存储任何东西,这意味着存储29 ^ 3200本书。

首先,我将首先解释伪随机函数是什么。一个好的伪随机函数会生成一个似乎是随机的数字序列,但是可以在给定足够信息的情况下进行预测。

以功能

为例

f(x)= x ^ 2 + c mod n,其中c和n是常数

如果我们从x = 2,c = 1和n = 20开始,通过重复将f(x)应用于前一个结果(迭代f(x)),我们将得到序列

2,5,6,17,10,1,2 ......并且循环重新开始...

因此,如果我们知道c,n和x的起始值(称为种子),则可以轻松预测以下数字。例如,使用6的种子,您可以预测后面的数字将是17,10和1.如果您想记住序列17,10,1,您只需要记住种子(17),和序列的长度(3)。

如果要枚举由Babel库使用的函数生成的完整序列,直到它循环回第一个数字,最终会得到一个包含所有*可能的3200个字符子串的字符串。要查找子字符串,只需要种子。

最后一招是找到一个可逆的函数,这意味着给定一个[sub]序列,可以找到种子。许多伪随机函数可以不费力地进行逆向工程,但在巴别图书馆的情况下,需要花费一些精力。

*几乎所有