Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 具有相同密钥算法的两个堆_Algorithm_Key_Heap - Fatal编程技术网

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

Algorithm 具有相同密钥算法的两个堆,algorithm,key,heap,Algorithm,Key,Heap,您好,如果有两个堆,如何确定它们在O(nlogn)运行时是否具有相同的密钥,其中n是两个最小堆之间的总大小 我在想,这可能与将一个堆添加到另一个堆有关,但我不是肯定的。我认为堆结构无助于解决此类任务,因此,如果有两个堆或两个项目数组,这并不重要。要确定两个数据集是否具有相同的值,可以使用不同的算法,我建议使用两种算法,例如: 您可以将较小集合的项放入任何基于哈希的字典中,然后可以枚举另一个集合的项并检查它们是否在第一个集合中。也许这是最快的方法,但需要一些额外的字典空间 让我们假设有两个经典的堆

您好,如果有两个堆,如何确定它们在O(nlogn)运行时是否具有相同的密钥,其中n是两个最小堆之间的总大小


我在想,这可能与将一个堆添加到另一个堆有关,但我不是肯定的。

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

  • 您可以将较小集合的项放入任何基于哈希的字典中,然后可以枚举另一个集合的项并检查它们是否在第一个集合中。也许这是最快的方法,但需要一些额外的字典空间

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

  • bool具有相同的元素(堆h1、堆h2){
    而(!h1.empty()&&!h2.empty()){
    int t1=h1.top(),t2=h2.top();
    如果(t1==t2)返回true;
    如果(t1

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

    提到您正在使用的堆算法可能很有用。(2)是
    O(m log n)
    m
    是较大的大小),因为您查看较大列表中的每个元素并执行
    log n
    查找。嗯,它是
    O(n logn+m logn)
    但是
    n logn
    ,所以它简化为上面的内容。@Yes,你说得对。但无论如何,它与nlogn相同(甚至更好),其中两个堆的总大小为n。从大堆中搜索小堆中的每个元素似乎更好。它将花费O(Nln(M)),其中N是小堆的大小,M是大堆的大小。它不会比O(MlnN)更差。当然,这两个都比O(nln(n))好。如果我们已经订购了set,那还不错,是的,但我们没有。我们要订一套,也是nlogn的。因此,从大O的角度来看,排序哪一部分并不重要,但我认为排序小O更有效。@notbad排序/搜索小O更有效-
    O(n 日志 N + M 日志 n) = O(m) 日志 n) 
    vs
    O(m 日志 M + N 日志 m) = O(m) 日志 m) 
    O(m 日志 m) > O(m) 日志 n) 
    +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;
    }