xref: /netbsd-src/external/gpl3/gcc/dist/include/fibheap.h (revision b1e838363e3c6fc78a55519254d99869742dd33c)
14fee23f9Smrg /* A Fibonacci heap datatype.
2*b1e83836Smrg    Copyright (C) 1998-2022 Free Software Foundation, Inc.
34fee23f9Smrg    Contributed by Daniel Berlin (dan@cgsoftware.com).
44fee23f9Smrg 
54fee23f9Smrg This file is part of GCC.
64fee23f9Smrg 
74fee23f9Smrg GCC is free software; you can redistribute it and/or modify it
84fee23f9Smrg under the terms of the GNU General Public License as published by
94fee23f9Smrg the Free Software Foundation; either version 2, or (at your option)
104fee23f9Smrg any later version.
114fee23f9Smrg 
124fee23f9Smrg GCC is distributed in the hope that it will be useful, but
134fee23f9Smrg WITHOUT ANY WARRANTY; without even the implied warranty of
144fee23f9Smrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
154fee23f9Smrg General Public License for more details.
164fee23f9Smrg 
174fee23f9Smrg You should have received a copy of the GNU General Public License
184fee23f9Smrg along with GCC; see the file COPYING.  If not, write to
194fee23f9Smrg the Free Software Foundation, 51 Franklin Street - Fifth Floor,
204fee23f9Smrg Boston, MA 02110-1301, USA.  */
214fee23f9Smrg 
224fee23f9Smrg /* Fibonacci heaps are somewhat complex, but, there's an article in
234fee23f9Smrg    DDJ that explains them pretty well:
244fee23f9Smrg 
254fee23f9Smrg    http://www.ddj.com/articles/1997/9701/9701o/9701o.htm?topic=algoritms
264fee23f9Smrg 
274fee23f9Smrg    Introduction to algorithms by Corman and Rivest also goes over them.
284fee23f9Smrg 
294fee23f9Smrg    The original paper that introduced them is "Fibonacci heaps and their
304fee23f9Smrg    uses in improved network optimization algorithms" by Tarjan and
314fee23f9Smrg    Fredman (JACM 34(3), July 1987).
324fee23f9Smrg 
334fee23f9Smrg    Amortized and real worst case time for operations:
344fee23f9Smrg 
354fee23f9Smrg    ExtractMin: O(lg n) amortized. O(n) worst case.
364fee23f9Smrg    DecreaseKey: O(1) amortized.  O(lg n) worst case.
374fee23f9Smrg    Insert: O(2) amortized. O(1) actual.
384fee23f9Smrg    Union: O(1) amortized. O(1) actual.  */
394fee23f9Smrg 
404fee23f9Smrg #ifndef _FIBHEAP_H_
414fee23f9Smrg #define _FIBHEAP_H_
424fee23f9Smrg 
434fee23f9Smrg #include "ansidecl.h"
444fee23f9Smrg 
454fee23f9Smrg #ifdef __cplusplus
464fee23f9Smrg extern "C" {
474fee23f9Smrg #endif
484fee23f9Smrg 
494fee23f9Smrg typedef long fibheapkey_t;
504fee23f9Smrg 
514fee23f9Smrg typedef struct fibheap
524fee23f9Smrg {
534fee23f9Smrg   size_t nodes;
544fee23f9Smrg   struct fibnode *min;
554fee23f9Smrg   struct fibnode *root;
564fee23f9Smrg } *fibheap_t;
574fee23f9Smrg 
584fee23f9Smrg typedef struct fibnode
594fee23f9Smrg {
604fee23f9Smrg   struct fibnode *parent;
614fee23f9Smrg   struct fibnode *child;
624fee23f9Smrg   struct fibnode *left;
634fee23f9Smrg   struct fibnode *right;
644fee23f9Smrg   fibheapkey_t key;
654fee23f9Smrg   void *data;
664fee23f9Smrg #if defined (__GNUC__) && (!defined (SIZEOF_INT) || SIZEOF_INT < 4)
674fee23f9Smrg   __extension__ unsigned long int degree : 31;
684fee23f9Smrg   __extension__ unsigned long int mark : 1;
694fee23f9Smrg #else
704fee23f9Smrg   unsigned int degree : 31;
714fee23f9Smrg   unsigned int mark : 1;
724fee23f9Smrg #endif
734fee23f9Smrg } *fibnode_t;
744fee23f9Smrg 
754fee23f9Smrg extern fibheap_t fibheap_new (void);
764fee23f9Smrg extern fibnode_t fibheap_insert (fibheap_t, fibheapkey_t, void *);
774fee23f9Smrg extern int fibheap_empty (fibheap_t);
784fee23f9Smrg extern fibheapkey_t fibheap_min_key (fibheap_t);
794fee23f9Smrg extern fibheapkey_t fibheap_replace_key (fibheap_t, fibnode_t,
804fee23f9Smrg                                          fibheapkey_t);
814fee23f9Smrg extern void *fibheap_replace_key_data (fibheap_t, fibnode_t,
824fee23f9Smrg                                        fibheapkey_t, void *);
834fee23f9Smrg extern void *fibheap_extract_min (fibheap_t);
844fee23f9Smrg extern void *fibheap_min (fibheap_t);
854fee23f9Smrg extern void *fibheap_replace_data (fibheap_t, fibnode_t, void *);
864fee23f9Smrg extern void *fibheap_delete_node (fibheap_t, fibnode_t);
874fee23f9Smrg extern void fibheap_delete (fibheap_t);
884fee23f9Smrg extern fibheap_t fibheap_union (fibheap_t, fibheap_t);
894fee23f9Smrg 
904fee23f9Smrg #ifdef __cplusplus
914fee23f9Smrg }
924fee23f9Smrg #endif
934fee23f9Smrg 
944fee23f9Smrg #endif /* _FIBHEAP_H_ */
95