繁体   English   中英

在两个数组中计数相同的值

[英]Counting identical values in two arrays

给定两个大小为m的整数A和B的数组,其值在[-n,n]范围内。 我想要一种算法来计算A和B中有多少个通用值,如果重复一个值,我们只会对其计数一次,例如:A = {2,2,14,3}和B = {1,2,14 ,, 14,5}算法应返回2。 问题是我需要在O(m)时间内执行此操作。

我的尝试是创建一个大小为2n的数组C。 然后将A和B的所有值增加n,然后计算A的值,例如:C [A [i]] = 1,这将花费O(m)时间和O(1)时间来创建数组。 然后遍历B并计算我在C中遇到的1。

到目前为止,这听起来不错,但是我首先不知道C中有什么,可能是那里已经有1了,这会错误地增加计数器,并且初始化C会花费O(n)时间。

有任何想法吗? 谢谢你

编辑:我有一个答案,所以我将其发布在这里:

  1. 创建大小为2n的数组C
  2. 对于i = 1到m:C [A [i]] = 0
  3. 对于i = 1到m:C [B [i]] = 1
  4. 初始化计数器:counter = 0
  5. 对于i = 1到m:如果C [A [i]] = 1,则counter ++和C [A [i]] = 2
  6. 退货柜台

这样,如果在遍历B时也必须访问C [A [i]],那么C [A [i]]将仅为1,这样我们就完全控制了实际上需要访问的所有数组插槽,即使没有先将其初始化为0或的东西。 当再次检查C [A [i]]的任何一个是否为1时:如果是,为避免回到那里并再次看到1,我们将其增加到2。

总的来说,这是O(m)时间。

您可以将C中的所有值都初始化为0。之后,根据我从您的声明中获得的结果,您的方法是这样的:

  1. 维护一个count变量并将其初始化为0。
  2. 对于数组A中的每个整数x,设置C [x] = 1
  3. 然后,对于数组B中的每个整数y,如果C [x]为1,则增加您的计数变量。

这将使您的时间复杂度为O(n),但空间复杂度将为O(n),因为您必须初始化C中的每个值,这效率极低。

要解决此问题,请使用哈希映射哈希集而不是数组。 使用哈希映射不需要您对现有代码进行任何修改,但是使用哈希集更适合在此处使用(并且更节省空间)。 它们将为您提供O(m)的空间复杂度,同时保持时间复杂度不变。

另外,如果要在O(1)空间上进行操作并且允许对数组进行修改,则一种方法是对数组进行排序,然后使用在O(m lg(m))中有效的2指针方法。

我所做的就是创建一个函数,该函数接收2个int数组并返回有多少个公共值。

(这可能不是最优化的方法,但从未明确指出必须如此)

所以这是我的做法:

  1. 制作了一个函数,该函数返回没有重复的数组。
  2. 创建2个本地int数组,这些数组将保存给定的数组而不重复。
  3. 嵌套循环通过两个局部数组,并检查它们是否具有公共值,如果为true,则递增计数器

我希望这给你一些新的想法

使用哈希集而不是数组。 这将是O(m),而不必大惊小怪。

与哈希表实现相比,使用所描述的数组的唯一优势是数组版本可以使用较少的空间,但是如果空间不成问题,则哈希集版本会更加清晰,因为这是哈希集的目的用于。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM