簡體   English   中英

用於查找兩個非常大的列表之間重疊的最快算法?

[英]Fastest algorithm for finding overlap between two very large lists?

我正在嘗試用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. 我可以創建我想要的任何中間結構。 我正在嘗試使用擱架構建的倒置索引。

您可能應該首先將小列表存儲在一個集合中,因此查找速度更快。 這可以防止對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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM