【发布时间】:2020-05-16 05:25:17
【问题描述】:
假设我有以下列表:
x = [[1, 2, 3, 4, 5, 6, 7], # sequence 1
[6, 5, 10, 11], # sequence 2
[9, 8, 2, 3, 4, 5], # sequence 3
[12, 12, 6, 5], # sequence 4
[5, 8, 3, 4, 2], # sequence 5
[1, 5], # sequence 6
[2, 8, 8, 3, 5, 9, 1, 4, 12, 5, 6], # sequence 7
[7, 1, 7, 3, 4, 1, 2], # sequence 8
[9, 4, 12, 12, 6, 5, 1], # sequence 9
]
基本上,对于在列表中任意位置包含目标编号5(即target=5)的任何列表,最常观察到的长度为M=4 的顶级N=2 子序列是什么?
所以,条件是:
- 如果列表中不存在
target,那么我们将完全忽略该列表 - 如果列表长度小于
M,那么我们将完全忽略该列表 - 如果列表的长度正好是
M但target不在Mth位置,那么我们将忽略它(但如果target在Mth位置,我们就计算它) - 如果列表长度
L比M长并且target在i=M位置(ori=M+1position, ori=M+2position, ...,i= Lposition) then we count the subsequence of lengthMwheretarget`在子序列的最后位置
因此,使用我们的列表示例,我们将计算以下子序列:
subseqs = [[2, 3, 4, 5], # taken from sequence 1
[2, 3, 4, 5], # taken from sequence 3
[12, 12, 6, 5], # taken from sequence 4
[8, 8, 3, 5], # taken from sequence 7
[1, 4, 12, 5], # taken from sequence 7
[12, 12, 6, 5], # taken from sequence 9
]
当然,我们想要的是频率最高的N=2 子序列。因此,[2, 3, 4, 5] 和 [12, 12, 6, 5] 是计数最多的两个最频繁的序列。如果 N=3 则所有子序列 (subseqs) 将被返回,因为第三个存在平局。
重要
这是超级简化的,但实际上,我的实际序列列表
- 由数十亿个正整数列表(1 到 10,000 之间)组成
- 每个列表可以短至 1 个元素,也可以长达 500 个元素
-
N和M可以小到 1 也可以大到 100
我的问题是:
- 假设
N和M总是小于100,是否存在允许快速查询的有效数据结构? - 是否有已知算法可以对
N和M的各种组合执行这种分析?我查看了后缀树,但我必须推出自己的自定义版本才能接近我需要的。 - 对于同一个数据集,我需要反复查询该数据集的各种值或
target、N和M的不同组合(其中target <= 10,000、N <= 100和`M
【问题讨论】:
-
我认为您进入了错误的 StackExchange 站点。
-
对于现实世界的问题来说,这是一个合理的数据科学问题
-
我认为在反转和连接您的列表后,您可以使用自定义的suffix array。当您的目标号码出现时,您基本上为所有以您的目标号码开头的后缀构建一个LCP-Array(考虑到停止符号)。如果您期望多个查询具有相同的目标编号和不同的 M,那么您也可以预先计算 LCP-Array。
-
如何计算两个或多个满足条件的目标?
-
@Neil 这将是“全部”。这正是序列 7 中发生的情况。但是,这也取决于
N是什么,因为我们感兴趣的是N与target的最频繁子序列。和长度M
标签: algorithm