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
这样的查询匹配了整个数据库的高百分比,因此算法需要一个对所需输出大小敏感的运行时间。
有没有人碰巧知道这个功能是如何实现的?
答案 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