连接有序数组的最佳方法是什么?

时间:2012-10-02 22:02:33

标签: algorithm

我有很少的整数数组。每个数组中的元素都是有序的。数组没有重复项。

我需要将所有数组合并为一个,因此结果数组只包含每个数组中存在的元素。

例如,我有数组

(1,2,3,4,5) (2,3,5) (1,2,4,5)

结果必须是(2,5)

实现最佳性能的最佳方法是什么?

3 个答案:

答案 0 :(得分:9)

如果预期数组包含许多不同的数字,并且所有数字中只有少数存在,

  • 选择两个最小的数组,按顺序逐步计算它们的交集(比如一个mergesort),O(len1 + len2)
  • 虽然并非所有阵列都已扫描,但选择下一个最小的阵列,并使用顺序扫描length(intersection)*log(length(array)) >= length(array)计算其与先前处理的阵列的交集的交点,并查找交叉点的元素否则array

最坏的情况复杂度是O(总和(长度)),如果你很幸运,你可以绕过k * sum(log(length)),其中k是交集中元素的数量。

答案 1 :(得分:4)

这应该有效:

  • 为每个数组创建一个索引
  • 如果对于每个数组,相应索引处的元素是相同的,则将该元素添加到结果列表中并将每个索引增加一个
  • 否则增加指向最低元素的索引
  • 重复直到超过第一个数组

如果数组可以包含多个数字实例,例如,这也应该有效。数组(1,1,2,2),(2,2,3,3)将导致(2,2)。

答案 2 :(得分:2)

这就是我的想法: 创建一个HashMap<Integer, Integer>就像numer->hits;     迭代所有数组:

  • 如果元素存在于hashMap中,则递增计数(值),即count ++;
  • 如果元素不存在则将count = 1写入值

毕竟你将拥有,number-&gt; count

1->1
2->3
3->2
4->2
5->3

所以你再次遍历HashMap并打印if(value == arrays.lenth)

所以空间是O(N)和O(N)步。

注意hashmap的访问是常量时间(yahoooooo)。