Database 子集查询的快速响应

Database 子集查询的快速响应,database,algorithm,data-structures,Database,Algorithm,Data Structures,我有一个10000个整数向量的数据库,从1到1000。每个向量的长度最多可达1000。例如,它可以如下所示: vec1: 1 2 56 78 vec2: 23 34 35 36 37 38 vec3: 1 2 3 4 5 7 vec4: 2 3 4 6 100 ... vec10000: 13 234 现在,我想以一种能够快速响应特定类型请求的方式存储该数据库。每个请求将以整数向量的形式出现,最长可达10000: query: 1 2 3 4 5 7 56 78 100 响应应该是作为该查询

我有一个10000个整数向量的数据库,从1到1000。每个向量的长度最多可达1000。例如,它可以如下所示:

vec1: 1 2 56 78
vec2: 23 34 35 36 37 38
vec3: 1 2 3 4 5 7
vec4: 2 3 4 6 100
...
vec10000: 13 234
现在,我想以一种能够快速响应特定类型请求的方式存储该数据库。每个请求将以整数向量的形式出现,最长可达10000:

query: 1 2 3 4 5 7 56 78 100
响应应该是作为该查询字符串子集的向量的索引。例如,在上面的列表中,只有
vec1
vec3
是查询的子集,因此这种情况下的响应应该是

response: 1 3
此数据库不会更改,因此您可以以任何可能的方式对其进行预处理。您可以指定查询也可以采用任何协议,只要信息相同。例如,它可以是排序列表或布尔表


对数据库和查询进行编码以获得尽可能高的响应率的最佳策略是什么?

因为您使用的是python,所以这种方法似乎很简单。(对于任何其他语言,它也是可实现的,但将包括模块算术等)

因此,对于1-1000之间的每个数字,给它分配一个素数。所以

1 => 2
2 => 3
3 => 5
4 => 7
...
...
25 => 97
...
...
1000 => 7919
对于每个集合,使用其值作为集合中所有值的乘积生成的哈希函数

如果你的向量,vec-x={1,2,5,25},vec-x=2*3*11*97

类似地,您的查询向量可以如上所述进行计算。让它的值为Q


如果Q%vec-i==0,则它是一个子集,否则不是。

因为您使用的是python,所以此方法似乎很简单。(对于任何其他语言,它也是可实现的,但将包括模块算术等)

因此,对于1-1000之间的每个数字,给它分配一个素数。所以

1 => 2
2 => 3
3 => 5
4 => 7
...
...
25 => 97
...
...
1000 => 7919
对于每个集合,使用其值作为集合中所有值的乘积生成的哈希函数

如果你的向量,vec-x={1,2,5,25},vec-x=2*3*11*97

类似地,您的查询向量可以如上所述进行计算。让它的值为Q


如果Q%vec-i==0,则它是一个子集,否则不是。

如何将向量列表预处理为指标矩阵并使用矩阵乘法,例如:

将numpy导入为np
#生成长度为[0-1000]的10000个随机向量
#和[0-1000]中的元素
向量=[np.random.randint(1000,大小=n)
对于np.random.randint中的n(1000,大小=10000)]
#生成指标矩阵
database=np.zero((10000,1000),dtype='int8')
对于i,枚举中的向量(向量):
数据库[i,向量]=1
长度=数据库.sum(轴=1)
def查询(ints):
tmp=np.zero(1000,dtype='int8')
tmp[ints]=1
返回np.where(database.dot(tmp)=长度)[0]
数据库行和转换查询的点积将等于查询中该行的元素数。如果这个数字等于行中元素的总数,那么我们找到了一个子集。请注意,这使用基于0的索引

下面是对示例数据的修订

vectors=[[1,2,56,78],
[23, 34, 35, 36, 37, 38],
[1, 2, 3, 4, 5, 7],
[2, 3, 4, 6, 100],
[13, 234]]
database=np.zeros((51000),dtype='int8')
对于i,枚举中的向量(向量):
数据库[i,向量]=1
长度=数据库.sum(轴=1)
打印查询([1,2,3,4,5,7,56,78,100])
#基于[0,2]0的索引

如何将向量列表预处理为指标矩阵并使用矩阵乘法,例如:

将numpy导入为np
#生成长度为[0-1000]的10000个随机向量
#和[0-1000]中的元素
向量=[np.random.randint(1000,大小=n)
对于np.random.randint中的n(1000,大小=10000)]
#生成指标矩阵
database=np.zero((10000,1000),dtype='int8')
对于i,枚举中的向量(向量):
数据库[i,向量]=1
长度=数据库.sum(轴=1)
def查询(ints):
tmp=np.zero(1000,dtype='int8')
tmp[ints]=1
返回np.where(database.dot(tmp)=长度)[0]
数据库行和转换查询的点积将等于查询中该行的元素数。如果这个数字等于行中元素的总数,那么我们找到了一个子集。请注意,这使用基于0的索引

下面是对示例数据的修订

vectors=[[1,2,56,78],
[23, 34, 35, 36, 37, 38],
[1, 2, 3, 4, 5, 7],
[2, 3, 4, 6, 100],
[13, 234]]
database=np.zeros((51000),dtype='int8')
对于i,枚举中的向量(向量):
数据库[i,向量]=1
长度=数据库.sum(轴=1)
打印查询([1,2,3,4,5,7,56,78,100])
#基于[0,2]0的索引

任何向量的内容可以是什么,即向量中的最大值?@vish4071“1到1000之间的整数”——即数据库和查询中的字母表。向量内容是否唯一?也就是说,它们可以作为集合存储吗?@wflynny绝对可以。您可以将它们视为集合,因为重复的元素仅被视为一个。这是Python问题还是数据库问题?您想知道如何构造一个数据库,以便查询它(例如,使用SQL)并返回子集向量的索引,还是想知道如何构造您在Python中描述的数据?任何向量的内容都可以是什么,即向量中的最大数?@vish4071“从1到1000的整数”--这是数据库和查询中的字母表。向量内容是唯一的吗?也就是说,它们可以作为集合存储吗?@wflynny绝对可以。您可以将它们视为集合,因为重复的元素仅被视为一个。这是Python问题还是数据库问题?您想知道如何构造一个数据库以便查询它(例如,使用SQL)并返回子集向量的索引,还是想知道如何构造您在Python中描述的数据?谢谢!来想想吧。不使用素数和mul怎么样