我必须编写一个程序才能在两个数组之间找到相同的数字。 问题在于我必须以最优化的方式完成某些约束:
- 如果A [i] = B [w]且A [j] = b [x]且i,则i,j为数组A和w的索引,x为数组B的索引
- 这些数字之间的最大距离必须是k(由输入给出);
- 我必须在最大O(k)空间使用才能实现优化搜索的内容;
- 数字在每个数组中只出现一次(如集合)。
我正在考虑使用第一个数组的k个元素构建一个平衡的RBTree以优化搜索过程,但我对它所需的空间有疑问(我认为它不是O(k)因为指针和颜色标记)。
任何人都对这个问题有更好的了解吗?
编辑:我会在这里举例说明:
Edit2:在输出中,数字必须以与数组中相同的顺序出现。
答案 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) ]