Search 在另一个大列表中搜索一个大的单词列表

Search 在另一个大列表中搜索一个大的单词列表,search,Search,我有一个1000000个字符串的排序列表,最大长度为256个蛋白质名称。每个字符串都有一个关联的ID。 我还有一个未排序的列表,包含4000000000个字符串,最大长度为256个,包含文章中的单词,每个单词都有一个ID 我想找到蛋白质名称列表和文章单词列表之间的所有匹配项。 我应该使用哪种算法?我应该使用一些预构建API吗 如果该算法在没有特殊硬件的普通PC机上运行就好了 对算法所需时间的估计很好,但不是强制性的。听起来你可能应该使用二叉树。40亿个字符串需要搜索很多字符串 您可以将整个数据结

我有一个1000000个字符串的排序列表,最大长度为256个蛋白质名称。每个字符串都有一个关联的ID。 我还有一个未排序的列表,包含4000000000个字符串,最大长度为256个,包含文章中的单词,每个单词都有一个ID

我想找到蛋白质名称列表和文章单词列表之间的所有匹配项。 我应该使用哪种算法?我应该使用一些预构建API吗

如果该算法在没有特殊硬件的普通PC机上运行就好了


对算法所需时间的估计很好,但不是强制性的。

听起来你可能应该使用二叉树。

40亿个字符串需要搜索很多字符串

您可以将整个数据结构放入内存散列中进行快速查找,但更可能的情况是,您希望将整个列表存储在更大(但速度较慢)的磁盘上,在这种情况下,排序后的列表将适用于相对高效的二进制搜索算法

如果您的二进制搜索或此类函数在\u articles()中调用了
find\u string\u,则伪代码:

foreach $protein_name ( @protein_names ) {
    if ( $article_id = find_string_in_articles( $protein_name ) ) {
        print( "$protein_name matches $article_id\n" );
    }
}

您可以对它们进行排序,然后执行“合并排序”,这实际上不会合并,但会发现重复/重叠。维基百科在这方面有很好的参考资料

对如此数量的数据进行排序可能需要比您可访问的内存更多的内存。我不知道unix sort(也可以在Windows/Mac上使用)是否能处理这个问题,但任何一个像样的SQL数据库都能做到


另一种可能是在蛋白质名称上使用基数树(以go to bin a、B to bin B等开头)。然后,只需在这400万个单词上循环并定位重叠(您可能必须执行多个深基数装箱,以便一次丢弃更多的蛋白质)。

我将采用以下两种方法中的一种

  • 将其插入sql数据库并取出所需的数据(速度较慢,但更容易)
  • 对列表进行排序,然后进行二进制搜索以找到所需内容(快速但复杂)

  • 这本质上是一个关系连接。假设您尚未对文章单词进行排序,那么您的基本算法应该是:

    for word in article_words:
        if (proteins.find(word)):
            found_match(word)
    

    proteins.find()是最困难的部分,您必须进行实验才能获得最佳性能,这类问题正是缓存效果开始发挥作用的地方。我会首先尝试使用基数排序,它非常简单,而且可能足够快,但二进制搜索和哈希也是可选的方法。

    磁盘存储上的大多数搜索算法在性能方面都非常糟糕。交换集合,以便在内存中查找蛋白质,并按顺序扫描文章文字。我们如何在2020年用Python做到这一点?@pvarma:评论不是提出新问题的地方。