Contents
        - 1 Introduction
- 1.1 The Need for Efficiency
- 1.2 Interfaces
- 1.3 Mathematical Background
- 1.4 The Model of Computation
- 1.5 Correctness, Time Complexity, and Space Complexity
- 1.6 Code Samples
- 1.7 List of Data Structures
- 1.8 Discussion and Exercises
- 2 Array-Based Lists
- 2.1 ArrayStack: Fast Stack Operations Using an Array
- 2.2 FastArrayStack: An Optimized ArrayStack
- 2.3 ArrayQueue: An Array-Based Queue
- 2.4 ArrayDeque: Fast Deque Operations Using an Array
- 2.5 DualArrayDeque: Building a Deque from Two Stacks
- 2.6 RootishArrayStack: A Space-Efficient Array Stack
- 2.7 Discussion and Exercises
- 3 Linked Lists
- 3.1 SLList: A Singly-Linked List
- 3.2 DLList: A Doubly-Linked List
- 3.3 SEList: A Space-Efficient Linked List
- 3.4 Discussion and Exercises
- 4 Skiplists
- 4.1 The Basic Structure
- 4.2 SkiplistSSet: An EfficientSSet
- 4.3 SkiplistList: An Efficient Random-AccessList
- 4.4 Analysis of Skiplists
- 4.5 Discussion and Exercises
- 5 Hash Tables
- 5.1 ChainedHashTable: Hashing with Chaining
- 5.2 LinearHashTable: Linear Probing
- 5.3 Hash Codes
- 5.4 Discussion and Exercises
- 6 Binary Trees
- 6.1 BinaryTree: A Basic Binary Tree
- 6.2 BinarySearchTree: An Unbalanced Binary Search Tree
- 6.3 Discussion and Exercises
- 7 Random Binary Search Trees
- 7.1 Random Binary Search Trees
- 7.2 Treap: A Randomized Binary Search Tree
- 7.3 Discussion and Exercises
- 8 Scapegoat Trees
- 9 Red-Black Trees
- 10 Heaps
- 10.1 BinaryHeap: An Implicit Binary Tree
- 10.2 MeldableHeap: A Randomized Meldable Heap
- 10.3 Discussion and Exercises
- 11 Sorting Algorithms
- 12 Graphs
- 12.1 AdjacencyMatrix: Representing a Graph by a Matrix
- 12.2 AdjacencyLists: A Graph as a Collection of Lists
- 12.3 Graph Traversal
- 12.4 Discussion and Exercises
- 13 Data Structures for Integers
- 13.1 BinaryTrie: A digital search tree
- 13.2 XFastTrie: Searching in Doubly-Logarithmic Time
- 13.3 YFastTrie: A Doubly-Logarithmic TimeSSet
- 13.4 Discussion and Exercises
- 14 External Memory Searching