OEIS如何进行后续搜索?

时间:2014-08-16 13:51:23

标签: algorithm search data-structures subsequence oeis

Online Intecyclopedia of Integer Sequences支持搜索包含您的查询作为子序列的序列,例如。搜索subseq:212,364,420,428将返回8*n+4序列。 (http://oeis.org/search?q=subseq:212,364,420,428

这个惊人的功能显然是由Russ Cox实现的http://oeis.org/wiki/User:Russ_Cox/OEIS_Server_Features实现的,但没有用它实现的算法来指定。

我想知道它是如何完成的。对于搜索引擎来说,每次搜索显然要经过近一百万个序列是不切实际的。只保留一个索引(这是同一个Russ Cox对谷歌代码正则表达式搜索的方式)的第一个数字和暴力强迫其余的也不起作用,因为像0这样的数字几乎在所有序列中。事实上,像0 1这样的查询匹配了整个数据库的高百分比,因此算法需要一个对所需输出大小敏感的运行时间。

有没有人碰巧知道这个功能是如何实现的?

2 个答案:

答案 0 :(得分:2)

我的猜测是数据的一部分存储在倒排索引中。即,每个数字链接到一组系列,并且当输入多个序列时,显示该组公共序列。这非常快,几乎每个搜索引擎都使用它。

存储为后缀树或任何链接的数据结构对此应用程序无用。

至少对于某些序列集(例如ax + b),我认为最好是以参数方式保存它们而不是存储实际序列。

答案 1 :(得分:0)

首先,在线搜索似乎只能使用高达1000的数字。它是否适用于更大的数字?其次,出于好奇心,对于你提供的例子,出于某种原因,OEIS没有列出A000027,这只是自然数字,但显然它应该匹配。

基于数据库的解决方案

如果这纯粹是在DB中实现的,对于4项搜索,它就是这样的。

序列{seqid,seqname等}}

seqitem {value,seqid,location}

查询

选择si1.ds,si1.location,si2.location .... 来自seqitem si1,seqitem si2,seqitem si3,seqitem si4 其中si1.seqid = si2.seqid和si2.seqid = si3.seqid和si3.seqid = si4.seqid 和si1.location< si2.location和si2.location< si3.location和si3.location< si4.location 和si1.value = $ v1和si2.value = $ v2和si3.value = $ v3和si4.value = $ v4