两个堆具有相同的密钥算法

时间:2013-10-17 06:55:27

标签: algorithm key heap

嗨,如果你有两个堆,你如何确定他们在O(nlogn)运行时是否有一个相同的密钥,其中n是两个最小堆之间的总大小。

我当时认为这可能与将其中一个堆加到另一个堆中有关,但我并不积极。

2 个答案:

答案 0 :(得分:1)

bool have_same_element(heap<int> h1, heap<int> h2) {
  while (!h1.empty() && !h2.empty()) {
    int t1 = h1.top(), t2 = h2.top();
    if (t1 == t2) return true;
    if (t1 < t2) h1.pop();
    else h2.pop();    
  }
  return false;
}

O(s1 ln(s1)+ s2 ln(s2))保证O(n ln(n))其中n = s1 + s2;

答案 1 :(得分:0)

我认为堆结构无助于解决此类任务,因此如果您有两个堆或两个项目数组则无关紧要。要查找两个数据集是否具有相同的值,您可以使用不同的算法,我建议两个例如:

  1. 您可以将较小的项目放入任何基于散列的字典中,然后您可以枚举另一组的项目并检查它们是否在第一组中。可能它是最快的方式,但需要一些额外的空间用于字典。

  2. 假设你有2个经典的堆结构保存在数组中(对于堆是可能的)。然后你可以排序最小的数组。之后,只需枚举第二个堆的项目并使用二进制搜索来检查项目是否在第一个堆中。 完成后,您可以再次重建损坏的堆(可以内联到相同的数组中)。 所以你得到O(nlogn),其中n是较小堆的数量,并且可以不用额外的内存使用。