This is a course on
algorithmic thinking. You will learn how to think about problems
from the point of view of machine procedures to solve the problem. You will be
given techniques to break a problem down, to notice its combinatorial difficulties, to
reason about correctness, and to measure the efficiency of a solution.
You will learn how to recognized the inherent complexity of a problem – the best
possible efficiency that a problem can be solved.
The course does not require programing. The course is more about thinking about
code, than writing code.
However, the Practicum does Javascript programming and dynamic HTML to create creative
animations of the algorithms presented in the course. The Practicum is self-study,
and highly recommended. In the practicum you will learn the basis of in-browser
programming, and exercise your coding skills for algorithms.
Notes of 151 edition of 317: This semester the course number was changed from 517 to 317.
There was no change in level or emphasis. The numbering change was entirely clerical.
However, I did make some major changes to the course for this semester:
- A lecture on complexity
was added early in the course, covering the lower complexity classes, linear, etc., with
an intuitive appreciation, up through BPP and NP.
- The order of hashing, trees and sorting was changed. Hashing and sorting were
made separate top-bullet points, and hashing was moved forward to before sorting.
- The topic of hashing was more fully covered, including universal and perfect hashing.
- Trees, red-black trees and union-find were put under the same topic, and splay
trees were re-introduced as a warm-up towards red-black trees, as well as an important
example of amortized complexity (just mentioned, not studied) and "simple" adaptive
data structures.
- Graph algorithms was moved forward before algorithmic paradigms, to give them more
emphasis.
- A lecture on graph theory
was tested, to see if it adds interesting context to the
theory of graphs.
General
- The textbook is
Introduction
to Algorithms (3ird edition), Cormen, Leiserson, Rivest and Stein.
-
Please follow us on twitter/csc_517.
-
The course assigns weekly problem sets, due on Wednesdays. It is very
important to do the homeworks.
-
Our grader is Parul Maheshwari, p.maheshwari@umiami.edu.
-
No late homeworks accepted after the last day of classes.
-
Midterm: Monday, 13 October, 2014.
- Sample Midterm
- Midterm Histogram
-
The final will be in MM 203, Monday 15 Dec, 8:00 to 10:30 am.
-
Grades are 40% final, 30% midterm, and 30% homework.
Practicum
The mainline of the course will have no programming. The optional practicum will assign
you the task of implementing some of the algorithms using Javascript, CSS, and DHTML.
If you would like to take the practicum, enroll in CSC 401-01.
Writing Credit
Three essays, each at least 1500 words.
- The origin of algorithms. A historical paper.
There is actually a book, History
of Algorithms ... that might guide you.
-
The need to break military codes drove forward the construction
of computers during World War II.
Among the early computers were
the Colossus
designed by Tommy
Flowers, to break German Navel Codes (Tunny)
and Turing's Bomb,
to break army and high command codes (Enigma).
These were really the first computers ever built.
- A science fiction short story about algorithms, computers, etc.
If not original, you can do an analysis of some Sci-Fi books like
The Diamond Age, or Snow Crash.
Please write me with your proposed topics, if you elect writing
credit. One paper must be done before the midterm, and the other
two before reading days.
CSC401 is the practicum associated with CSC317.
Please see the home page of the the csc401 zinc
server for more information.
CSC517 is a course on algorithmic thinking. The CSC517 mainline in the course does not require programming. It is highly recommended that students enroll in CSC401 the Practicum, for experience coding algorithms, and for the experience of using dynamic HTML and Javascript to create imaginative animations of the algorithms presented in the course.
-
Preliminaries:
- Install the private key in your .ssh directory and login into the zinc server.
- Learn to either scp or edit right onto the zinc server, your public_html directory.
- First, arrange your index.html to make a home page for the practicum that will
link to the projects.
-
Then begin the first project.
-
Project 1: Do an algorithm animation of either insertion sort or selection sort.
-
Project 2: Do an algorithm animation of double hashing.
- See my linear probing animation.
- Have the table size be 16. A table size of perfect power of 2 (2, 4, 8, 16, etc) makes the mod easy, because
it can be a simple bit mask, x % 16 == x & ~(0x0f).
- Make the secondary hash function 2(x%4)+1. This gives 4 different skip values, independent of the value of x%16,
and all relatively prime to the table size.
- Show somehow the collisions and skips, to demonstrate how double hashing works.
- For extra credit: sample the average unsuccessful search time. Do this by simulating the 64 unsuccessful
searches of an x such that (x%16,x%4) is each of the 64 different values (0,0), (0,1), (0,2), (0,3), (1,0), (1,1), etc.,
then dividing the total probes over all 64 searches by 64.
- Due Wednesday, November 12th.
-
Project 3: Bloom filter.
- Watch Prof. Mitzenmacher's workshop presentation on Bloom filters.
- Write a page which implements a Bloom filter. For the k hash functions, choose them at
random from the universal family described on CLR page 267 —
hab(x) = ((ax+b) mod p) mod m)
- As an implementation idea: make a series of cells. As a hash is made, set the cells to orange, but
turn them to all green before laying in the next hash (so the current hash can be seen as well as the
accumulation of hashes).
- Due Tuesday, December 9th.
Some references: