高效查找整数列表开头的排列(Python)

问题描述 投票:0回答:0

问题: 在您选择的容器(表示为 {...})内查找 list/np.array(表示为 [...])开头的任意长度排列。
数据结构/算法得到一个任意长度的查询,需要返回相应的列表,如果没有匹配则返回一个空列表

例子:

{
[1, 15, 30, 20, 45],
[10, 1, 301, 45],
[15, 2, 255, 586, 950, 10124]
}

查询1: [30, 1]
预期回报:[]
→ 空列表,因为找不到匹配项的匹配 len(Query)=2 排列。
列表开始的可能长度为 2 的排列是 [1, 15], [15, 1], [10, 1], [1, 10], [15, 2], [2, 15]

查询2: [30, 1, 15]
预期回报:[1, 15, 30, 20, 45]
→ [30, 1, 15] 可以置换为 [1, 15, 30],对应于返回列表的开头

补充问题信息:
→ 列表中的索引 [...] 是唯一的整数(列表不包含两次相同的数字)
→ 列表具有任意但非常不同的长度 > 1,最多几百个整数。
→ 查询长度是可变的,不保证在容器中存在
→ 容器预计包含多达数百万个列表
→ 列表中的整数实际上是无界的,但预计是 < 1 million

天真,太慢了,解决方案:

Query = sort( Query )
for element in container:
  if ( sort( element[:lenQuery] ) ) == Query ): return ( element ) # cut first Query length element and compare sorted
return ( [] )

→ 这是不可行的,因为 {...} 包含数百万个元素,搜索应该每秒调用几百次。

我试过的

上面给出的简单实现可行,但速度太慢,无法成为可用的解决方案。

我正在考虑像字典(用于 O(1) 查找的散列图)这样的东西,它被修改为每个值/列表有多个键(以支持任意长度查询),然后为每个整数索引分配一个素值并使用产品作为哈希函数,这样哈希是置换不变的,但我不知道这是否是一个好的开始。

或者也许是基于有序集交集的东西......

python data-structures permutation lookup-tables
© www.soinside.com 2019 - 2024. All rights reserved.