Algorithm OEIS如何进行子序列搜索?

Algorithm OEIS如何进行子序列搜索?,algorithm,search,data-structures,subsequence,oeis,Algorithm,Search,Data Structures,Subsequence,Oeis,在线整数序列百科全书支持搜索包含查询的子序列,例如搜索subseq:212364420428将返回8*n+4序列。() 这个惊人的特性显然是由Russ Cox和由实现的,但没有具体说明实现的算法 我想知道这是怎么做的。显然,对于一个搜索引擎来说,每次搜索都要经历近百万个序列是不切实际的。仅仅保留第一个数字的索引(这是同一个Russ Cox进行Google Code Regex搜索的方式)并强制执行其余数字也不起作用,因为像0这样的数字几乎存在于所有序列中。事实上,像01这样的一些查询匹配的数据库

在线整数序列百科全书支持搜索包含查询的子序列,例如搜索
subseq:212364420428
将返回
8*n+4
序列。()

这个惊人的特性显然是由Russ Cox和由实现的,但没有具体说明实现的算法

我想知道这是怎么做的。显然,对于一个搜索引擎来说,每次搜索都要经历近百万个序列是不切实际的。仅仅保留第一个数字的索引(这是同一个Russ Cox进行Google Code Regex搜索的方式)并强制执行其余数字也不起作用,因为像0这样的数字几乎存在于所有序列中。事实上,像
01
这样的一些查询匹配的数据库占总数据库的很大比例,因此算法需要对所需输出大小敏感的运行时间


有人知道这个功能是如何实现的吗?

我猜部分数据存储在反向索引中。也就是说,每个数字都链接到一组序列,当输入多个序列时,将显示公共序列集。这是非常快的,几乎每个搜索引擎都使用它

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


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

首先,在线搜索似乎只适用于1000以下的数字。它也适用于较大的数字吗?其次,出于好奇,例如您提供的示例,出于某种原因,OEIS没有列出A000027,这只是自然数,但显然应该匹配

基于数据库的解决方案

如果这完全是在DB中实现的,对于4项搜索,它将是这样的

桌子

序列{seqid、seqname等..}

seqitem{value,seqid,location}

质疑

选择si1.ds、si1.location、si2.location。。。。 来自第si1项、第si2项、第si3项、第si4项 其中,si1.seqid=si2.seqid和si2.seqid=si3.seqid和si3.seqid=si4.seqid 和si1.locationsi1.value=$v1和si2.value=$v2和si3.value=$v3和si4.value=$v4

我猜的是后缀数组或后缀树。序列中的数字的行为类似于字符串中的字符,这些数据结构允许在O(k)(或后缀数组的O(k log k))时间内查找长度为k的子字符串,而不管“数据库”的大小,n.@j_random_hacker注意到我说的是子序列,而不是子字符串。我不知道后缀数据结构的任何泛化,它允许快速的子序列查询。在OEIS上搜索空格分隔的数字是否会忽略顺序?只有~250k个序列,因此反向索引应该足够了。抱歉,您似乎必须编写
子q:x,y,z
。我只是觉得“太空版”是个速记。我更新了我的问题。通过一些快速测试,我认为OEIS可能容易受到DDOS攻击。查询
3 2 1 0
耗时2.1秒,返回语句“发现149461个结果,太多无法显示”。随后的相同查询在0秒内给出相同的结果。随后对
2 0 1 3
的语义等价查询花费了2.1秒,再次表示“找到149461个结果,太多了,无法显示”。因此,他们似乎明智地缓存了最近查询的结果,事实上,2秒对于暴力搜索来说是足够的时间。我认为没有DDoS,因为没有人反对OEIS!