Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Create a <a href="http://en.wikipedia.org/wiki/Heap_structure" rel="nofollow">heap structure</a> (for the second bullet) and put each of its nodes in a map (for the first bullet).</p> <p><strong>EDIT:</strong> An implementation of min heap I had done some time in the past</p> <pre><code>#ifndef MINHEAP_H #define MINHEAP_H //////////////////////// MinHeap with Map for Data //////////////////////// template &lt;class T, class M = int&gt; class MinHeap { T* array; unsigned const int arr_max; unsigned int elements; M map; void percolate_down(unsigned int i=0) { unsigned int n = elements-1, min; do { unsigned int l = 2*i + 1, r = 2*i + 2; if (l &lt;= n &amp;&amp; array[i] &gt; array[l]) min = l; else min = i; if (r &lt;= n &amp;&amp; array[i] &gt; array[r] &amp;&amp; array[l] &gt; array[r]) min = r; if (i != min) { T temp = array[i]; array[i] = array[min]; array[min] = temp; map.update(array[i], i); map.update(array[min], min); i = min; } else break; } while (i &lt; n); } void percolate_up(unsigned int i) { while (i &amp;&amp; array[(i-1)/2] &gt; array[i]) { T temp = array[i]; array[i] = array[(i-1)/2]; array[(i-1)/2] = temp; map.update(array[i], i); map.update(array[(i-1)/2], (i-1)/2); i = (i-1)/2; } } public: MinHeap(const int max) : array(new T[max]), arr_max(max), elements(0), map(max) {} ~MinHeap(void) { delete[] array; } bool empty(void) const { return elements == 0; } unsigned int capacity(void) const { return arr_max; } unsigned int size(void) const { return elements; } const M&amp; heapmap(void) const { return map; } const T&amp; peek(unsigned int i=0) const { return array[i]; } bool insert(T&amp; element) { if (arr_max == elements) return false; unsigned int k = elements++; map.update(element, k); array[k] = element; percolate_up(k); return true; } unsigned int mass_insert(T copy[], unsigned int n) { unsigned int i = 0; for( ; i &lt; n ; i++) if (!insert(copy[i])) break; return i; } bool delete_min(void) { if (elements == 0) return false; map.update(array[0], arr_max+1); array[0] = array[--elements]; map.update(array[0], 0); percolate_down(); return true; } bool delete_element(unsigned int i) { if (i &gt; elements) return false; map.update(array[i], arr_max+1); T temp = array[i]; array[i] = array[--elements]; map.update(array[i], i); if (array[i] &gt; temp) percolate_down(i); else if (temp &gt; array[i]) percolate_up(i); return true; } bool update(unsigned int i, T&amp; element) { if (i &gt; elements) return false; map.update(array[i], arr_max+1); T temp = array[i]; array[i] = element; map.update(array[i], i); if (array[i] &gt; temp) percolate_down(i); else if (temp &gt; array[i]) percolate_up(i); return true; } // void print() { using namespace std; for (unsigned int i=0 ; i &lt; elements ; i++) cout &lt;&lt; array[i] &lt;&lt; " | "; cout &lt;&lt; endl; } // Iterators /* friend class Const_Iterator; class Const_Iterator { MinHeap&lt;T&gt;* heap; unsigned int index; Const_Iterator(MinHeap&lt;T&gt;* h, unsigned int i) : heap(h), index(i) {} public: Const_Iterator(const Const_Iterator&amp; clone) : heap(clone.heap), index(clone.index) {} friend Const_Iterator MinHeap&lt;T&gt;::begin(void); }; Const_Iterator begin(void) { return Const_Iterator(this, 0); } */ }; ////////////////////////////////////////////////////////////////////////////// //////////////////////// MinHeap without Map for Data //////////////////////// template &lt;class T&gt; class MinHeap &lt;T, int&gt; { T* array; unsigned const int arr_max; unsigned int elements; void percolate_down(unsigned int i=0) { unsigned int n = elements-1, min; do { unsigned int l = 2*i + 1, r = 2*i + 2; if (l &lt;= n &amp;&amp; array[i] &gt; array[l]) min = l; else min = i; if (r &lt;= n &amp;&amp; array[i] &gt; array[r] &amp;&amp; array[l] &gt; array[r]) min = r; if (i != min) { T temp = array[i]; array[i] = array[min]; array[min] = temp; i = min; } else break; } while (i &lt; n); } void percolate_up(unsigned int i) { while (i &amp;&amp; array[(i-1)/2] &gt; array[i]) { T temp = array[i]; array[i] = array[(i-1)/2]; array[(i-1)/2] = temp; i = (i-1)/2; } } public: MinHeap(const int max) : array(new T[max]), arr_max(max), elements(0) {} ~MinHeap(void) { delete[] array; } bool empty(void) const { return elements == 0; } unsigned int capacity(void) const { return arr_max; } unsigned int size(void) const { return elements; } const T&amp; peek(unsigned int i=0) const { return array[i]; } bool insert(T&amp; element) { if (arr_max == elements) return false; unsigned int k = elements++; array[k] = element; percolate_up(k); return true; } unsigned int mass_insert(T copy[], unsigned int n) { unsigned int i = 0; for( ; i &lt; n ; i++) if (!insert(copy[i])) break; return i; } bool delete_min(void) { if (elements == 0) return false; array[0] = array[--elements]; percolate_down(); return true; } bool delete_element(unsigned int i) { if (i &gt; elements) return false; T temp = array[i]; array[i] = array[--elements]; if (array[i] &gt; temp) percolate_down(i); else if (temp &gt; array[i]) percolate_up(i); return true; } bool update(unsigned int i, T&amp; element) { if (i &gt; elements) return false; T temp = array[i]; array[i] = element; if (array[i] &gt; temp) percolate_down(i); else if (temp &gt; array[i]) percolate_up(i); return true; } // void print() { using namespace std; for (unsigned int i=0 ; i &lt; elements ; i++) cout &lt;&lt; array[i] &lt;&lt; " | "; cout &lt;&lt; endl; } }; ////////////////////////////////////////////////////////////////////////////// #endif // MINHEAP_H </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload