Algorithm 具有相同密钥算法的两个堆
您好,如果有两个堆,如何确定它们在O(nlogn)运行时是否具有相同的密钥,其中n是两个最小堆之间的总大小Algorithm 具有相同密钥算法的两个堆,algorithm,key,heap,Algorithm,Key,Heap,您好,如果有两个堆,如何确定它们在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)
vsO(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;
}