ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Array-Heap/Heap.pm
Revision: 1.2
Committed: Sun Jul 26 04:50:02 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
CVS Tags: rel-2_0
Changes since 1.1: +60 -8 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 =head1 NAME
2
3 Array::Heap - treat perl arrays as heaps (priority queues)
4
5 =head1 SYNOPSIS
6
7 use Array::Heap;
8
9 =head1 DESCRIPTION
10
11 There are a multitude of heap and heap-like modules on CPAN, you might
12 want to search for /Heap/ and /Priority/ to find many. They implement more
13 or less fancy datastructures that might well be what you are looking for.
14
15 This module takes a different approach: It exports functions (i.e. no
16 object orientation) that are loosely modeled after the C++ STL's heap
17 functions. They all take an array as argument, just like perl's built-in
18 functions C<push>, C<pop> etc.
19
20 The implementation itself is in C for maximum speed.
21
22 =head1 FUNCTIONS
23
24 All of the following functions are being exported by default.
25
26 =over 4
27
28 =cut
29
30 package Array::Heap;
31
32 BEGIN {
33 $VERSION = '2.0';
34
35 require XSLoader;
36 XSLoader::load ("Array::Heap", $VERSION);
37 }
38
39 use base Exporter;
40
41 @EXPORT = qw(
42 make_heap make_heap_lex make_heap_cmp
43 push_heap push_heap_lex push_heap_cmp
44 pop_heap pop_heap_lex pop_heap_cmp
45 splice_heap splice_heap_lex splice_heap_cmp
46 adjust_heap adjust_heap_lex adjust_heap_cmp
47 );
48
49 =item make_heap @heap (\@)
50
51 Reorders the elements in the array so they form a heap, with the lowest
52 value "on top" of the heap (corresponding to the first array element).
53
54 =item make_heap_lex @heap (\@)
55
56 Just like C<make_heap>, but in string comparison order instead of numerical
57 comparison order.
58
59 =item make_heap_cmp { compare } @heap (&\@)
60
61 Just like C<make_heap>, but takes a custom comparison function.
62
63 =item push_heap @heap, $element, ... (\@@)
64
65 Adds the given element(s) to the heap.
66
67 =item push_heap_lex @heap, $element, ... (\@@)
68
69 Just like C<push_heap>, but in string comparison order instead of numerical
70 comparison order.
71
72 =item push_heap_cmp { compare } @heap, $element, ... (&\@@)
73
74 Just like C<push_heap>, but takes a custom comparison function.
75
76 =item pop_heap @heap (\@)
77
78 Removes the topmost (lowest) heap element and repairs the heap.
79
80 =item pop_heap_lex @heap (\@)
81
82 Just like C<pop_heap>, but in string comparison order instead of numerical
83 comparison order.
84
85 =item pop_heap_cmp { compare } @heap (&\@)
86
87 Just like C<pop_heap>, but takes a custom comparison function.
88
89 =item splice_heap @heap, $index (\@$)
90
91 Similar to C<pop_heap>, but removes and returns the element at index
92 C<$index>.
93
94 =item splice_heap_lex @heap, $index (\@$)
95
96 Just like C<splice_heap>, but in string comparison order instead of
97 numerical comparison order.
98
99 =item splice_heap_cmp { compare } @heap, $index (&\@$)
100
101 Just like C<splice_heap>, but takes a custom comparison function.
102
103 =item adjust_heap @heap, $index (\@$)
104
105 Assuming you have only changed the element at index C<$index>, repair the
106 heap again. Can be used to remove elements, replace elements, adjust the
107 priority of elements and more.
108
109 =item adjust_heap_lex @heap, $index (\@$)
110
111 Just like C<adjust_heap>, but in string comparison order instead of
112 numerical comparison order.
113
114 =item adjust_heap_cmp { compare } @heap, $index (&\@$)
115
116 Just like C<adjust_heap>, but takes a custom comparison function.
117
118 =cut
119
120 1;
121
122 =back
123
124 =head2 COMPARISON FUNCTIONS
125
126 All the functions come in two flavours: one that uses the built-in
127 comparison function and one that uses a custom comparison function.
128
129 The built-in comparison function can either compare scalar numerical
130 values (string values for *_lex functions), or array refs. If the elements
131 to compare are array refs, the first element of the array is used for
132 comparison, i.e.
133
134 1, 4, 6
135
136 will be sorted according to their numerical value,
137
138 [1 => $obj1], [2 => $obj2], [3 => $obj3]
139
140 will sort according to the first element of the arrays, i.e. C<1,2,3>.
141
142 The custom comparison functions work similar to how C<sort> works: C<$a>
143 and C<$b> are set to the elements to be compared, and the result should be
144 greater than zero then $a is greater than $b, C<0> otherwise. This means
145 that you cna use the same function as for sorting the array, but you could
146 also use a simpler function that just does C<< $a > $b >>.
147
148 The first example above corresponds to this comparison "function":
149
150 { $a <=> $b }
151
152 And the second example corresponds to this:
153
154 { $a->[0] <=> $b->[0] }
155
156 Unlike C<sort>, the default sort is numerical and it is not possible to
157 use normal subroutines.
158
159 =head1 BUGS
160
161 =over 4
162
163 =item * Numerical comparison is always done using floatingpoint, which
164 usually has less precision than a 64 bit integer that perl might use
165 for integers internally, resulting in precision loss on the built-in
166 comparison.
167
168 =item * This module does not work with tied or magical arrays or array
169 elements, and, in fact, will even crash when you use those.
170
171 =item * This module can leak memory (or worse) when your comparison
172 function exits unexpectedly (e.g. C<last>) or throws an exception, so do
173 not do that.
174
175 =back
176
177 =cut
178
179 =head1 AUTHOR
180
181 Marc Lehmann <schmorp@schmorp.de>
182 http://home.schmorp.de/
183
184 =cut
185