用于查找两个非常大的列表之间重叠的最快算法?

时间:2012-05-03 02:23:30

标签: python algorithm list rdf

我正在尝试在Python中构建一个算法来过滤大块的RDF数据。

我有一个列表,其中包含大约7万个格式为<"datum">的项目。

然后,我有大约6GB的项目(三元组)格式为<"A"> <"B"> <"C">

我想提取包含第一个列表中任何项目的所有三元组,然后从第一个提取中提取包含任何单个项目的任何三元组(净效果是形成通过一步连接的图形的分区来自第一个清单的种子)。

我无法为此提出一个很好的算法(没有正确的CS训练,这没有帮助。)

到目前为止,我提出的最好的方法是首先将大列表中的三元组拆分为三个项目列表[<"A">, <"B">, <"C">]的列表。然后我将它分成块,并使用多处理创建进程,这些进程占用完整的小列表和大列表的一大块...

for line in big list:
    for item in small list:
      if item in line:
       bucket.append(line)

这个算法需要很长时间。

有没有更快的方法呢?如果有一个特定的算法,你可以给我一个名字,我会弄清楚如何实现它。

谢谢!

每条评论的澄清:

  1. 所有数据项都是字符串。因此,小列表可能包含["Mickey", "Mouse", "Minny", "Cat"],大列表可能包含[["Mickey","Pluto","Bluto"],["John", "Jane", "Jim]...]

  2. 每个大型列表三元组中只有一个项目需要匹配小型列表的项目才能计算

  3. 小列表中的所有项目实际上都是唯一的,所以我认为无论如何都不会将它们转换为集合。但我会尝试。

  4. 我可以创建我想要的任何中间结构。我正在尝试使用搁架构建的倒置索引。

1 个答案:

答案 0 :(得分:5)

您可能应该首先将小列表存储在一个集合中,因此查找速度更快。这可以防止对big_list中的每个项目进行70,000次迭代。

small_list_set = set(small_list)
for line in big_list:
    for item in line:
        if item in small_list_set:
            bucket.append(line)