[英]Find intersection between two arrays with restrictions
我必须编写一个程序才能在两个数组之间找到相同的数字。 问题是我必须遵循一些约束以最优化的方式进行操作:
-如果A [i] = B [w]且A [j] = b [x]且i,则具有数组A的i,j索引和数组B的w,x索引
-这些数字之间的最大距离必须为k(由输入得出);
-我必须使用最大O(k)空间才能实现优化搜索的功能;
-数字在每个数组(如集合)中仅出现一次。
我当时正在考虑用第一个数组的k个元素构造一个平衡的RBTree来优化搜索过程,但是我对其所需的空间有所怀疑(由于指针和颜色标记,我认为它不是O(k) )。
任何人对此问题有更好的主意吗?
编辑:我将在这里放我的示例,使其更清楚:
Edit2:在输出中,数字的顺序必须与数组中的顺序相同。
使用K作为最大距离
假设当您说必须按数组顺序显示它们时,一个数组的顺序就足够了-假设:
A:1 2 B:2 1
由于交叉了顺序,结果为1 2或2 1而不是1或2
请注意,K约束使此条件不太理想
第一个观察结果是,较大数组中的任何内容,超过较小数组中元素数的索引+ K -1都可以忽略
第二个观察结果是所有值显然都是int
第三个观察结果是,这对于K可能接近数组大小的大型数组必须是最佳的
基数排序为O(N),大小为O(N),因此我们将使用
为了允许使用K,我们可以将两个数组都复制到(值,位置)的并行数组中,而不是按照观察1复制在较大数组中不可达的值,即A:71、23、42 ==> A2:{71 ,0},{23,1},{42,2}
我们还可以为结果创建一个与较小数组相同大小的相似数组
我们可以修改基数排序以将值和位置一起移动
算法:
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) ]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.