Algorithm 在N个数组中查找公共元素

Algorithm 在N个数组中查找公共元素,algorithm,Algorithm,如果我有N个数组,那么找到公共元素的最佳方法是什么(时间复杂度。空间不重要)。您只需找到1个元素并停止 编辑:元素都是数字 编辑:这些是未排序的。请不要排序和扫描 这不是家庭作业问题。很久以前有人问我这个问题。他用散列法解决问题,问我是否有更好的方法 最直接的方法是将前两个阵列相交,然后将此相交点与剩余的N-2个阵列相交 如果“交叉点”未在您工作的语言中定义,或者您需要更具体的答案(即您需要“如何进行交叉点”的答案),则修改您的问题 没有排序,就没有一种基于给定信息的优化方法。(即对所有元素进行

如果我有N个数组,那么找到公共元素的最佳方法是什么(时间复杂度。空间不重要)。您只需找到1个元素并停止

编辑:元素都是数字

编辑:这些是未排序的。请不要排序和扫描


这不是家庭作业问题。很久以前有人问我这个问题。他用散列法解决问题,问我是否有更好的方法

最直接的方法是将前两个阵列相交,然后将此相交点与剩余的N-2个阵列相交

如果“交叉点”未在您工作的语言中定义,或者您需要更具体的答案(即您需要“如何进行交叉点”的答案),则修改您的问题


没有排序,就没有一种基于给定信息的优化方法。(即对所有元素进行相对排序和定位,然后对数组长度进行迭代,同时检查所有数组中定义的元素)

最直接的方法是将前两个数组相交,然后将此相交处与剩余的N-2个数组相交

如果“交叉点”未在您工作的语言中定义,或者您需要更具体的答案(即您需要“如何进行交叉点”的答案),则修改您的问题


没有排序,就没有一种基于给定信息的优化方法。(即对所有元素进行相对排序和定位,然后在数组长度上迭代,同时检查所有数组中定义的元素)

我首先从退化情况开始,查找两个数组之间的公共元素(稍后将详细介绍)。从那里我将有一个公共值的集合,我将使用它作为数组本身,并将其与下一个数组进行比较。此检查将执行N-1次,或直到公共元素的“进位”数组降到大小0为止

我想,通过分而治之,将N个数组拆分为一棵树的末端节点,可以加快速度。树上的下一层是N/2个公共元素数组,依此类推,直到顶部有一个填充或未填充的数组。无论哪种情况,你都会得到答案


在不进行排序和扫描的情况下,比较两个数组的公共元素的最佳运行速度是O(N2)。

我首先从退化情况开始,在两个数组之间查找公共元素(稍后将对此进行详细介绍)。从那里我将有一个公共值的集合,我将使用它作为数组本身,并将其与下一个数组进行比较。此检查将执行N-1次,或直到公共元素的“进位”数组降到大小0为止

我想,通过分而治之,将N个数组拆分为一棵树的末端节点,可以加快速度。树上的下一层是N/2个公共元素数组,依此类推,直到顶部有一个填充或未填充的数组。无论哪种情况,你都会得到答案


在不进行排序和扫描的情况下,比较两个数组中常用元素的最佳运行速度是O(N2)。

创建一个哈希索引,元素作为键,计数作为值。循环遍历所有值并更新索引中的计数。然后,运行索引并检查哪些元素的count=N。在索引中查找一个元素应该是O(1),再加上遍历所有M个元素应该是O(M)

如果要保持特定于某个输入数组的顺序,请循环该数组并按该顺序测试索引中的元素计数

一些特殊情况:

如果您知道元素是(正)整数,其最大值不太高,则可以使用普通数组作为“散列”索引来保持计数,其中数字只是数组索引

我假设在每个数组中,每个数字只出现一次。调整它以适应更多的出现应该很容易(在第i个数组的计数中设置第i位,或者仅在当前元素计数=i-1时更新)


编辑当我回答这个问题时,这个问题没有比散列更好的部分。

创建一个散列索引,元素作为键,计数作为值。循环遍历所有值并更新索引中的计数。然后,运行索引并检查哪些元素的count=N。在索引中查找一个元素应该是O(1),再加上遍历所有M个元素应该是O(M)

如果要保持特定于某个输入数组的顺序,请循环该数组并按该顺序测试索引中的元素计数

一些特殊情况:

如果您知道元素是(正)整数,其最大值不太高,则可以使用普通数组作为“散列”索引来保持计数,其中数字只是数组索引

我假设在每个数组中,每个数字只出现一次。调整它以适应更多的出现应该很容易(在第i个数组的计数中设置第i位,或者仅在当前元素计数=i-1时更新)


编辑当我回答问题时,问题中没有比散列更好的方法。

问题问有比散列更好的方法吗。由于散列每个元素的时间通常是恒定的,因此没有比散列更好的方法(即,时间复杂度更好)。经验性能也是有利的,特别是如果值的范围可以一对一地映射到一个数组中。然后,时间与所有阵列中的元素数量成比例。排序不会提供更好的复杂性,因为这仍然需要至少访问每个元素一次,然后还有用于对每个数组进行排序的logn

回到散列,从性能的角度来看,不使用散列将获得最佳的经验性能