Boost logo

Boost :

Subject: Re: [boost] [review] Heaps: Mergeable Heaps
From: Tim Blechmann (tim_at_[hidden])
Date: 2011-06-05 10:33:42


> Is the merge implementation for container adaptors the same? It might
> be worthwhile implementing it is an algorithm rather than a member
> function for inefficiently merged heaps.
>
> void merge(Heap& l, Heap& r) {
> for(auto& x : r)
> l.push(x);
> }

well, it should be possible to implement it in O(N) instead of O(N log(N)) by
using the heap iterators and creating a new heap ...

> The operation could then be specialized for MergeableHeap types to
> call the member function. Exactly like swap and distance. This has the
> benefit of making all heaps operable under a merge operation, but only
> efficiently mergeable heaps have a member function.

i like about this approach that it would be possible to merge heaps of different
types ... in fact we could have `heap operations' like merging, equivalence test
and comparison of as heap functions ...

but i am not sure, how the interface for merge should look like ... maybe
something like:

template <typename ResultHeap, typename Heap1, typename Heap2>
ResultHeap merge(Heap1 const & h1, Heap2 const & h2);

// consume h2
template <typename ResultHeap, typename Heap1, typename Heap2>
ResultHeap merge_and_consume(Heap1 const & h1, Heap2 & h2);

// consume h2 via move
template <typename ResultHeap, typename Heap1, typename Heap2>
ResultHeap merge_and_consume(Heap1 const & h1, Heap2 && h2);

the current Heap::merge() and Heap::merge_and_clear() are somewhat odd ...

thoughts?

tim

-- 
tim_at_[hidden]
http://tim.klingt.org
You can play a shoestring if you're sincere
  John Coltrane



Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk