找到具有限制的两个数组之间的交集

时间:2013-08-09 17:07:03

标签: arrays search optimization data-structures

我必须编写一个程序才能在两个数组之间找到相同的数字。 问题在于我必须以最优化的方式完成某些约束:

- 如果A [i] = B [w]且A [j] = b [x]且i,则i,j为数组A和w的索引,x为数组B的索引

- 这些数字之间的最大距离必须是k(由输入给出);

- 我必须在最大O(k)空间使用才能实现优化搜索的内容;

- 数字在每个数组中只出现一次(如集合)。

我正在考虑使用第一个数组的k个元素构建一个平衡的RBTree以优化搜索过程,但我对它所需的空间有疑问(我认为它不是O(k)因为指针和颜色标记)。

任何人都对这个问题有更好的了解吗?

编辑:我会在这里举例说明:

  • 阵列A:3 7 5 9 10 15 16 1 6 2
  • 阵列B:4 8 5 13 1 17 2 11
  • 常数k = 6
  • 输出:5 1 2

Edit2:在输出中,数字必须以与数组中相同的顺序出现。

1 个答案:

答案 0 :(得分:0)

使用K作为最大距离

假设当你说它们必须以数组顺序呈现时,一个数组的顺序就足够了 - 假设:

答:1 2 B:2 1

导致1 2或2 1而不是1或2,因为超过了排序

请注意,K约束使其不太理想

第一个观察是,较大数组中的任何内容,超过较小数组+ K -1中元素数的索引都可以忽略

第二个观察结果是所有值显然都是int

第三个观察结果是,对于具有可接近阵列大小的K的大型阵列,这必须是最佳的

基数排序为O(N)并且采用O(N)大小,因此我们将使用

为了允许K,我们可以将两个数组复制到(值,位置)的并行数组,而不是复制根据观察1在较大数组中无法访问的值,即 答:71,23,42 ==> A2:{71,0},{23,1},{42,2}

我们还可以为与较小数组

大小相同的结果创建一个类似的数组

我们可以修改基数排序以将值和位置一起移动

Algorythm:

1) Copy arrays [ O(1) ]

2) Radix sort array A and B by values [ O(1) ]

3) Walk A and B: [ O(1) ]
if A < B -> increment index in A
if A > B -> increment index in B
if A == B -> incremnt index in A and B
             add original A to result IF the pos diffence is less than K    
4) Radix sort results by position [ O(1) ]

5) print result values [ O(1) ]