在多个链表中查找重复项的算法

标签 algorithm optimization linked-list

在多个(大型)链表中查找重复项的最快方法是什么。 我将尝试用数组来说明问题,而不是仅仅为了使其更具可读性。 (为了简单起见,我使用了 0-9 之间的数字而不是指针)。

list1[] = {1,2,3,4,5,6,7,8,9,0};
list2[] = {0,2,3,4,5,6,7,8,9,1};
list3[] = {4,5,6,7,8,9,0,1,2,3};
list4[] = {8,2,5};
list5[] = {1,1,2,2,3,3,4,4,5,5};

如果我现在问:“列表 1-5 中是否存在数字 8?”我可以对列表进行排序,删除重复项,对所有列表重复此操作并将它们合并到“ super 列表”中,然后查看(新)重复项的数量是否等于我搜索的列表数量。假设我得到了正确数量的重复项,我可以假设我搜索的 (8) 存在于所有列表中。 如果我改为搜索 1,我只会得到四个重复项 — 因此在所有列表中都找不到。

是否有更快/更智能/更好的方法来实现上述目标而无需以任何方式排序和/或更改列表?

P.S.:问这个问题主要是出于纯粹的好奇心,没有别的! :)

最佳答案

只需将每个数字放入哈希表中,并将该项目出现的次数存储在表中。当你找到另一个时,只需增加计数器。 O(n) 算法(所有列表中的 n 项)。

如果你想存储每个出现的列表,那么你还需要一个集合表示来存储在每个项目下。您可以使用任何集合表示形式——位向量、列表、数组等。这将告诉您该项目所属的列表。这并没有改变 O(n),只是将工作量增加了一个常数。

关于在多个链表中查找重复项的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5942928/

相关文章:

list - 左弹出列表重建redis数据

mysql - 用于统计存储的大规模 MySQL 数据库 - 您有什么推荐?

mysql - 查询花费太多时间(100k 条记录需要 3 分钟)

c - c中逻辑运算符之间的空间

c - 添加节点后返回指向链表开头的指针?

mysql - SQL Server 2008 链接 MySQL 服务器慢

regex - 正则表达式生成器/缩减器?

java - InsertionSort 与间隙大小 = 1 的 ShellSort?

c++ - 如何找到小于或等于 X 的最大值和大于或等于 X 的最小值?

algorithm - Golang程序中的随机函数和持久化