Theory

A question left over from lessons 3 and 6

This lesson answers a question lesson 3 asked and lesson 6 refused to answer.

In lesson 3 you built your own doubly linked list and compared it with container/list:

                             walk/shift pointer writes
slice (shift)                        44              0
Playlist (ours)                      50              4
container/list                       50       (hidden)

A tie. To within one hop.

In lesson 6 you compared your binary search with sort.Search:

                        comparisons        ns/op
hand-rolled LowerBound            7           18
sort.Search                       7           15

The standard library won. And that lesson closed like this:

Does that mean the standard library is always at least as good? It sounds reasonable. But in lesson 13 you will build a heap by hand and compare it with container/heap — and the answer will be the opposite, clearly and measurably.

This is that lesson.

Guess before you read on

You will build a binary heap — the prerequisite lessons 14 and 15 need — and compare it with container/heap. Same algorithm, same comparison count.

By what factor will the times differ, and in which direction?

Write it down. Step 6 measures it, and step 7 shows why three answers can differ and all three be right.

And why a heap at all

Not for the standard-library argument — that is a bonus. A heap is needed for two things.

First: the best ten. You want to show the ten highest-rated books out of 100,000. The obvious way is to sort and take the first ten. Step 5 measures what "obvious" costs.

Second: it is Dijkstra's queue. In lessons 14 and 15 you will search a graph for paths, and at every step you have to ask "which unvisited node is nearest?" That question is what a heap exists for. transit — the Vilnius journey planner — revolves around exactly this one question, and step 8 shows what answering it badly costs.