查找由值组成的整数对数

时间:2011-10-16 13:01:20

标签: algorithm

如果我们有一个整数数组,那么除了O(n ^ 2)之外是否有任何有效的方法可以找到一个给定值相差的整数对? 例如,对于阵列4,2,6,7,整数对的数量相差2是2 {(2,4),(4,6)}。 感谢。

5 个答案:

答案 0 :(得分:5)

从列表中创建一个集合。创建另一个集合,其中所有元素都以增量递增。相交两组。这些是您的对的上限值。

在Python中:

>>> s = [4,2,6,7]
>>> d = 2
>>> s0 = set(s)
>>> sd = set(x+d for x in s0)
>>> set((x-d, x) for x in (s0 & sd))
set([(2, 4), (4, 6)])

创建集合是O(n)。相交集也是O(n),因此这是线性时间算法。

答案 1 :(得分:3)

将元素存储在多重集中,由哈希表实现。然后,对于每个元素n,检查多重集中n-2的出现次数并将它们相加。无需检查n+2,因为这会导致您对每对进行两次计数。

时间效率在平均情况下为O(n),在最坏情况下为O(n * logn)或O(n ^ 2)(取决于散列表实现)。如果多重集由平衡树实现,则为O(n * logn)。

答案 2 :(得分:2)

对数组进行排序,然后用两个指针扫描。假设第一个指向a,然后向前迈出第二个,直到找到a+2为止存在的位置。增加总数,如果它在那里。然后递增第一个指针并重复。在每一步中,第二个指针从它在上一步结束的位置开始。

如果数组中允许重复,那么你需要记住第二个重复的重复次数,这样你就可以将这个数字加到总数中,如果递增第一个指针再次产生相同的整数。

这是O(n log n)最坏的情况(对于排序),因为扫描是线性时间。

基于哈希表的固定宽度整数解决方案可以说它们预期是O(n)时间,这是O(n)最坏的情况,因为排序固定宽度整数可以使用基数排序来完成在O(n)。实际上更快的是另一个问题 - 哈希表很快但可能涉及大量内存分配(用于节点)和/或严重本地化的内存访问,具体取决于实现。

答案 3 :(得分:1)

注意,如果所需的差值为0且阵列中的所有元素相同,则输出的大小为O(n²),因此任何算法的最坏情况都必须为O(n²)。 (另一方面,正如其他人所指出的那样,平均案例或预期案例行为可能会明显改善。)

答案 4 :(得分:0)

只需对数组中的数字进行散列,就像计算sort一样。然后取两个变量,首先指向索引0,另一个指向索引2(或一般情况下为索引d)。 现在检查两个索引处的值是否为非零,如果是,则使用两个值中的较大值递增计数器,否则保持计数器不变,因为该对不存在。现在递增两个索引并继续,直到第二个索引到达数组的末尾。计数器的总值是具有差异d的对的数量。 时间复杂度:O(n) 空间复杂度:O(n)