Course Description:         

Making efficient use of computational resources is one of the important tasks of any computer scientists. In this course we will explore different ways of organizing data to facilitate such sufficient use. This course covers the following topics:

  • Data structures: Abstract data types (ADTs), vector, deque, list, queue, stack, graph, digraph, table, map (associative array), priority queue, set, and tree, etc. 
  • Algorithms: Algorithms are formalizations of processes that result in predictable and desirable outcomes. They are used in a variety of contexts. Particularly, data structures are made usable by implementing algorithms for searching, sorting, and indexing the structures. Algorithm design, complexity analysis and correctness proof form important components in study of algorithms. 
  • Generic programming: Generic programming is the science of component re-use. We will explore coding for re-use of both data structures and algorithms in C++. Coding for re-use and re-use of code are important aspects of software engineering.

We will also have several substantial programming projects that involve the implementation and use of data structures, algorithms, and generic programming.

Course Objective:

The objective of the course is to teach students how to design, write, and analyze the performance of C/C++ programs that handle structured data and perform more complex tasks, typical of larger software projects. Students should acquire skills in using generic principles for data representation and manipulation with a view for efficiency, maintainability, and code-reuse. Successful students will, at the end of the course, be able to demonstrate analytical comprehension of concepts such as abstract data types (vectors, lists, deques, trees, etc.), generic programming techniques (containers, adaptors, accessing data through interface, iterators, etc.), algorithms (sorting, using stacks and queues, tree exploration algorithms, etc.), and efficiency analysis (which data structures allow efficient interfaces to particular forms of data access, such as random vs. sequential data access or insertion). The students should be able to demonstrate similar skills in related implementation tasks in the C/C++ language, including extensive use of templates to allow for modularity and re-usability of code. 

Prerequisites:

  • COP 3330: Object-Oriented Programming
  • MAD 2104: Discrete Mathematics
  • CDA  3100: Computer Organization I (co-requisite)
  • This course requires that the student be proficient with C++ and object oriented programming concepts.
  • Student also need to have a user-level knowledge of Unix, and be comfortable working in a Unix environment.
  • The pre-requisites will not be waived.
  • If you have doubts whether you satisfy the course pre-requisites, please contact the instructor.

Textbooks

  • Required textbook
    • “Data Structure and Algorithm Analysis in C++”, by Mark Allen Weiss. Publisher: Addison Wesley, 4th Edition, 2013.
  • Recommended optional textbooks
    • “C++ Primer”, by Lippman, Lajoie, and Moo. Publisher: Addison-Wesley
    • “Data Structures with C++ using STL”, by William Ford and William Topp. Publisher: Prentice Hall.
    • “Absolute C++”, by Walter Savitch, 3rd Edition. Publisher: Addison Wesley
    • “The C++ Standard Library: A Tutorial and Reference”, by Nicolai M. Josuttis. Addison-Wesley.
    • “C++ How to Program”, by H. M. Deitel, and P. J. Deitel. Publisher: Prentice Hall.
    • “Introduction to Algorithms”, by Cormen, Leiserson, and Rivest, Publisher: MIT press and McGraw-Hill Book Company

Course Contents

The course outline will closely follow the material presented in book by Mark Allen Weiss. We will cover chapters 1–7 in detail and other chapters in any remaining extra time.

Chapter 1 Programming: A General Overview 1

1.1 What’s This Book About? 1

1.2 Mathematics Review 2

1.2.1 Exponents 3

1.2.2 Logarithms 3

1.2.3 Series 4

1.2.4 Modular Arithmetic 5

1.2.5 The Word 6

1.3 A Brief Introduction to Recursion 8

1.4 C++ Classes 12

1.4.1 Basic class Syntax 12

1.4.2 Extra Constructor Syntax and Accessors 13

1.4.3 Separation of Interface and Implementation 16

1.4.4 vector and string 19

1.5 C++ Details 21

1.5.1 Pointers 21

1.5.2 Lvalues, Rvalues, and References 23

1.5.3 Parameter Passing 25

1.5.4 Return Passing 27

1.5.5 std::swap and std::move 29

1.5.6 The Big-Five: Destructor, Copy Constructor, Move Constructor, Copy Assignment operator=, Move Assignment operator= 30

1.5.7 C-style Arrays and Strings 35

1.6 Templates 36

1.6.1 Function Templates 37

1.6.2 Class Templates 38

1.6.3 Object, Comparable, and an Example 39

1.6.4 Function Objects 41

1.6.5 Separate Compilation of Class Templates 44

1.7 Using Matrices 44

1.7.1 The Data Members, Constructor, and Basic Accessors 44

1.7.2 operator[] 45

1.7.3 Big-Five 46

Summary 46

Exercises 46

References 48

Chapter 2 Algorithm Analysis 51

2.1 Mathematical Background 51

2.2 Model 54

2.3 What to Analyze 54

2.4 Running-Time Calculations 57

2.4.1 A Simple Example 58

2.4.2 General Rules 58

2.4.3 Solutions for the Maximum Subsequence Sum Problem 60

2.4.4 Logarithms in the Running Time 66

2.4.5 Limitations of Worst Case Analysis 70

Summary 70

Exercises 71

References 76

Chapter 3 Lists, Stacks, and Queues 77

3.1 Abstract Data Types (ADTs) 77

3.2 The List ADT 78

3.2.1 Simple Array Implementation of Lists 78

3.2.2 Simple Linked Lists 79

3.3 vector and list in the STL 80

3.3.1 Iterators 82

3.3.2 Example: Using erase on a List 83

3.3.3 const_iterators 84

3.4 Implementation of vector 86

3.5 Implementation of list 91

3.6 The Stack ADT 103

3.6.1 Stack Model 103

3.6.2 Implementation of Stacks 104

3.6.3 Applications 104

3.7 The Queue ADT 112

3.7.1 Queue Model 113

3.7.2 Array Implementation of Queues 113

3.7.3 Applications of Queues 115

Summary 116

Exercises 116

Chapter 4 Trees 121

4.1 Preliminaries 121

4.1.1 Implementation of Trees 122

4.1.2 Tree Traversals with an Application 123

4.2 Binary Trees 126

4.2.1 Implementation 128

4.2.2 An Example: Expression Trees 128

4.3 The Search Tree ADT–Binary Search Trees 132

4.3.1 contains 134

4.3.2 findMin and findMax 135

4.3.3 insert 136

4.3.4 remove 139

4.3.5 Destructor and Copy Constructor 141

4.3.6 Average-Case Analysis 141

4.4 AVL Trees 144

4.4.1 Single Rotation 147

4.4.2 Double Rotation 149

4.5 Splay Trees 158

4.5.1 A Simple Idea (That Does Not Work) 158

4.5.2 Splaying 160

4.6 Tree Traversals (Revisited) 166

4.7 B-Trees 168

4.8 Sets and Maps in the Standard Library 173

4.8.1 Sets 173

4.8.2 Maps 174

4.8.3 Implementation of set and map 175

4.8.4 An Example That Uses Several Maps 176

Summary 181

Exercises 182

References 189

Chapter 5 Hashing 193

5.1 General Idea 193

5.2 Hash Function 194

5.3 Separate Chaining 196

5.4 Hash Tables without Linked Lists 201

5.4.1 Linear Probing 201

5.4.2 Quadratic Probing 202

5.4.3 Double Hashing 207

5.5 Rehashing 208

5.6 Hash Tables in the Standard Library 210

5.7 Hash Tables with Worst-Case O(1) Access 212

5.7.1 Perfect Hashing 213

5.7.2 Cuckoo Hashing 215

5.7.3 Hopscotch Hashing 224

5.8 Universal Hashing 230

5.9 Extendible Hashing 233

Summary 236

Exercises 238

References 242

Chapter 6 Priority Queues (Heaps) 245

6.1 Model 245

6.2 Simple Implementations 246

6.3 Binary Heap 247

6.3.1 Structure Property 247

6.3.2 Heap-Order Property 248

6.3.3 Basic Heap Operations 249

6.3.4 Other Heap Operations 252

6.4 Applications of Priority Queues 257

6.4.1 The Selection Problem 258

6.4.2 Event Simulation 259

6.5 d-Heaps 260

6.6 Leftist Heaps 261

6.6.1 Leftist Heap Property 261

6.6.2 Leftist Heap Operations 262

6.7 Skew Heaps 269

6.8 Binomial Queues 271

6.8.1 Binomial Queue Structure 271

6.8.2 Binomial Queue Operations 271

6.8.3 Implementation of Binomial Queues 276

6.9 Priority Queues in the Standard Library 283

Summary 283

Exercises 283

References 288

Chapter 7 Sorting 291

7.1 Preliminaries 291

7.2 Insertion Sort 292

7.2.1 The Algorithm 292

7.2.2 STL Implementation of Insertion Sort 293

7.2.3 Analysis of Insertion Sort 294

7.3 A Lower Bound for Simple Sorting Algorithms 295

7.4 Shellsort 296

7.4.1 Worst-Case Analysis of Shellsort 297

7.5 Heapsort 300

7.5.1 Analysis of Heapsort 301

7.6 Mergesort 304

7.6.1 Analysis of Mergesort 306

7.7 Quicksort 309

7.7.1 Picking the Pivot 311

7.7.2 Partitioning Strategy 313

7.7.3 Small Arrays 315

7.7.4 Actual Quicksort Routines 315

7.7.5 Analysis of Quicksort 318

7.7.6 A Linear-Expected-Time Algorithm for Selection 321

7.8 A General Lower Bound for Sorting 323

7.8.1 Decision Trees 323

7.9 Decision-Tree Lower Bounds for Selection Problems 325

7.10 Adversary Lower Bounds 328

7.11 Linear-Time Sorts: Bucket Sort and Radix Sort 331

7.12 External Sorting 336

7.12.1 Why We Need New Algorithms 336

7.12.2 Model for External Sorting 336

7.12.3 The Simple Algorithm 337

7.12.4 Multiway Merge 338

7.12.5 Polyphase Merge 339

7.12.6 Replacement Selection 340

Summary 341

Exercises 341

References 347

Chapter 8 The Disjoint Sets Class 351

8.1 Equivalence Relations 351

8.2 The Dynamic Equivalence Problem 352

8.3 Basic Data Structure 353

8.4 Smart Union Algorithms 357

8.5 Path Compression 360

8.6 Worst Case for Union-by-Rank and Path Compression 361

8.6.1 Slowly Growing Functions 362

8.6.2 An Analysis by Recursive Decomposition 362

8.6.3 An Olog *) Bound 369

8.6.4 An OM α(M, N) ) Bound 370

8.7 An Application 372

Summary 374

Exercises 375

References 376

Chapter 9 Graph Algorithms 379

9.1 Definitions 379

9.1.1 Representation of Graphs 380

9.2 Topological Sort 382

9.3 Shortest-Path Algorithms 386

9.3.1 Unweighted Shortest Paths 387

9.3.2 Dijkstra’s Algorithm 391

9.3.3 Graphs with Negative Edge Costs 400

9.3.4 Acyclic Graphs 400

9.3.5 All-Pairs Shortest Path 404

9.3.6 Shortest Path Example 404

9.4 Network Flow Problems 406

9.4.1 A Simple Maximum-Flow Algorithm 408

9.5 Minimum Spanning Tree 413

9.5.1 Prim’s Algorithm 414

9.5.2 Kruskal’s Algorithm 417

9.6 Applications of Depth-First Search 419

9.6.1 Undirected Graphs 420

9.6.2 Biconnectivity 421

9.6.3 Euler Circuits 425

9.6.4 Directed Graphs 429

9.6.5 Finding Strong Components 431

9.7 Introduction to NP-Completeness 432

9.7.1 Easy vs. Hard 433

9.7.2 The Class NP 434

9.7.3 NP-Complete Problems 434

Summary 437

Exercises 437

References 445

Chapter 10 Algorithm Design Techniques 449

10.1 Greedy Algorithms 449

10.1.1 A Simple Scheduling Problem 450

10.1.2 Huffman Codes 453

10.1.3 Approximate Bin Packing 459

10.2 Divide and Conquer 467

10.2.1 Running Time of Divide-and-Conquer Algorithms 468

10.2.2 Closest-Points Problem 470

10.2.3 The Selection Problem 475

10.2.4 Theoretical Improvements for Arithmetic Problems 478

10.3 Dynamic Programming 482

10.3.1 Using a Table Instead of Recursion 483

10.3.2 Ordering Matrix Multiplications 485

10.3.3 Optimal Binary Search Tree 487

10.3.4 All-Pairs Shortest Path 491

10.4 Randomized Algorithms 494

10.4.1 Random-Number Generators 495

10.4.2 Skip Lists 500

10.4.3 Primality Testing 503

10.5 Backtracking Algorithms 506

10.5.1 The Turnpike Reconstruction Problem 506

10.5.2 Games 511

Summary 518

Exercises 518

References 527

Chapter 11 Amortized Analysis 533

11.1 An Unrelated Puzzle 534

11.2 Binomial Queues 534

11.3 Skew Heaps 539

11.4 Fibonacci Heaps 541

11.4.1 Cutting Nodes in Leftist Heaps 542

11.4.2 Lazy Merging for Binomial Queues 544

11.4.3 The Fibonacci Heap Operations 548

11.4.4 Proof of the Time Bound 549

11.5 Splay Trees 551

Summary 555

Exercises 556

References 557

Chapter 12 Advanced Data Structures and Implementation 559

12.1 Top-Down Splay Trees 559

12.2 Red-Black Trees 566

12.2.1 Bottom-Up Insertion 567

12.2.2 Top-Down Red-Black Trees 568

12.2.3 Top-Down Deletion 570

12.3 Treaps 576

12.4 Suffix Arrays and Suffix Trees 579

12.4.1 Suffix Arrays 580

12.4.2 Suffix Trees 583

12.4.3 Linear-Time Construction of Suffix Arrays and Suffix Trees 586

12.5 k-d Trees 596

12.6 Pairing Heaps 602- See more at: http://www.pearsonhighered.com/educator/product/Data-Structures-and-Algorithm-Analysis-in-C/9780132847377.page#sthash.tItmjGwR.dpuf

Chapter 1 Programming: A General Overview 1

1.1 What’s This Book About? 1

1.2 Mathematics Review 2

1.2.1 Exponents 3

1.2.2 Logarithms 3

1.2.3 Series 4

1.2.4 Modular Arithmetic 5

1.2.5 The Word 6

1.3 A Brief Introduction to Recursion 8

1.4 C++ Classes 12

1.4.1 Basic class Syntax 12

1.4.2 Extra Constructor Syntax and Accessors 13

1.4.3 Separation of Interface and Implementation 16

1.4.4 vector and string 19

1.5 C++ Details 21

1.5.1 Pointers 21

1.5.2 Lvalues, Rvalues, and References 23

1.5.3 Parameter Passing 25

1.5.4 Return Passing 27

1.5.5 std::swap and std::move 29

1.5.6 The Big-Five: Destructor, Copy Constructor, Move Constructor, Copy Assignment operator=, Move Assignment operator= 30

1.5.7 C-style Arrays and Strings 35

1.6 Templates 36

1.6.1 Function Templates 37

1.6.2 Class Templates 38

1.6.3 Object, Comparable, and an Example 39

1.6.4 Function Objects 41

1.6.5 Separate Compilation of Class Templates 44

1.7 Using Matrices 44

1.7.1 The Data Members, Constructor, and Basic Accessors 44

1.7.2 operator[] 45

1.7.3 Big-Five 46

Summary 46

Exercises 46

References 48

Chapter 2 Algorithm Analysis 51

2.1 Mathematical Background 51

2.2 Model 54

2.3 What to Analyze 54

2.4 Running-Time Calculations 57

2.4.1 A Simple Example 58

2.4.2 General Rules 58

2.4.3 Solutions for the Maximum Subsequence Sum Problem 60

2.4.4 Logarithms in the Running Time 66

2.4.5 Limitations of Worst Case Analysis 70

Summary 70

Exercises 71

References 76

Chapter 3 Lists, Stacks, and Queues 77

3.1 Abstract Data Types (ADTs) 77

3.2 The List ADT 78

3.2.1 Simple Array Implementation of Lists 78

3.2.2 Simple Linked Lists 79

3.3 vector and list in the STL 80

3.3.1 Iterators 82

3.3.2 Example: Using erase on a List 83

3.3.3 const_iterators 84

3.4 Implementation of vector 86

3.5 Implementation of list 91

3.6 The Stack ADT 103

3.6.1 Stack Model 103

3.6.2 Implementation of Stacks 104

3.6.3 Applications 104

3.7 The Queue ADT 112

3.7.1 Queue Model 113

3.7.2 Array Implementation of Queues 113

3.7.3 Applications of Queues 115

Summary 116

Exercises 116

Chapter 4 Trees 121

4.1 Preliminaries 121

4.1.1 Implementation of Trees 122

4.1.2 Tree Traversals with an Application 123

4.2 Binary Trees 126

4.2.1 Implementation 128

4.2.2 An Example: Expression Trees 128

4.3 The Search Tree ADT–Binary Search Trees 132

4.3.1 contains 134

4.3.2 findMin and findMax 135

4.3.3 insert 136

4.3.4 remove 139

4.3.5 Destructor and Copy Constructor 141

4.3.6 Average-Case Analysis 141

4.4 AVL Trees 144

4.4.1 Single Rotation 147

4.4.2 Double Rotation 149

4.5 Splay Trees 158

4.5.1 A Simple Idea (That Does Not Work) 158

4.5.2 Splaying 160

4.6 Tree Traversals (Revisited) 166

4.7 B-Trees 168

4.8 Sets and Maps in the Standard Library 173

4.8.1 Sets 173

4.8.2 Maps 174

4.8.3 Implementation of set and map 175

4.8.4 An Example That Uses Several Maps 176

Summary 181

Exercises 182

References 189

Chapter 5 Hashing 193

5.1 General Idea 193

5.2 Hash Function 194

5.3 Separate Chaining 196

5.4 Hash Tables without Linked Lists 201

5.4.1 Linear Probing 201

5.4.2 Quadratic Probing 202

5.4.3 Double Hashing 207

5.5 Rehashing 208

5.6 Hash Tables in the Standard Library 210

5.7 Hash Tables with Worst-Case O(1) Access 212

5.7.1 Perfect Hashing 213

5.7.2 Cuckoo Hashing 215

5.7.3 Hopscotch Hashing 224

5.8 Universal Hashing 230

5.9 Extendible Hashing 233

Summary 236

Exercises 238

References 242

Chapter 6 Priority Queues (Heaps) 245

6.1 Model 245

6.2 Simple Implementations 246

6.3 Binary Heap 247

6.3.1 Structure Property 247

6.3.2 Heap-Order Property 248

6.3.3 Basic Heap Operations 249

6.3.4 Other Heap Operations 252

6.4 Applications of Priority Queues 257

6.4.1 The Selection Problem 258

6.4.2 Event Simulation 259

6.5 d-Heaps 260

6.6 Leftist Heaps 261

6.6.1 Leftist Heap Property 261

6.6.2 Leftist Heap Operations 262

6.7 Skew Heaps 269

6.8 Binomial Queues 271

6.8.1 Binomial Queue Structure 271

6.8.2 Binomial Queue Operations 271

6.8.3 Implementation of Binomial Queues 276

6.9 Priority Queues in the Standard Library 283

Summary 283

Exercises 283

References 288

Chapter 7 Sorting 291

7.1 Preliminaries 291

7.2 Insertion Sort 292

7.2.1 The Algorithm 292

7.2.2 STL Implementation of Insertion Sort 293

7.2.3 Analysis of Insertion Sort 294

7.3 A Lower Bound for Simple Sorting Algorithms 295

7.4 Shellsort 296

7.4.1 Worst-Case Analysis of Shellsort 297

7.5 Heapsort 300

7.5.1 Analysis of Heapsort 301

7.6 Mergesort 304

7.6.1 Analysis of Mergesort 306

7.7 Quicksort 309

7.7.1 Picking the Pivot 311

7.7.2 Partitioning Strategy 313

7.7.3 Small Arrays 315

7.7.4 Actual Quicksort Routines 315

7.7.5 Analysis of Quicksort 318

7.7.6 A Linear-Expected-Time Algorithm for Selection 321

7.8 A General Lower Bound for Sorting 323

7.8.1 Decision Trees 323

7.9 Decision-Tree Lower Bounds for Selection Problems 325

7.10 Adversary Lower Bounds 328

7.11 Linear-Time Sorts: Bucket Sort and Radix Sort 331

7.12 External Sorting 336

7.12.1 Why We Need New Algorithms 336

7.12.2 Model for External Sorting 336

7.12.3 The Simple Algorithm 337

7.12.4 Multiway Merge 338

7.12.5 Polyphase Merge 339

7.12.6 Replacement Selection 340

Summary 341

Exercises 341

References 347

Chapter 8 The Disjoint Sets Class 351

8.1 Equivalence Relations 351

8.2 The Dynamic Equivalence Problem 352

8.3 Basic Data Structure 353

8.4 Smart Union Algorithms 357

8.5 Path Compression 360

8.6 Worst Case for Union-by-Rank and Path Compression 361

8.6.1 Slowly Growing Functions 362

8.6.2 An Analysis by Recursive Decomposition 362

8.6.3 An Olog *) Bound 369

8.6.4 An OM α(M, N) ) Bound 370

8.7 An Application 372

Summary 374

Exercises 375

References 376

Chapter 9 Graph Algorithms 379

9.1 Definitions 379

9.1.1 Representation of Graphs 380

9.2 Topological Sort 382

9.3 Shortest-Path Algorithms 386

9.3.1 Unweighted Shortest Paths 387

9.3.2 Dijkstra’s Algorithm 391

9.3.3 Graphs with Negative Edge Costs 400

9.3.4 Acyclic Graphs 400

9.3.5 All-Pairs Shortest Path 404

9.3.6 Shortest Path Example 404

9.4 Network Flow Problems 406

9.4.1 A Simple Maximum-Flow Algorithm 408

9.5 Minimum Spanning Tree 413

9.5.1 Prim’s Algorithm 414

9.5.2 Kruskal’s Algorithm 417

9.6 Applications of Depth-First Search 419

9.6.1 Undirected Graphs 420

9.6.2 Biconnectivity 421

9.6.3 Euler Circuits 425

9.6.4 Directed Graphs 429

9.6.5 Finding Strong Components 431

9.7 Introduction to NP-Completeness 432

9.7.1 Easy vs. Hard 433

9.7.2 The Class NP 434

9.7.3 NP-Complete Problems 434

Summary 437

Exercises 437

References 445

Chapter 10 Algorithm Design Techniques 449

10.1 Greedy Algorithms 449

10.1.1 A Simple Scheduling Problem 450

10.1.2 Huffman Codes 453

10.1.3 Approximate Bin Packing 459

10.2 Divide and Conquer 467

10.2.1 Running Time of Divide-and-Conquer Algorithms 468

10.2.2 Closest-Points Problem 470

10.2.3 The Selection Problem 475

10.2.4 Theoretical Improvements for Arithmetic Problems 478

10.3 Dynamic Programming 482

10.3.1 Using a Table Instead of Recursion 483

10.3.2 Ordering Matrix Multiplications 485

10.3.3 Optimal Binary Search Tree 487

10.3.4 All-Pairs Shortest Path 491

10.4 Randomized Algorithms 494

10.4.1 Random-Number Generators 495

10.4.2 Skip Lists 500

10.4.3 Primality Testing 503

10.5 Backtracking Algorithms 506

10.5.1 The Turnpike Reconstruction Problem 506

10.5.2 Games 511

Summary 518

Exercises 518

References 527

Chapter 11 Amortized Analysis 533

11.1 An Unrelated Puzzle 534

11.2 Binomial Queues 534

11.3 Skew Heaps 539

11.4 Fibonacci Heaps 541

11.4.1 Cutting Nodes in Leftist Heaps 542

11.4.2 Lazy Merging for Binomial Queues 544

11.4.3 The Fibonacci Heap Operations 548

11.4.4 Proof of the Time Bound 549

11.5 Splay Trees 551

Summary 555

Exercises 556

References 557

Chapter 12 Advanced Data Structures and Implementation 559

12.1 Top-Down Splay Trees 559

12.2 Red-Black Trees 566

12.2.1 Bottom-Up Insertion 567

12.2.2 Top-Down Red-Black Trees 568

12.2.3 Top-Down Deletion 570

12.3 Treaps 576

12.4 Suffix Arrays and Suffix Trees 579

12.4.1 Suffix Arrays 580

12.4.2 Suffix Trees 583

12.4.3 Linear-Time Construction of Suffix Arrays and Suffix Trees 586

12.5 k-d Trees 596

12.6 Pairing Heaps 602- See more at: http://www.pearsonhighered.com/educator/product/Data-Structures-and-Algorithm-Analysis-in-C/9780132847377.page#sthash.tItmjGwR.dpuf

Chapter 1 Programming: A General Overview 1

1.1 What’s This Book About? 1

1.2 Mathematics Review 2

1.2.1 Exponents 3

1.2.2 Logarithms 3

1.2.3 Series 4

1.2.4 Modular Arithmetic 5

1.2.5 The Word 6

1.3 A Brief Introduction to Recursion 8

1.4 C++ Classes 12

1.4.1 Basic class Syntax 12

1.4.2 Extra Constructor Syntax and Accessors 13

1.4.3 Separation of Interface and Implementation 16

1.4.4 vector and string 19

1.5 C++ Details 21

1.5.1 Pointers 21

1.5.2 Lvalues, Rvalues, and References 23

1.5.3 Parameter Passing 25

1.5.4 Return Passing 27

1.5.5 std::swap and std::move 29

1.5.6 The Big-Five: Destructor, Copy Constructor, Move Constructor, Copy Assignment operator=, Move Assignment operator= 30

1.5.7 C-style Arrays and Strings 35

1.6 Templates 36

1.6.1 Function Templates 37

1.6.2 Class Templates 38

1.6.3 Object, Comparable, and an Example 39

1.6.4 Function Objects 41

1.6.5 Separate Compilation of Class Templates 44

1.7 Using Matrices 44

1.7.1 The Data Members, Constructor, and Basic Accessors 44

1.7.2 operator[] 45

1.7.3 Big-Five 46

Summary 46

Exercises 46

References 48

Chapter 2 Algorithm Analysis 51

2.1 Mathematical Background 51

2.2 Model 54

2.3 What to Analyze 54

2.4 Running-Time Calculations 57

2.4.1 A Simple Example 58

2.4.2 General Rules 58

2.4.3 Solutions for the Maximum Subsequence Sum Problem 60

2.4.4 Logarithms in the Running Time 66

2.4.5 Limitations of Worst Case Analysis 70

Summary 70

Exercises 71

References 76

Chapter 3 Lists, Stacks, and Queues 77

3.1 Abstract Data Types (ADTs) 77

3.2 The List ADT 78

3.2.1 Simple Array Implementation of Lists 78

3.2.2 Simple Linked Lists 79

3.3 vector and list in the STL 80

3.3.1 Iterators 82

3.3.2 Example: Using erase on a List 83

3.3.3 const_iterators 84

3.4 Implementation of vector 86

3.5 Implementation of list 91

3.6 The Stack ADT 103

3.6.1 Stack Model 103

3.6.2 Implementation of Stacks 104

3.6.3 Applications 104

3.7 The Queue ADT 112

3.7.1 Queue Model 113

3.7.2 Array Implementation of Queues 113

3.7.3 Applications of Queues 115

Summary 116

Exercises 116

Chapter 4 Trees 121

4.1 Preliminaries 121

4.1.1 Implementation of Trees 122

4.1.2 Tree Traversals with an Application 123

4.2 Binary Trees 126

4.2.1 Implementation 128

4.2.2 An Example: Expression Trees 128

4.3 The Search Tree ADT–Binary Search Trees 132

4.3.1 contains 134

4.3.2 findMin and findMax 135

4.3.3 insert 136

4.3.4 remove 139

4.3.5 Destructor and Copy Constructor 141

4.3.6 Average-Case Analysis 141

4.4 AVL Trees 144

4.4.1 Single Rotation 147

4.4.2 Double Rotation 149

4.5 Splay Trees 158

4.5.1 A Simple Idea (That Does Not Work) 158

4.5.2 Splaying 160

4.6 Tree Traversals (Revisited) 166

4.7 B-Trees 168

4.8 Sets and Maps in the Standard Library 173

4.8.1 Sets 173

4.8.2 Maps 174

4.8.3 Implementation of set and map 175

4.8.4 An Example That Uses Several Maps 176

Summary 181

Exercises 182

References 189

Chapter 5 Hashing 193

5.1 General Idea 193

5.2 Hash Function 194

5.3 Separate Chaining 196

5.4 Hash Tables without Linked Lists 201

5.4.1 Linear Probing 201

5.4.2 Quadratic Probing 202

5.4.3 Double Hashing 207

5.5 Rehashing 208

5.6 Hash Tables in the Standard Library 210

5.7 Hash Tables with Worst-Case O(1) Access 212

5.7.1 Perfect Hashing 213

5.7.2 Cuckoo Hashing 215

5.7.3 Hopscotch Hashing 224

5.8 Universal Hashing 230

5.9 Extendible Hashing 233

Summary 236

Exercises 238

References 242

Chapter 6 Priority Queues (Heaps) 245

6.1 Model 245

6.2 Simple Implementations 246

6.3 Binary Heap 247

6.3.1 Structure Property 247

6.3.2 Heap-Order Property 248

6.3.3 Basic Heap Operations 249

6.3.4 Other Heap Operations 252

6.4 Applications of Priority Queues 257

6.4.1 The Selection Problem 258

6.4.2 Event Simulation 259

6.5 d-Heaps 260

6.6 Leftist Heaps 261

6.6.1 Leftist Heap Property 261

6.6.2 Leftist Heap Operations 262

6.7 Skew Heaps 269

6.8 Binomial Queues 271

6.8.1 Binomial Queue Structure 271

6.8.2 Binomial Queue Operations 271

6.8.3 Implementation of Binomial Queues 276

6.9 Priority Queues in the Standard Library 283

Summary 283

Exercises 283

References 288

Chapter 7 Sorting 291

7.1 Preliminaries 291

7.2 Insertion Sort 292

7.2.1 The Algorithm 292

7.2.2 STL Implementation of Insertion Sort 293

7.2.3 Analysis of Insertion Sort 294

7.3 A Lower Bound for Simple Sorting Algorithms 295

7.4 Shellsort 296

7.4.1 Worst-Case Analysis of Shellsort 297

7.5 Heapsort 300

7.5.1 Analysis of Heapsort 301

7.6 Mergesort 304

7.6.1 Analysis of Mergesort 306

7.7 Quicksort 309

7.7.1 Picking the Pivot 311

7.7.2 Partitioning Strategy 313

7.7.3 Small Arrays 315

7.7.4 Actual Quicksort Routines 315

7.7.5 Analysis of Quicksort 318

7.7.6 A Linear-Expected-Time Algorithm for Selection 321

7.8 A General Lower Bound for Sorting 323

7.8.1 Decision Trees 323

7.9 Decision-Tree Lower Bounds for Selection Problems 325

7.10 Adversary Lower Bounds 328

7.11 Linear-Time Sorts: Bucket Sort and Radix Sort 331

7.12 External Sorting 336

7.12.1 Why We Need New Algorithms 336

7.12.2 Model for External Sorting 336

7.12.3 The Simple Algorithm 337

7.12.4 Multiway Merge 338

7.12.5 Polyphase Merge 339

7.12.6 Replacement Selection 340

Summary 341

Exercises 341

References 347

Chapter 8 The Disjoint Sets Class 351

8.1 Equivalence Relations 351

8.2 The Dynamic Equivalence Problem 352

8.3 Basic Data Structure 353

8.4 Smart Union Algorithms 357

8.5 Path Compression 360

8.6 Worst Case for Union-by-Rank and Path Compression 361

8.6.1 Slowly Growing Functions 362

8.6.2 An Analysis by Recursive Decomposition 362

8.6.3 An Olog *) Bound 369

8.6.4 An OM α(M, N) ) Bound 370

8.7 An Application 372

Summary 374

Exercises 375

References 376

Chapter 9 Graph Algorithms 379

9.1 Definitions 379

9.1.1 Representation of Graphs 380

9.2 Topological Sort 382

9.3 Shortest-Path Algorithms 386

9.3.1 Unweighted Shortest Paths 387

9.3.2 Dijkstra’s Algorithm 391

9.3.3 Graphs with Negative Edge Costs 400

9.3.4 Acyclic Graphs 400

9.3.5 All-Pairs Shortest Path 404

9.3.6 Shortest Path Example 404

9.4 Network Flow Problems 406

9.4.1 A Simple Maximum-Flow Algorithm 408

9.5 Minimum Spanning Tree 413

9.5.1 Prim’s Algorithm 414

9.5.2 Kruskal’s Algorithm 417

9.6 Applications of Depth-First Search 419

9.6.1 Undirected Graphs 420

9.6.2 Biconnectivity 421

9.6.3 Euler Circuits 425

9.6.4 Directed Graphs 429

9.6.5 Finding Strong Components 431

9.7 Introduction to NP-Completeness 432

9.7.1 Easy vs. Hard 433

9.7.2 The Class NP 434

9.7.3 NP-Complete Problems 434

Summary 437

Exercises 437

References 445

Chapter 10 Algorithm Design Techniques 449

10.1 Greedy Algorithms 449

10.1.1 A Simple Scheduling Problem 450

10.1.2 Huffman Codes 453

10.1.3 Approximate Bin Packing 459

10.2 Divide and Conquer 467

10.2.1 Running Time of Divide-and-Conquer Algorithms 468

10.2.2 Closest-Points Problem 470

10.2.3 The Selection Problem 475

10.2.4 Theoretical Improvements for Arithmetic Problems 478

10.3 Dynamic Programming 482

10.3.1 Using a Table Instead of Recursion 483

10.3.2 Ordering Matrix Multiplications 485

10.3.3 Optimal Binary Search Tree 487

10.3.4 All-Pairs Shortest Path 491

10.4 Randomized Algorithms 494

10.4.1 Random-Number Generators 495

10.4.2 Skip Lists 500

10.4.3 Primality Testing 503

10.5 Backtracking Algorithms 506

10.5.1 The Turnpike Reconstruction Problem 506

10.5.2 Games 511

Summary 518

Exercises 518

References 527

Chapter 11 Amortized Analysis 533

11.1 An Unrelated Puzzle 534

11.2 Binomial Queues 534

11.3 Skew Heaps 539

11.4 Fibonacci Heaps 541

11.4.1 Cutting Nodes in Leftist Heaps 542

11.4.2 Lazy Merging for Binomial Queues 544

11.4.3 The Fibonacci Heap Operations 548

11.4.4 Proof of the Time Bound 549

11.5 Splay Trees 551

Summary 555

Exercises 556

References 557

Chapter 12 Advanced Data Structures and Implementation 559

12.1 Top-Down Splay Trees 559

12.2 Red-Black Trees 566

12.2.1 Bottom-Up Insertion 567

12.2.2 Top-Down Red-Black Trees 568

12.2.3 Top-Down Deletion 570

12.3 Treaps 576

12.4 Suffix Arrays and Suffix Trees 579

12.4.1 Suffix Arrays 580

12.4.2 Suffix Trees 583

12.4.3 Linear-Time Construction of Suffix Arrays and Suffix Trees 586

12.5 k-d Trees 596

12.6 Pairing Heaps 602- See more at: http://www.pearsonhighered.com/educator/product/Data-Structures-and-Algorithm-Analysis-in-C/9780132847377.page#sthash.tItmjGwR.dpuf

Chapter 1 Programming: A General Overview 1

1.1 What’s This Book About? 1

1.2 Mathematics Review 2

1.2.1 Exponents 3

1.2.2 Logarithms 3

1.2.3 Series 4

1.2.4 Modular Arithmetic 5

1.2.5 The Word 6

1.3 A Brief Introduction to Recursion 8

1.4 C++ Classes 12

1.4.1 Basic class Syntax 12

1.4.2 Extra Constructor Syntax and Accessors 13

1.4.3 Separation of Interface and Implementation 16

1.4.4 vector and string 19

1.5 C++ Details 21

1.5.1 Pointers 21

1.5.2 Lvalues, Rvalues, and References 23

1.5.3 Parameter Passing 25

1.5.4 Return Passing 27

1.5.5 std::swap and std::move 29

1.5.6 The Big-Five: Destructor, Copy Constructor, Move Constructor, Copy Assignment operator=, Move Assignment operator= 30

1.5.7 C-style Arrays and Strings 35

1.6 Templates 36

1.6.1 Function Templates 37

1.6.2 Class Templates 38

1.6.3 Object, Comparable, and an Example 39

1.6.4 Function Objects 41

1.6.5 Separate Compilation of Class Templates 44

1.7 Using Matrices 44

1.7.1 The Data Members, Constructor, and Basic Accessors 44

1.7.2 operator[] 45

1.7.3 Big-Five 46

Summary 46

Exercises 46

References 48

Chapter 2 Algorithm Analysis 51

2.1 Mathematical Background 51

2.2 Model 54

2.3 What to Analyze 54

2.4 Running-Time Calculations 57

2.4.1 A Simple Example 58

2.4.2 General Rules 58

2.4.3 Solutions for the Maximum Subsequence Sum Problem 60

2.4.4 Logarithms in the Running Time 66

2.4.5 Limitations of Worst Case Analysis 70

Summary 70

Exercises 71

References 76

Chapter 3 Lists, Stacks, and Queues 77

3.1 Abstract Data Types (ADTs) 77

3.2 The List ADT 78

3.2.1 Simple Array Implementation of Lists 78

3.2.2 Simple Linked Lists 79

3.3 vector and list in the STL 80

3.3.1 Iterators 82

3.3.2 Example: Using erase on a List 83

3.3.3 const_iterators 84

3.4 Implementation of vector 86

3.5 Implementation of list 91

3.6 The Stack ADT 103

3.6.1 Stack Model 103

3.6.2 Implementation of Stacks 104

3.6.3 Applications 104

3.7 The Queue ADT 112

3.7.1 Queue Model 113

3.7.2 Array Implementation of Queues 113

3.7.3 Applications of Queues 115

Summary 116

Exercises 116

Chapter 4 Trees 121

4.1 Preliminaries 121

4.1.1 Implementation of Trees 122

4.1.2 Tree Traversals with an Application 123

4.2 Binary Trees 126

4.2.1 Implementation 128

4.2.2 An Example: Expression Trees 128

4.3 The Search Tree ADT–Binary Search Trees 132

4.3.1 contains 134

4.3.2 findMin and findMax 135

4.3.3 insert 136

4.3.4 remove 139

4.3.5 Destructor and Copy Constructor 141

4.3.6 Average-Case Analysis 141

4.4 AVL Trees 144

4.4.1 Single Rotation 147

4.4.2 Double Rotation 149

4.5 Splay Trees 158

4.5.1 A Simple Idea (That Does Not Work) 158

4.5.2 Splaying 160

4.6 Tree Traversals (Revisited) 166

4.7 B-Trees 168

4.8 Sets and Maps in the Standard Library 173

4.8.1 Sets 173

4.8.2 Maps 174

4.8.3 Implementation of set and map 175

4.8.4 An Example That Uses Several Maps 176

Summary 181

Exercises 182

References 189

Chapter 5 Hashing 193

5.1 General Idea 193

5.2 Hash Function 194

5.3 Separate Chaining 196

5.4 Hash Tables without Linked Lists 201

5.4.1 Linear Probing 201

5.4.2 Quadratic Probing 202

5.4.3 Double Hashing 207

5.5 Rehashing 208

5.6 Hash Tables in the Standard Library 210

5.7 Hash Tables with Worst-Case O(1) Access 212

5.7.1 Perfect Hashing 213

5.7.2 Cuckoo Hashing 215

5.7.3 Hopscotch Hashing 224

5.8 Universal Hashing 230

5.9 Extendible Hashing 233

Summary 236

Exercises 238

References 242

Chapter 6 Priority Queues (Heaps) 245

6.1 Model 245

6.2 Simple Implementations 246

6.3 Binary Heap 247

6.3.1 Structure Property 247

6.3.2 Heap-Order Property 248

6.3.3 Basic Heap Operations 249

6.3.4 Other Heap Operations 252

6.4 Applications of Priority Queues 257

6.4.1 The Selection Problem 258

6.4.2 Event Simulation 259

6.5 d-Heaps 260

6.6 Leftist Heaps 261

6.6.1 Leftist Heap Property 261

6.6.2 Leftist Heap Operations 262

6.7 Skew Heaps 269

6.8 Binomial Queues 271

6.8.1 Binomial Queue Structure 271

6.8.2 Binomial Queue Operations 271

6.8.3 Implementation of Binomial Queues 276

6.9 Priority Queues in the Standard Library 283

Summary 283

Exercises 283

References 288

Chapter 7 Sorting 291

7.1 Preliminaries 291

7.2 Insertion Sort 292

7.2.1 The Algorithm 292

7.2.2 STL Implementation of Insertion Sort 293

7.2.3 Analysis of Insertion Sort 294

7.3 A Lower Bound for Simple Sorting Algorithms 295

7.4 Shellsort 296

7.4.1 Worst-Case Analysis of Shellsort 297

7.5 Heapsort 300

7.5.1 Analysis of Heapsort 301

7.6 Mergesort 304

7.6.1 Analysis of Mergesort 306

7.7 Quicksort 309

7.7.1 Picking the Pivot 311

7.7.2 Partitioning Strategy 313

7.7.3 Small Arrays 315

7.7.4 Actual Quicksort Routines 315

7.7.5 Analysis of Quicksort 318

7.7.6 A Linear-Expected-Time Algorithm for Selection 321

7.8 A General Lower Bound for Sorting 323

7.8.1 Decision Trees 323

7.9 Decision-Tree Lower Bounds for Selection Problems 325

7.10 Adversary Lower Bounds 328

7.11 Linear-Time Sorts: Bucket Sort and Radix Sort 331

7.12 External Sorting 336

7.12.1 Why We Need New Algorithms 336

7.12.2 Model for External Sorting 336

7.12.3 The Simple Algorithm 337

7.12.4 Multiway Merge 338

7.12.5 Polyphase Merge 339

7.12.6 Replacement Selection 340

Summary 341

Exercises 341

References 347

Chapter 8 The Disjoint Sets Class 351

8.1 Equivalence Relations 351

8.2 The Dynamic Equivalence Problem 352

8.3 Basic Data Structure 353

8.4 Smart Union Algorithms 357

8.5 Path Compression 360

8.6 Worst Case for Union-by-Rank and Path Compression 361

8.6.1 Slowly Growing Functions 362

8.6.2 An Analysis by Recursive Decomposition 362

8.6.3 An Olog *) Bound 369

8.6.4 An OM α(M, N) ) Bound 370

8.7 An Application 372

Summary 374

Exercises 375

References 376

Chapter 9 Graph Algorithms 379

9.1 Definitions 379

9.1.1 Representation of Graphs 380

9.2 Topological Sort 382

9.3 Shortest-Path Algorithms 386

9.3.1 Unweighted Shortest Paths 387

9.3.2 Dijkstra’s Algorithm 391

9.3.3 Graphs with Negative Edge Costs 400

9.3.4 Acyclic Graphs 400

9.3.5 All-Pairs Shortest Path 404

9.3.6 Shortest Path Example 404

9.4 Network Flow Problems 406

9.4.1 A Simple Maximum-Flow Algorithm 408

9.5 Minimum Spanning Tree 413

9.5.1 Prim’s Algorithm 414

9.5.2 Kruskal’s Algorithm 417

9.6 Applications of Depth-First Search 419

9.6.1 Undirected Graphs 420

9.6.2 Biconnectivity 421

9.6.3 Euler Circuits 425

9.6.4 Directed Graphs 429

9.6.5 Finding Strong Components 431

9.7 Introduction to NP-Completeness 432

9.7.1 Easy vs. Hard 433

9.7.2 The Class NP 434

9.7.3 NP-Complete Problems 434

Summary 437

Exercises 437

References 445

Chapter 10 Algorithm Design Techniques 449

10.1 Greedy Algorithms 449

10.1.1 A Simple Scheduling Problem 450

10.1.2 Huffman Codes 453

10.1.3 Approximate Bin Packing 459

10.2 Divide and Conquer 467

10.2.1 Running Time of Divide-and-Conquer Algorithms 468

10.2.2 Closest-Points Problem 470

10.2.3 The Selection Problem 475

10.2.4 Theoretical Improvements for Arithmetic Problems 478

10.3 Dynamic Programming 482

10.3.1 Using a Table Instead of Recursion 483

10.3.2 Ordering Matrix Multiplications 485

10.3.3 Optimal Binary Search Tree 487

10.3.4 All-Pairs Shortest Path 491

10.4 Randomized Algorithms 494

10.4.1 Random-Number Generators 495

10.4.2 Skip Lists 500

10.4.3 Primality Testing 503

10.5 Backtracking Algorithms 506

10.5.1 The Turnpike Reconstruction Problem 506

10.5.2 Games 511

Summary 518

Exercises 518

References 527

Chapter 11 Amortized Analysis 533

11.1 An Unrelated Puzzle 534

11.2 Binomial Queues 534

11.3 Skew Heaps 539

11.4 Fibonacci Heaps 541

11.4.1 Cutting Nodes in Leftist Heaps 542

11.4.2 Lazy Merging for Binomial Queues 544

11.4.3 The Fibonacci Heap Operations 548

11.4.4 Proof of the Time Bound 549

11.5 Splay Trees 551

Summary 555

Exercises 556

References 557

Chapter 12 Advanced Data Structures and Implementation 559

12.1 Top-Down Splay Trees 559

12.2 Red-Black Trees 566

12.2.1 Bottom-Up Insertion 567

12.2.2 Top-Down Red-Black Trees 568

12.2.3 Top-Down Deletion 570

12.3 Treaps 576

12.4 Suffix Arrays and Suffix Trees 579

12.4.1 Suffix Arrays 580

12.4.2 Suffix Trees 583

12.4.3 Linear-Time Construction of Suffix Arrays and Suffix Trees 586

12.5 k-d Trees 596

12.6 Pairing Heaps 602- See more at: http://www.pearsonhighered.com/educator/product/Data-Structures-and-Algorithm-Analysis-in-C/9780132847377.page#sthash.tItmjGwR.dpuf

Chapter 1 Programming: A General Overview 1

1.1 What’s This Book About? 1

1.2 Mathematics Review 2

1.2.1 Exponents 3

1.2.2 Logarithms 3

1.2.3 Series 4

1.2.4 Modular Arithmetic 5

1.2.5 The Word 6

1.3 A Brief Introduction to Recursion 8

1.4 C++ Classes 12

1.4.1 Basic class Syntax 12

1.4.2 Extra Constructor Syntax and Accessors 13

1.4.3 Separation of Interface and Implementation 16

1.4.4 vector and string 19

1.5 C++ Details 21

1.5.1 Pointers 21

1.5.2 Lvalues, Rvalues, and References 23

1.5.3 Parameter Passing 25

1.5.4 Return Passing 27

1.5.5 std::swap and std::move 29

1.5.6 The Big-Five: Destructor, Copy Constructor, Move Constructor, Copy Assignment operator=, Move Assignment operator= 30

1.5.7 C-style Arrays and Strings 35

1.6 Templates 36

1.6.1 Function Templates 37

1.6.2 Class Templates 38

1.6.3 Object, Comparable, and an Example 39

1.6.4 Function Objects 41

1.6.5 Separate Compilation of Class Templates 44

1.7 Using Matrices 44

1.7.1 The Data Members, Constructor, and Basic Accessors 44

1.7.2 operator[] 45

1.7.3 Big-Five 46

Summary 46

Exercises 46

References 48- See more at: http://www.pearsonhighered.com/educator/product/Data-Structures-and-Algorithm-Analysis-in-C/9780132847377.page#sthash.tItmjGwR.dpuf

Chapter 1 Programming: A General Overview 1
1.1 What’s This Book About? 1
1.2 Mathematics Review 2
1.3 A Brief Introduction to Recursion 8
1.4 C++ Classes 12
1.5 C++ Details 21
1.6 Templates 36
1.7 Using Matrices 44

Chapter 2 Algorithm Analysis 51
2.1 Mathematical Background 51
2.2 Model 54
2.3 What to Analyze 54
2.4 Running-Time Calculations 57

Chapter 3 Lists, Stacks, and Queues 77
3.1 Abstract Data Types (ADTs) 77
3.2 The List ADT 78
3.3 vector and list in the STL 80
3.4 Implementation of vector 86
3.5 Implementation of list 91
3.6 The Stack ADT 103
3.7 The Queue ADT 112

Chapter 4 Trees 121
4.1 Preliminaries 121
4.2 Binary Trees 126
4.3 The Search Tree ADT–Binary Search Trees 132
4.4 AVL Trees 144
4.5 Splay Trees 158
4.6 Tree Traversals (Revisited) 166
4.7 B-Trees 168
4.8 Sets and Maps in the Standard Library 173

Chapter 5 Hashing 193
5.1 General Idea 193
5.2 Hash Function 194
5.3 Separate Chaining 196
5.4 Hash Tables without Linked Lists 201
5.5 Rehashing 208
5.6 Hash Tables in the Standard Library 210
5.7 Hash Tables with Worst-Case O(1) Access 212
5.8 Universal Hashing 230
5.9 Extendible Hashing 233

Chapter 6 Priority Queues (Heaps) 245
6.1 Model 245
6.2 Simple Implementations 246
6.3 Binary Heap 247
6.4 Applications of Priority Queues 257
6.5 d-Heaps 260
6.6 Leftist Heaps 261
6.7 Skew Heaps 269
6.8 Binomial Queues 271
6.9 Priority Queues in the Standard Library 283

Chapter 7 Sorting 291
7.1 Preliminaries 291
7.2 Insertion Sort 292
7.3 A Lower Bound for Simple Sorting Algorithms 295
7.4 Shellsort 296
7.5 Heapsort 300
7.6 Mergesort 304
7.7 Quicksort 309
7.8 A General Lower Bound for Sorting 323
7.9 Decision-Tree Lower Bounds for Selection Problems 325
7.10 Adversary Lower Bounds 328
7.11 Linear-Time Sorts: Bucket Sort and Radix Sort 331
7.12 External Sorting 336

Chapter 8 The Disjoint Sets Class 351
8.1 Equivalence Relations 351
8.2 The Dynamic Equivalence Problem 352
8.3 Basic Data Structure 353
8.4 Smart Union Algorithms 357
8.5 Path Compression 360
8.6 Worst Case for Union-by-Rank and Path Compression 361
8.7 An Application 372

Chapter 9 Graph Algorithms 379
9.1 Definitions 379
9.1.1 Representation of Graphs 380
9.2 Topological Sort 382
9.3 Shortest-Path Algorithms 386
9.4 Network Flow Problems 406
9.5 Minimum Spanning Tree 413
9.6 Applications of Depth-First Search 419
9.7 Introduction to NP-Completeness 432

Chapter 10 Algorithm Design Techniques 449
10.1 Greedy Algorithms 449
10.2 Divide and Conquer 467
10.3 Dynamic Programming 482
10.4 Randomized Algorithms 494
10.5 Backtracking Algorithms 506

Chapter 11 Amortized Analysis 533
11.1 An Unrelated Puzzle 534
11.2 Binomial Queues 534
11.3 Skew Heaps 539
11.4 Fibonacci Heaps 541
11.5 Splay Trees 551

Chapter 12 Advanced Data Structures and Implementation 559
12.1 Top-Down Splay Trees 559
12.2 Red-Black Trees 566
12.3 Treaps 576
12.4 Suffix Arrays and Suffix Trees 579
12.5 k-d Trees 596
12.6 Pairing Heaps 602

Chapter 1 Programming: A General Overview 1

1.1 What’s This Book About? 1

1.2 Mathematics Review 2

1.2.1 Exponents 3

1.2.2 Logarithms 3

1.2.3 Series 4

1.2.4 Modular Arithmetic 5

1.2.5 The Word 6

1.3 A Brief Introduction to Recursion 8

1.4 C++ Classes 12

1.4.1 Basic class Syntax 12

1.4.2 Extra Constructor Syntax and Accessors 13

1.4.3 Separation of Interface and Implementation 16

1.4.4 vector and string 19

1.5 C++ Details 21

1.5.1 Pointers 21

1.5.2 Lvalues, Rvalues, and References 23

1.5.3 Parameter Passing 25

1.5.4 Return Passing 27

1.5.5 std::swap and std::move 29

1.5.6 The Big-Five: Destructor, Copy Constructor, Move Constructor, Copy Assignment operator=, Move Assignment operator= 30

1.5.7 C-style Arrays and Strings 35

1.6 Templates 36

1.6.1 Function Templates 37

1.6.2 Class Templates 38

1.6.3 Object, Comparable, and an Example 39

1.6.4 Function Objects 41

1.6.5 Separate Compilation of Class Templates 44

1.7 Using Matrices 44

1.7.1 The Data Members, Constructor, and Basic Accessors 44

1.7.2 operator[] 45

1.7.3 Big-Five 46

Summary 46

Exercises 46

References 48

Chapter 2 Algorithm Analysis 51

2.1 Mathematical Background 51

2.2 Model 54

2.3 What to Analyze 54

2.4 Running-Time Calculations 57

2.4.1 A Simple Example 58

2.4.2 General Rules 58

2.4.3 Solutions for the Maximum Subsequence Sum Problem 60

2.4.4 Logarithms in the Running Time 66

2.4.5 Limitations of Worst Case Analysis 70

Summary 70

Exercises 71

References 76

Chapter 3 Lists, Stacks, and Queues 77

3.1 Abstract Data Types (ADTs) 77

3.2 The List ADT 78

3.2.1 Simple Array Implementation of Lists 78

3.2.2 Simple Linked Lists 79

3.3 vector and list in the STL 80

3.3.1 Iterators 82

3.3.2 Example: Using erase on a List 83

3.3.3 const_iterators 84

3.4 Implementation of vector 86

3.5 Implementation of list 91

3.6 The Stack ADT 103

3.6.1 Stack Model 103

3.6.2 Implementation of Stacks 104

3.6.3 Applications 104

3.7 The Queue ADT 112

3.7.1 Queue Model 113

3.7.2 Array Implementation of Queues 113

3.7.3 Applications of Queues 115

Summary 116

Exercises 116

Chapter 4 Trees 121

4.1 Preliminaries 121

4.1.1 Implementation of Trees 122

4.1.2 Tree Traversals with an Application 123

4.2 Binary Trees 126

4.2.1 Implementation 128

4.2.2 An Example: Expression Trees 128

4.3 The Search Tree ADT–Binary Search Trees 132

4.3.1 contains 134

4.3.2 findMin and findMax 135

4.3.3 insert 136

4.3.4 remove 139

4.3.5 Destructor and Copy Constructor 141

4.3.6 Average-Case Analysis 141

4.4 AVL Trees 144

4.4.1 Single Rotation 147

4.4.2 Double Rotation 149

4.5 Splay Trees 158

4.5.1 A Simple Idea (That Does Not Work) 158

4.5.2 Splaying 160

4.6 Tree Traversals (Revisited) 166

4.7 B-Trees 168

4.8 Sets and Maps in the Standard Library 173

4.8.1 Sets 173

4.8.2 Maps 174

4.8.3 Implementation of set and map 175

4.8.4 An Example That Uses Several Maps 176

Summary 181

Exercises 182

References 189

Chapter 5 Hashing 193

5.1 General Idea 193

5.2 Hash Function 194

5.3 Separate Chaining 196

5.4 Hash Tables without Linked Lists 201

5.4.1 Linear Probing 201

5.4.2 Quadratic Probing 202

5.4.3 Double Hashing 207

5.5 Rehashing 208

5.6 Hash Tables in the Standard Library 210

5.7 Hash Tables with Worst-Case O(1) Access 212

5.7.1 Perfect Hashing 213

5.7.2 Cuckoo Hashing 215

5.7.3 Hopscotch Hashing 224

5.8 Universal Hashing 230

5.9 Extendible Hashing 233

Summary 236

Exercises 238

References 242

Chapter 6 Priority Queues (Heaps) 245

6.1 Model 245

6.2 Simple Implementations 246

6.3 Binary Heap 247

6.3.1 Structure Property 247

6.3.2 Heap-Order Property 248

6.3.3 Basic Heap Operations 249

6.3.4 Other Heap Operations 252

6.4 Applications of Priority Queues 257

6.4.1 The Selection Problem 258

6.4.2 Event Simulation 259

6.5 d-Heaps 260

6.6 Leftist Heaps 261

6.6.1 Leftist Heap Property 261

6.6.2 Leftist Heap Operations 262

6.7 Skew Heaps 269

6.8 Binomial Queues 271

6.8.1 Binomial Queue Structure 271

6.8.2 Binomial Queue Operations 271

6.8.3 Implementation of Binomial Queues 276

6.9 Priority Queues in the Standard Library 283

Summary 283

Exercises 283

References 288

Chapter 7 Sorting 291

7.1 Preliminaries 291

7.2 Insertion Sort 292

7.2.1 The Algorithm 292

7.2.2 STL Implementation of Insertion Sort 293

7.2.3 Analysis of Insertion Sort 294

7.3 A Lower Bound for Simple Sorting Algorithms 295

7.4 Shellsort 296

7.4.1 Worst-Case Analysis of Shellsort 297

7.5 Heapsort 300

7.5.1 Analysis of Heapsort 301

7.6 Mergesort 304

7.6.1 Analysis of Mergesort 306

7.7 Quicksort 309

7.7.1 Picking the Pivot 311

7.7.2 Partitioning Strategy 313

7.7.3 Small Arrays 315

7.7.4 Actual Quicksort Routines 315

7.7.5 Analysis of Quicksort 318

7.7.6 A Linear-Expected-Time Algorithm for Selection 321

7.8 A General Lower Bound for Sorting 323

7.8.1 Decision Trees 323

7.9 Decision-Tree Lower Bounds for Selection Problems 325

7.10 Adversary Lower Bounds 328

7.11 Linear-Time Sorts: Bucket Sort and Radix Sort 331

7.12 External Sorting 336

7.12.1 Why We Need New Algorithms 336

7.12.2 Model for External Sorting 336

7.12.3 The Simple Algorithm 337

7.12.4 Multiway Merge 338

7.12.5 Polyphase Merge 339

7.12.6 Replacement Selection 340

Summary 341

Exercises 341

References 347

Chapter 8 The Disjoint Sets Class 351

8.1 Equivalence Relations 351

8.2 The Dynamic Equivalence Problem 352

8.3 Basic Data Structure 353

8.4 Smart Union Algorithms 357

8.5 Path Compression 360

8.6 Worst Case for Union-by-Rank and Path Compression 361

8.6.1 Slowly Growing Functions 362

8.6.2 An Analysis by Recursive Decomposition 362

8.6.3 An Olog *) Bound 369

8.6.4 An OM α(M, N) ) Bound 370

8.7 An Application 372

Summary 374

Exercises 375

References 376

Chapter 9 Graph Algorithms 379

9.1 Definitions 379

9.1.1 Representation of Graphs 380

9.2 Topological Sort 382

9.3 Shortest-Path Algorithms 386

9.3.1 Unweighted Shortest Paths 387

9.3.2 Dijkstra’s Algorithm 391

9.3.3 Graphs with Negative Edge Costs 400

9.3.4 Acyclic Graphs 400

9.3.5 All-Pairs Shortest Path 404

9.3.6 Shortest Path Example 404

9.4 Network Flow Problems 406

9.4.1 A Simple Maximum-Flow Algorithm 408

9.5 Minimum Spanning Tree 413

9.5.1 Prim’s Algorithm 414

9.5.2 Kruskal’s Algorithm 417

9.6 Applications of Depth-First Search 419

9.6.1 Undirected Graphs 420

9.6.2 Biconnectivity 421

9.6.3 Euler Circuits 425

9.6.4 Directed Graphs 429

9.6.5 Finding Strong Components 431

9.7 Introduction to NP-Completeness 432

9.7.1 Easy vs. Hard 433

9.7.2 The Class NP 434

9.7.3 NP-Complete Problems 434

Summary 437

Exercises 437

References 445

Chapter 10 Algorithm Design Techniques 449

10.1 Greedy Algorithms 449

10.1.1 A Simple Scheduling Problem 450

10.1.2 Huffman Codes 453

10.1.3 Approximate Bin Packing 459

10.2 Divide and Conquer 467

10.2.1 Running Time of Divide-and-Conquer Algorithms 468

10.2.2 Closest-Points Problem 470

10.2.3 The Selection Problem 475

10.2.4 Theoretical Improvements for Arithmetic Problems 478

10.3 Dynamic Programming 482

10.3.1 Using a Table Instead of Recursion 483

10.3.2 Ordering Matrix Multiplications 485

10.3.3 Optimal Binary Search Tree 487

10.3.4 All-Pairs Shortest Path 491

10.4 Randomized Algorithms 494

10.4.1 Random-Number Generators 495

10.4.2 Skip Lists 500

10.4.3 Primality Testing 503

10.5 Backtracking Algorithms 506

10.5.1 The Turnpike Reconstruction Problem 506

10.5.2 Games 511

Summary 518

Exercises 518

References 527

Chapter 11 Amortized Analysis 533

11.1 An Unrelated Puzzle 534

11.2 Binomial Queues 534

11.3 Skew Heaps 539

11.4 Fibonacci Heaps 541

11.4.1 Cutting Nodes in Leftist Heaps 542

11.4.2 Lazy Merging for Binomial Queues 544

11.4.3 The Fibonacci Heap Operations 548

11.4.4 Proof of the Time Bound 549

11.5 Splay Trees 551

Summary 555

Exercises 556

References 557

Chapter 12 Advanced Data Structures and Implementation 559

12.1 Top-Down Splay Trees 559

12.2 Red-Black Trees 566

12.2.1 Bottom-Up Insertion 567

12.2.2 Top-Down Red-Black Trees 568

12.2.3 Top-Down Deletion 570

12.3 Treaps 576

12.4 Suffix Arrays and Suffix Trees 579

12.4.1 Suffix Arrays 580

12.4.2 Suffix Trees 583

12.4.3 Linear-Time Construction of Suffix Arrays and Suffix Trees 586

12.5 k-d Trees 596

12.6 Pairing Heaps 602- See more at: http://www.pearsonhighered.com/educator/product/Data-Structures-and-Algorithm-Analysis-in-C/9780132847377.page#sthash.tItmjGwR.dpuf

Workloads and Grading:

There will be one final exam, one midterm exam, five (programming) home assignments, and several in-class quizzes. 

  1. Five home assignments (45%) – 9% each
  2. Two exams (50%)
    • Midterm – 20% 
    • Final Exam – 30%
  3.  Quizzes – 5 %

NOTE: The programming assignments are substantially harder than those in the previous programming courses, and will require substantially more time and effort to complete. You need to immediately start working on a programming assignment as soon as it is announced.

NOTE to graduate students taking the co-listed CGS 5425: Additional work will be given to graduate students taking CGS 5425, in addition to the above stated components of work. 

Final letter grades

In order to obtain a course grade of C- or better, your course performance must satisfy the following requirement: You must earn at least 60% in both of the following components: (1) programming assignments and (2) exams.

A[90-100]
A-[87-90)
B+[84-87)
B[81-84)
B-[78-81)
C+[75-78)
C[72-75)
C-[70-72)
D[60-70)
F<60

Course Policies:

Attendance Policy:The university requires attendance in all classes, and it is also important to your learning. The attendance record may be provided to deans who request it. If your grade is just a little below the cutoff for a higher grade, your attendance will be one of the factors that we consider, in deciding whether to “bump” you up to the higher grade. Missing three or fewer lectures will be considered good attendance. In rare cases, such as medical needs or jury duty, absences may be excused with appropriate documentation. You should let me know in advance, when possible, and submit the documentation I seek. You should make up for any materials missed due to absences.

NOTE: recitation attendance is required. Both announced and unannounced quizzes will be given during recitations.

Missed exam Policy:A missed exam will be recorded as a grade of zero. We will follow the university rules regarding missed final exams (see http://registrar.fsu.edu/dir%5Fclass/spring/exam_schedule.htm), for all the exams, including the final exam.

Late Assignment Policy:In order to enable us to provide timely solutions to assignments, we have the following policy regarding submission of late assignments.

  • An assignment that is turned in no more than 24 hours late will be scored with a 10% penalty.
  • An assignment that is turned in more than 24 and no less than 48 hours late will be scored with a 20% penalty.
  • An assignment that is turned in more than 48 hours late will receive the score of zero, though we will review it and comment on it.

Incomplete Grade (Grade of ‘I’) Policy:The grade of ‘I’ will be assigned only under the following exceptional circumstances:

  • The final exam is missed with an accepted excuse for the absence. In this case, the final exam must be made up during the first two weeks of the following semester.

ACADEMIC HONOR POLICY:
The Florida State University Academic Honor Policy outlines the University’s expectations for the integrity of students’ academic work, the procedures for resolving alleged violations of those expectations, and the rights and responsibilities of students and faculty members throughout the process.  Students are responsible for reading the Academic Honor Policy and for living up to their pledge to . . . be honest and truthful and . . . [to] strive for personal and institutional integrity at Florida State University.  (Florida State University Academic Honor Policy, found at http://fda.fsu.edu/Academics/Academic-Honor-Policy.)

AMERICANS WITH DISABILITIES ACT (ADA):

Students with disabilities needing academic accommodation should:
(1) register with and provide documentation to the Student Disability Resource Center; and
(2) bring a letter to the instructor indicating the need for accommodation and what type.  This should be done during the first week of class.

This syllabus and other class materials are available in alternative format upon request.

For more information about services available to FSU students with disabilities, contact the:

Student Disability Resource Center
874 Traditions Way
108 Student Services Building
Florida State University
Tallahassee, FL 32306-4167
(850) 644-9566 (voice)
(850) 644-8504 (TDD)
(850) 644-7164
[email protected]
http://www.disabilitycenter.fsu.edu/

Academic Integrity:

Remember that the goal of programming assignments and homework is to enhance your analysis, reasoning, and programming skills. Indulging in academic dishonesty defeats this purpose apart from being unfair to other students. In case you have any questions about whether an act of collaboration may be construed as academic dishonesty, please clarify the issue with the instructor before you collaborate.

All students should follow FSU Academic Honor Code. You might be assigned a grade of ‘F‘, if you are found to have indulged in academic dishonesty.

  • It is understandable that discussing a problem with other people may lead to more insight into the issues involved. Thus discussing a problem in assignments/homeworks with other people is fine. However, discussing the solutions to the problem is NOT acceptable. 
  • Every student must write his/her own code and homework. Showing your code or homework to members of other teams, giving it to them, or making it accessible to them (e.g., by making the files world-readable) is academic dishonesty.
  • You are responsible for ensuring that your code/documentation/results are adequately protected and not accessible to other teams. Change permissions of your working directory to 0700 (‘chmod 0700 <directory>).
  • Consulting code/material from a textbook, or from the Internet, in order to understand specific aspects of your assignment is fine. However, copying such code/material will be considered academic dishonesty. If you borrow small parts of code/material from these sources, you must acknowledge this in your submission and additionally you must clearly understand and be able to explain the borrowed code/material.
  • Plagiarism detection tools, such as Moss (A system for detecting software plagiarism), will be used in this course.

Syllabus Changes

This syllabus is a guide for the course and is subject to change with advance notice.

Subscribe For Latest Updates
Let us notify you each time there is a new assignment, book recommendation, assignment resource, or free essay and updates