aboutsummaryrefslogtreecommitdiff
path: root/gcc/fibonacci_heap.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fibonacci_heap.h')
-rw-r--r--gcc/fibonacci_heap.h60
1 files changed, 43 insertions, 17 deletions
diff --git a/gcc/fibonacci_heap.h b/gcc/fibonacci_heap.h
index ecb92f8..3fce370 100644
--- a/gcc/fibonacci_heap.h
+++ b/gcc/fibonacci_heap.h
@@ -183,20 +183,27 @@ public:
}
/* For given NODE, set new KEY value. */
- K decrease_key (fibonacci_node_t *node, K key)
+ K replace_key (fibonacci_node_t *node, K key)
{
K okey = node->m_key;
- gcc_assert (key <= okey);
replace_key_data (node, key, node->m_data);
return okey;
}
+ /* For given NODE, decrease value to new KEY. */
+ K decrease_key (fibonacci_node_t *node, K key)
+ {
+ gcc_assert (key <= node->m_key);
+ return replace_key (node, key);
+ }
+
/* For given NODE, set new KEY and DATA value. */
V *replace_key_data (fibonacci_node_t *node, K key, V *data);
- /* Extract minimum node in the heap. */
- V *extract_min ();
+ /* Extract minimum node in the heap. If RELEASE is specified,
+ memory is released. */
+ V *extract_min (bool release = true);
/* Return value associated with minimum node in the heap. */
V *min ()
@@ -214,12 +221,15 @@ public:
}
/* Delete NODE in the heap. */
- V *delete_node (fibonacci_node_t *node);
+ V *delete_node (fibonacci_node_t *node, bool release = true);
/* Union the heap with HEAPB. */
fibonacci_heap *union_with (fibonacci_heap *heapb);
private:
+ /* Insert new NODE given by KEY and DATA associated with the key. */
+ fibonacci_node_t *insert (fibonacci_node_t *node, K key, V *data);
+
/* Insert it into the root list. */
void insert_root (fibonacci_node_t *node);
@@ -322,6 +332,15 @@ fibonacci_heap<K,V>::insert (K key, V *data)
/* Create the new node. */
fibonacci_node<K,V> *node = new fibonacci_node_t ();
+ return insert (node, key, data);
+}
+
+/* Insert new NODE given by KEY and DATA associated with the key. */
+
+template<class K, class V>
+fibonacci_node<K,V>*
+fibonacci_heap<K,V>::insert (fibonacci_node_t *node, K key, V *data)
+{
/* Set the node's data. */
node->m_data = data;
node->m_key = key;
@@ -345,17 +364,22 @@ V*
fibonacci_heap<K,V>::replace_key_data (fibonacci_node<K,V> *node, K key,
V *data)
{
- V *odata;
K okey;
fibonacci_node<K,V> *y;
+ V *odata = node->m_data;
- /* If we wanted to, we could actually do a real increase by redeleting and
- inserting. However, this would require O (log n) time. So just bail out
- for now. */
+ /* If we wanted to, we do a real increase by redeleting and
+ inserting. */
if (node->compare_data (key) > 0)
- return NULL;
+ {
+ delete_node (node, false);
+
+ node = new (node) fibonacci_node_t ();
+ insert (node, key, data);
+
+ return odata;
+ }
- odata = node->m_data;
okey = node->m_key;
node->m_data = data;
node->m_key = key;
@@ -385,7 +409,7 @@ fibonacci_heap<K,V>::replace_key_data (fibonacci_node<K,V> *node, K key,
/* Extract minimum node in the heap. */
template<class K, class V>
V*
-fibonacci_heap<K,V>::extract_min ()
+fibonacci_heap<K,V>::extract_min (bool release)
{
fibonacci_node<K,V> *z;
V *ret = NULL;
@@ -397,28 +421,30 @@ fibonacci_heap<K,V>::extract_min ()
node's data. */
z = extract_minimum_node ();
ret = z->m_data;
- delete (z);
+
+ if (release)
+ delete (z);
}
return ret;
}
-/* Delete NODE in the heap. */
+/* Delete NODE in the heap, if RELEASE is specified memory is released. */
template<class K, class V>
V*
-fibonacci_heap<K,V>::delete_node (fibonacci_node<K,V> *node)
+fibonacci_heap<K,V>::delete_node (fibonacci_node<K,V> *node, bool release)
{
V *ret = node->m_data;
/* To perform delete, we just make it the min key, and extract. */
- decrease_key (node, m_global_min_key);
+ replace_key (node, m_global_min_key);
if (node != m_min)
{
fprintf (stderr, "Can't force minimum on fibheap.\n");
abort ();
}
- extract_min ();
+ extract_min (release);
return ret;
}