Sie sind auf Seite 1von 27

One algorithm from The Book:

A tribute to Ira Pohl


Alexander Stepanov
A9.com
http://www.stepanovpapers.com/IraPohlFest.pdf

1
The highest compliment [Erdős] could pay
to a colleague's work was to say, “That's
straight from The Book.”

Encyclopedia Britannica

2
CS needs its Book
The Book contains algorithms that are:

•  Beautiful
•  Optimal
•  Useful

3
elements, the median or, as will be discus
minimum and maximum elements.
Algorithms which take unordered
ordered) sets and produce the desired
fundamental to computing, making this ar
most intensely studied both practically a
cally. In the theoretical attacks, the prin
Programming R. Morris
work has been the comparison. An algor
Techniques Editor
pared to some norm on the number of

A Sorting The two norms of most interest are the m


the average. The maximum norm (M-n
greatest number of comparisons the alg
Problem and over all possible inputs ( n ! orderings are p
average norm (E-norm) is the average

Copyright (~) 1972, Association for Computing Machinery, Inc.


Its Complexity comparisons the algorithm takes with re
uniform distribution on the possible orderin
algorithm for a given norm is the one th
General permission to republish, but not for profit, allI rora part Pohl that norm.
of this material is granted, provided that reference is madeU to this
niversity of C a l i f ogoals
The r n i a * of this paper are: (1) to de
publication, to its date of issue, and to the fact that reprinting
privileges were granted by permission of the Association for Com- technique for proving algorithms optimal
puting Machinery. mum norm; and (2) using the technique d
* Information and Computer
A technique for proving min-max norms of sorting Science Department, and
A sortingexhibit
problema isnew algorithm
a special case of P2 for afinding
finding set bo
Stevenson College, University of California,
a l g o r i t h m s is given. O n e new a l g o r i t h m for finding the
Santa Cruz, CA
partition. The mumelements
and are identified by
maximum of their rank
a set, in
which is
95060. This paper is a revision of a privately distributed communi-
minimum and maximum
cation, March 1970. e l e m e n t s of a set with fewest a linear order. For a given finite set
optimal in the M-norm.
comparisons is proved o p t i m a l with this technique. X = {xl, x 2 , . . . , x,}
K e y W o r d s a n d P h r a s e s : s o r t i n g , computational
462 Communications
There is some permutation r*, such that June 1972
complexity, computational combinatorics of Volume 15
C R C a t e g o r i e s : 5.29, 5.31 the ACM
XTr*~l) < Xlr*~2) < . . . < XTr*~n~ . Number 6
(Note: we will ignore throughout the case of XTr*<~) 4
=

Other partitions which do not completely sort the


Finding both min and max
•  To find minimum (or maximum) of n elements
we need n – 1 comparisons
•  Don’t we need 2n – 2 (or 3?) comparisons to
find both?
3
•  Ira showed that we need at most d 2 ne 2
comparisons
•  And he showed that his algorithm is optimal

5
maybe min or maybe max

not max not min

not min and not max

6
Strict Weak Ordering
•  Weak trichotomy
x y_y x_x⇠y

•  Transitivity
(x y^y z) ) x z

•  Irreflexivity, or strictness
¬(x x)
7
template <StrictWeakOrdering R>!
struct min_max!
{!
R r;!
!
template <Regular T> // T == Domain<R>!
const T& min(const T& x, !
const T& y) const {!
if (r(y, x)) return y;!
else return x;!
}!

8
Weak Commutativity
•  Is min commutative?
•  Not for StrictWeakOrdering
•  Weak Commutativity!
a b⇠b a
•  Set with min defined is
–  semigroup
–  (weak Abelian) semigroup
•  Weak theories
–  equivalence axioms (instead of equational) 9
template <Regular T> // T == Domain<R>!
const T& max(const T& x, !
const T& y) const {!
if (r(y, x)) return x;!
else return y;!
}!
!

10
// the idiot who designed STL wrote:!
template <Regular T> // T == Domain<R>!
const T& max(const T& x, !
const T& y) const {!
if (r(x, y)) return y;!
else return x;!
}!
!
// why is it wrong?!
!

11
template <Regular T> // T == Domain<R>!
pair<T, T> construct(const T& x, !
const T& y) const {!
if (r(y, x)) return {y, x}; !
else return {x, y};!
}!
!

12
template <Regular T> // T == Domain<R>!
pair<T, T> !
combine(const pair<T, T>& x, !
" "const pair<T, T>& y) const {!
return { min(x.first, y.first), !
max(x.second, y.second) }; !
}!
};!

13
Iterators
•  Input
•  Forward
•  Bidirectional
•  RandomAccess

14
template <StrictWeakOrdering R>!
struct compare_dereference!
{!
R r;!
!
template <InputIterator I>!
// Domain<R> == ValueType<I>!
bool operator()(const I& i, !
const I& j) const {!
return r(*i, *j);!
}!
};!
!
15
template <ForwardIterator I, !
StrictWeakOrdering R>!
pair<I, I> !
min_max_element_even_length(I first, !
I last, !
R r) {!
// assert(distance(first, last) % 2 == 0)!
min_max<compare_dereference<R>> op{r};!
if (first == last) return {last, last};!
!

16
I prev = first;!
pair<I, I> result = !
op.construct(prev, ++first);!
while (++first != last) {!
prev = first;!
result = op.combine(!
result, !
op.construct(prev, ++first));!
}!
return result;!
}!

17
template <ForwardIterator I, !
StrictWeakOrdering R>!
pair<I, I> !
min_max_element(I first, I last, R r) {!
min_max<compare_dereference<R>> op{r};!
I prev = first;!
if (first == last || ++first == last) !
"return {prev, prev};!

18
pair<I, I> result = !
op.construct(prev, first);!
while (++first != last) {!
prev = first;!
if (++first == last) !
return op.combine(result, !
{prev, prev});!
result = op.combine(!
result, !
" op.construct(prev, first));!
}!
return result;!
}!
19
Type Functions
template <InputIterator I> !
using ValueType = typename !
std::iterator_traits<I>::value_type;!

20
template <InputIterator I, !
StrictWeakOrdering R>!
pair<ValueType<I>, ValueType<I>>
min_max_value_nonempty(I first, !
I last, !
R r) {!
typedef ValueType<I> T; !
min_max<R> op{r};!
T val = *first;!
if (++first == last) return {val, val};!
!

21
pair<T, T> result = !
op.construct(val, *first);!
while (++first != last) {!
val = *first;!
if (++first == last) !
" return op.combine(result, !
{val, val});!
result = op.combine(!
result, !
" op.construct(val, *first));!
}!
return result;!
}!
22
template <InputIterator I, !
StrictWeakOrdering R>!
pair<ValueType<I>, ValueType<I>>
min_max_value(I first, I last, R r) {!
typedef ValueType<I> T;!
if (first == last) !
return {supremum(r), infimum(r)}!
return min_max_value_nonempty(first, !
last,!
r);!
}!

23
•  I have been teaching this algorithm every
2 – 3 years for the last 30 years
•  When I teach it, I implement it anew
•  Writing the code and teaching it gives me
joy every time

24
THANK YOU, IRA!

25
Getting rid of an extra compare
// Add to min_max:!
template <Regular T> // T == Domain<R>!
pair<T, T> combine(const pair<T, T>& x,!
const T& val) const {!
if (r(val, x.first)) return { val, x.second};!
if (r(val, x.second)) return x;!
return {x.first, val};!
}!

26
Getting rid of an extra compare (2)
// In min_max_element and!
// min_max_value_nonempty, replace:!
if (++first == last) !
return op.combine(result, {val, val});!
!
// with!
if (++first == last)!
return op.combine(result, val);!

27

Das könnte Ihnen auch gefallen