【发布时间】:2020-05-13 00:46:16
【问题描述】:
假设我有以下列表:
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)的任何列表,在N=2 中最常观察到的长度为M=4 的子序列是什么?
所以,条件是:
- 如果列表中不存在
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的各种组合进行此类分析?
【问题讨论】:
-
看起来您实际上有 2 个相当独立的问题:1. 找到一种有效生成子序列流的方法,以及 2. 找到一种有效选择该序列中前 N 个条目的方法。对于 2. 您需要遍历所有子序列,并且您可能可以使用某种基于前缀的树结构来保持条目数。对于 1. 我认为您找不到不涉及完全遍历每个列表的方法,其缓存长度为 M 个条目。我想说最佳效率与元素总数成线性关系。
-
实际上,我想多了 - 因为 1. 如果空间对您来说不是问题,您可以使用字典。
-
作为一个单独的点,如果需要,这很好地并行化。
-
我认为你的一些编号是错误的,应该取自序列5 取自序列4,取自序列8 取自序列9?
-
为了避免需要缓存,您可以向后扫描每个列表,当您找到目标时,您的字典键是接下来的 M 个元素 - 如果还有 M 个元素。
标签: python algorithm list numpy graph