代码之家  ›  专栏  ›  技术社区  ›  jakogut

搜索数组n和m的一个好算法是什么,以便找到n中也存在于m中的元素?

  •  2
  • jakogut  · 技术社区  · 14 年前

    我有两个数组,n和m。它们都是任意大小的,虽然n通常小于m。我想找出n中的哪些元素也存在于m中,以尽可能快的方式存在。

    为了给您一个可能的程序实例的例子,n是一个数组,大小为12个单位,m是一个数组,大小为1000个单位。我想找出n中哪些元素也存在于m中(可能没有匹配项)。解越平行,效果越好。

    我曾经用过散列图,但它并不像我希望的那样高效。

    输入这个,我就想到在sizeof(n)独立线程上运行m的二进制搜索。(使用CUDA)我会看到这是如何工作的,尽管其他建议是受欢迎的。

    2 回复  |  直到 14 年前
        1
  •  1
  •   danben    14 年前

    1000是一个非常小的数字。另外,请记住,并行搜索只会随着内核数量的增加而加速。如果线程多于核心,则由于上下文切换和聚合信息,应用程序将再次开始减速。

    对于您的问题,一个简单的解决方案是使用哈希连接。从生成哈希表 M ,然后查找 N 在它中(或者反之亦然;因为两个数组都很小,所以没什么关系)。

    编辑 :作为对你的评论的回应,我的回答变化不大。只有当线程数等于处理器数,而不是超过处理器数时,才能线性加速。

    如果您想要实现一个并行散列连接,这并不困难。首先构建X-1哈希表,其中X是您拥有的线程/处理器数量。使用第二个散列函数返回值modulo x-1,以确定每个元素应位于哪个散列表中。

    在执行搜索时,您的主线程可以将辅助哈希函数应用于每个元素,以确定要将其传递给哪个线程进行搜索。

        2
  •  1
  •   phkahler    14 年前

    只需对n进行排序。然后对m的每个元素进行二进制搜索,搜索排序后的n。即使对大小为12的未排序n进行线性搜索,在n中查找m项也是非常平行的。