Краткое изложение 7-недельного курса
Очень
полезный и относительно тяжелый курс
для wannabe программеров:
Algorithms, Part II
by Robert Sedgewick
Допы
-- Python implementations
of selected Princeton Java Algorithms and Clients by Robert Sedgewick
and Kevin Wayne
-- Scala translations of
Robert Sedgewick's Java Algorthms
This course covers
the essential information that every serious programmer needs to know
about algorithms and data structures, with emphasis on applications
and scientific performance analysis of Java implementations.
Part II covers
graph-processing algorithms, including minimum spanning tree and
shortest paths algorithms,
and string
processing algorithms, including string sorts, tries, substring
search, regular expressions, and data compression,
and concludes with
an overview placing the contents of the course in a larger context.
Курс тяжелый
по двум причинам:
– Роберт, прямо
скажу, хреново читает лекции. Лично на
меня его голос действует как мощное
снотворное.
Несколько
бодрее дело идет, если скорость
воспроизведения поставить 1.25.
Мало того,
некоторые важные моменты он оставляет
для самостоятельного изучения, типа,
читайте мою книгу.
Придется
читать, книга полезная.
– Трудоемкие
упражнения; непростые задачки (особенно
доставляет система тестов). Надо долго
думать и изучать доп. материалы.
Поэтому времени
уходит масса. Но оно того стоит.
За 6 недель
изучено:
Chapter
4: Graphs surveys the most important graph processing
problems, including depth-first search, breadth-first search, minimum
spanning trees, and shortest paths.
Chapter
5: Strings investigates specialized algorithms for string
processing, including radix sorting, substring search, tries, regular
expressions, and data compression.
И прочее.
А именно:
Week 1
Lecture: Undirected
Graphs. We define an undirected graph API and consider the
adjacency-matrix and adjacency-lists representations. We introduce
two classic algorithms for searching a graph—depth-first search
and breadth-first
search. We also consider the problem of computing connected
components and conclude with related problems and applications.
Lecture: Directed
Graphs. In this lecture we study directed graphs. We begin with
depth-first search and breadth-first search in digraphs and describe
applications ranging from garbage collection to web crawling. Next,
we introduce a depth-first search based algorithm for computing the
topological order of an acyclic digraph. Finally, we implement
the Kosaraju-Sharir algorithm for computing the strong
components of a digraph.
Week 2
Lecture: Minimum
Spanning Trees. In this lecture we study the minimum spanning
tree problem. We begin by considering a generic greedy algorithm for
the problem. Next, we consider and implement two classic algorithm
for the problem—Kruskal's algorithm and Prim's
algorithm. We conclude with some applications and open problems.
Lecture: Shortest
Paths. In this lecture we study shortest-paths problems. We begin
by analyzing some basic properties of shortest paths and a generic
algorithm for the problem. We introduce and analyze Dijkstra's
algorithm for shortest-paths problems with nonnegative weights. Next,
we consider an even faster algorithm for DAGs, which works
even if the weights are negative. We conclude with the
Bellman-Ford-Moore algorithm for edge-weighted digraphs with
no negative cycles. We also consider applications ranging from
content-aware fill to arbitrage.
Week 3
Lecture: Maximum
Flow and Minimum Cut. In this lecture we introduce the maximum
flow and minimum cut problems. We begin with the Ford-Fulkerson
algorithm. To analyze its correctness, we establish the
maxflow-mincut theorem. Next, we consider an efficient
implementation of the Ford-Fulkerson algorithm, using the shortest
augmenting path rule. Finally, we consider applications, including
bipartite matching and baseball elimination.
Lecture: Radix
Sorts. In this lecture we consider specialized sorting algorithms
for strings and related objects. We begin with a subroutine
(key-indexed counting) to sort integers in a small range. We
then consider two classic radix sorting algorithms—LSD and MSD
radix sorts. Next, we consider an especially efficient variant,
which is a hybrid of MSD radix sort and quicksort known as 3-way
radix quicksort. We conclude with suffix sorting and
related applications.
Week 5
Lecture: Tries.
In this lecture we consider specialized algorithms for symbol
tables with string keys. Our goal is a data structure that is as
fast as hashing and even more flexible than binary search trees. We
begin with multiway tries; next we consider ternary search
tries. Finally, we consider character-based operations, including
prefix match and longest prefix, and related
applications.
Lecture: Substring
Search. In this lecture we consider algorithms for searching for
a substring in a piece of text. We begin with a brute-force
algorithm, whose running time is quadratic in the worst case. Next,
we consider the ingenious Knuth-Morris-Pratt algorithm whose
running time is guaranteed to be linear in the worst case. Then, we
introduce the Boyer-Moore algorithm, whose running time is
sublinear on typical inputs. Finally, we consider the Rabin-Karp
fingerprint algorithm, which uses hashing in a clever way to
solve the substring search and related problems.
Week 6
Lecture: Regular
Expressions. A regular expression is a method for specifying a
set of strings. Our topic for this lecture is the famous grep
algorithm that determines whether a given text contains any
substring from the set. We examine an efficient implementation that
makes use of our digraph reachability implementation from Week 1.
Lecture: Data
Compression. We study and implement several classic data
compression schemes, including run-length coding, Huffman
compression, and LZW compression. We develop efficient
implementations from first principles using a Java library for
manipulating binary data that we developed for this purpose, based on
priority queue and symbol table implementations from earlier
lectures.
Week 7
Lecture: Reductions.
In this lecture our goal is to develop ways to classify problems
according to their computational requirements. We introduce the
concept of reduction as a technique for studying the relationship
among problems. People use reductions to design algorithms, establish
lower bounds, and classify problems in terms of their computational
requirements.
Lecture (optional):
Linear Programming. The quintessential problem-solving model
is known as linear programming, and the simplex method for solving it
is one of the most widely used algorithms. In this lecture, we given
an overview of this central topic in operations research and describe
its relationship to algorithms that we have considered.
Lecture:
Intractability. Is there a universal problem-solving model to
which all problems that we would like to solve reduce and for which
we know an efficient algorithm? You may be surprised to learn that we
do no know the answer to this question. In this lecture we introduce
the complexity classes P, NP, and NP-complete, pose the famous
P=NP question, and consider implications in the context of
algorithms that we have treated in this course.