【问题标题】:Find intersection between two arrays with restrictions找到两个有限制的数组之间的交集
【发布时间】:2013-08-09 17:07:03
【问题描述】:

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

-如果 A[i]=B[w] and A[j]=b[x] and i

-这些数字之间的最大距离必须为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:在输出中,数字必须以与它们在数组中相同的顺序出现。

【问题讨论】:

  • i 和 j 是什么关系? (以及 w 和 x)“这两个数字之间的距离”是什么意思?
  • 没有关系,它们是两个通用索引,我们有 A[i]=B[w] 和 A[j]=B[x]。对于找到的所有常见数字都是如此。对于这两个数字之间的距离,我的意思是假设我们找到一个公共数字,下一个公共数字将在“数组中找到的数字的索引”+ k 常数处最大,并且不一定相同。例如:32 1 15 6 7 18 9 12 35 | 10 2 1 5 8 21 22 7 101 | 1 和 7 是常见的数字,按相同的顺序放置在不同的距离,但例如放置在小于 k=10 的距离处。
  • 抱歉,我完全不清楚。也许您可以稍微改写问题和/或添加一个数字示例+所需的结果? UPD:我看到你还不能更新你的 Q。也许我应该将您的示例添加到 OQ 中?
  • 我已将示例添加到OQ中,请见谅。
  • 好的,谢谢 ;-) 现在更清楚了吗?你有什么建议吗?

标签: arrays search optimization data-structures


【解决方案1】:

使用 K 作为最大距离

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

答:1 2 乙:2 1

结果是 1 2 或 2 1 而不是 1 或 2,因为顺序是交叉的

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

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

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

第三个观察结果是,对于 K 可以接近数组大小的大型数组,这必须是最佳的

基数排序是 O(N) 并且需要 O(N) 大小,所以我们将使用它

为了允许 K,我们可以将两个数组复制到 (value, position) 的并行数组,而不是根据观察 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) ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 2021-11-14
    • 2021-08-31
    • 2013-07-25
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多