Data Structures and Algorithms in Python (Instructor Resources, Solution Manual, Code Solutions)

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Based on the authors’ market leading data structures books in Java and C++, this book offers a comprehensive, definitive introduction to data structures in Python by authoritative authors. Data Structures and Algorithms in Python is the first authoritative object-oriented book available for Python data structures. Designed to provide a comprehensive introduction to data structures and algorithms, including their design, analysis, and implementation, the text will maintain the same general structure as Data Structures and Algorithms in Java and Data Structures and Algorithms in C++. Begins by discussing Python’s conceptually simple syntax, which allows for a greater focus on concepts. Employs a consistent object-oriented viewpoint throughout the text. Presents each data structure using ADTs and their respective implementations and introduces important design patterns as a means to organize those implementations into classes, methods, and objects. Provides a thorough discussion on the analysis and design of fundamental data structures. Includes many helpful Python code examples, with source code provided on the website. Uses illustrations to present data structures and algorithms, as well as their analysis, in a clear, visual manner. Provides hundreds of exercises that promote creativity, help readers learn how to think like programmers, and reinforce important concepts. Contains many Python-code and pseudo-code fragments, and hundreds of exercises, which are divided into roughly 40% reinforcement exercises, 40% creativity exercises, and 20% programming projects.

Author(s): Michael T. Goodrich, Roberto Tamassia, Michael H. Goldwasser
Publisher: Wiley
Year: 2023

Language: English
Pages: 770

Cover
Title Page
Copyright Page
Preface
Contents
1 Python Primer
1.1 Python Overview
1.1.1 The Python Interpreter
1.1.2 Preview of a Python Program
1.2 Objects in Python
1.2.1 Identifiers, Objects, and the Assignment Statement
1.2.2 Creating and Using Objects
1.2.3 Python’s Built-In Classes
1.3 Expressions, Operators, and Precedence
1.3.1 Compound Expressions and Operator Precedence
1.4 Control Flow
1.4.1 Conditionals
1.4.2 Loops
1.5 Functions
1.5.1 Information Passing
1.5.2 Python’s Built-In Functions
1.6 Simple Input and Output
1.6.1 Console Input and Output
1.6.2 Files
1.7 Exception Handling
1.7.1 Raising an Exception
1.7.2 Catching an Exception
1.8 Iterators and Generators
1.9 Additional Python Conveniences
1.9.1 Conditional Expressions
1.9.2 Comprehension Syntax
1.9.3 Packing and Unpacking of Sequences
1.10 Scopes and Namespaces
1.11 Modules and the Import Statement
1.11.1 Existing Modules
1.12 Exercises
2 Object-Oriented Programming
2.1 Goals, Principles, and Patterns
2.1.1 Object-Oriented Design Goals
2.1.2 Object-Oriented Design Principles
2.1.3 Design Patterns
2.2 Software Development
2.2.1 Design
2.2.2 Pseudo-Code
2.2.3 Coding Style and Documentation
2.2.4 Testing and Debugging
2.3 Class Definitions
2.3.1 Example: CreditCard Class
2.3.2 Operator Overloading and Python’s Special Methods
2.3.3 Example: Multidimensional Vector Class
2.3.4 Iterators
2.3.5 Example: Range Class
2.4 Inheritance
2.4.1 Extending the CreditCard Class
2.4.2 Hierarchy of Numeric Progressions
2.4.3 Abstract Base Classes
2.5 Namespaces and Object-Orientation
2.5.1 Instance and Class Namespaces
2.5.2 Name Resolution and Dynamic Dispatch
2.6 Shallow and Deep Copying
2.7 Exercises
3 Algorithm Analysis
3.1 Experimental Studies
3.1.1 Moving Beyond Experimental Analysis
3.2 The Seven Functions Used in This Book
3.2.1 Comparing Growth Rates
3.3 Asymptotic Analysis
3.3.1 The “Big-Oh” Notation
3.3.2 Comparative Analysis
3.3.3 Examples of Algorithm Analysis
3.4 Simple Justification Techniques
3.4.1 By Example
3.4.2 The “Contra” Attack
3.4.3 Induction and Loop Invariants
3.5 Exercises
4 Recursion
4.1 Illustrative Examples
4.1.1 The Factorial Function
4.1.2 Drawing an English Ruler
4.1.3 Binary Search
4.1.4 File Systems
4.2 Analyzing Recursive Algorithms
4.3 Recursion Run Amok
4.3.1 Maximum Recursive Depth in Python
4.4 Further Examples of Recursion
4.4.1 Linear Recursion
4.4.2 Binary Recursion
4.4.3 Multiple Recursion
4.5 Designing Recursive Algorithms
4.6 Eliminating Tail Recursion
4.7 Exercises
5 Array-Based Sequences
5.1 Python’s Sequence Types
5.2 Low-Level Arrays
5.2.1 Referential Arrays
5.2.2 Compact Arrays in Python
5.3 Dynamic Arrays and Amortization
5.3.1 Implementing a Dynamic Array
5.3.2 Amortized Analysis of Dynamic Arrays
5.3.3 Python’s List Class
5.4 Efficiency of Python’s Sequence Types
5.4.1 Python’s List and Tuple Classes
5.4.2 Python’s String Class
5.5 Using Array-Based Sequences
5.5.1 Storing High Scores for a Game
5.5.2 Sorting a Sequence
5.5.3 Simple Cryptography
5.6 Multidimensional Data Sets
5.7 Exercises
6 Stacks, Queues, and Deques
6.1 Stacks
6.1.1 The Stack Abstract Data Type
6.1.2 Simple Array-Based Stack Implementation
6.1.3 Reversing Data Using a Stack
6.1.4 Matching Parentheses and HTML Tags
6.2 Queues
6.2.1 The Queue Abstract Data Type
6.2.2 Array-Based Queue Implementation
6.3 Double-Ended Queues
6.3.1 The Deque Abstract Data Type
6.3.2 Implementing a Deque with a Circular Array
6.3.3 Deques in the Python Collections Module
6.4 Exercises
7 Linked Lists
7.1 Singly Linked Lists
7.1.1 Implementing a Stack with a Singly Linked List
7.1.2 Implementing a Queue with a Singly Linked List
7.2 Circularly Linked Lists
7.2.1 Round-Robin Schedulers
7.2.2 Implementing a Queue with a Circularly Linked List
7.3 Doubly Linked Lists
7.3.1 Basic Implementation of a Doubly Linked List
7.3.2 Implementing a Deque with a Doubly Linked List
7.4 The Positional List ADT
7.4.1 The Positional List Abstract Data Type
7.4.2 Doubly Linked List Implementation
7.5 Sorting a Positional List
7.6 Case Study: Maintaining Access Frequencies
7.6.1 Using a Sorted List
7.6.2 Using a List with the Move-to-Front Heuristic
7.7 Link-Based vs. Array-Based Sequences
7.8 Exercises
8 Trees
8.1 General Trees
8.1.1 Tree Definitions and Properties
8.1.2 The Tree Abstract Data Type
8.1.3 Computing Depth and Height
8.2 Binary Trees
8.2.1 The Binary Tree Abstract Data Type
8.2.2 Properties of Binary Trees
8.3 Implementing Trees
8.3.1 Linked Structure for Binary Trees
8.3.2 Array-Based Representation of a Binary Tree
8.3.3 Linked Structure for General Trees
8.4 Tree Traversal Algorithms
8.4.1 Preorder and Postorder Traversals of General Trees
8.4.2 Breadth-First Tree Traversal
8.4.3 Inorder Traversal of a Binary Tree
8.4.4 Implementing Tree Traversals in Python
8.4.5 Applications of Tree Traversals
8.4.6 Euler Tours and the Template Method Pattern
8.5 Case Study: An Expression Tree
8.6 Exercises
9 Priority Queues
9.1 The Priority Queue Abstract Data Type
9.1.1 Priorities
9.1.2 The Priority Queue ADT
9.2 Implementing a Priority Queue
9.2.1 The Composition Design Pattern
9.2.2 Implementation with an Unsorted List
9.2.3 Implementation with a Sorted List
9.3 Heaps
9.3.1 The Heap Data Structure
9.3.2 Implementing a Priority Queue with a Heap
9.3.3 Array-Based Representation of a Complete Binary Tree
9.3.4 Python Heap Implementation
9.3.5 Analysis of a Heap-Based Priority Queue
9.3.6 Bottom-Up Heap Construction
9.3.7 Python’s heapq Module
9.4 Sorting with a Priority Queue
9.4.1 Selection-Sort and Insertion-Sort
9.4.2 Heap-Sort
9.5 Adaptable Priority Queues
9.5.1 Locators
9.5.2 Implementing an Adaptable Priority Queue
9.6 Exercises
10 Maps, Hash Tables, and Skip Lists
10.1 Maps and Dictionaries
10.1.1 The Map ADT
10.1.2 Application: Counting Word Frequencies
10.1.3 Python’s MutableMapping Abstract Base Class
10.1.4 Our MapBase Class
10.1.5 Simple Unsorted Map Implementation
10.2 Hash Tables
10.2.1 Hash Functions
10.2.2 Collision-Handling Schemes
10.2.3 Load Factors, Rehashing, and Efficiency
10.2.4 Python Hash Table Implementation
10.3 Sorted Maps
10.3.1 Sorted Search Tables
10.3.2 Two Applications of Sorted Maps
10.4 Skip Lists
10.4.1 Search and Update Operations in a Skip List
10.4.2 Probabilistic Analysis of Skip Lists
10.5 Sets, Multisets, and Multimaps
10.5.1 The Set ADT
10.5.2 Python’s MutableSet Abstract Base Class
10.5.3 Implementing Sets, Multisets, and Multimaps
10.6 Exercises
11 Search Trees
11.1 Binary Search Trees
11.1.1 Navigating a Binary Search Tree
11.1.2 Searches
11.1.3 Insertions and Deletions
11.1.4 Python Implementation
11.1.5 Performance of a Binary Search Tree
11.2 Balanced Search Trees
11.2.1 Python Framework for Balancing Search Trees
11.3 AVL Trees
11.3.1 Update Operations
11.3.2 Python Implementation
11.4 Splay Trees
11.4.1 Splaying
11.4.2 When to Splay
11.4.3 Python Implementation
11.4.4 Amortized Analysis of Splaying
11.5 (2,4) Trees
11.5.1 Multiway Search Trees
11.5.2 (2,4)-Tree Operations
11.6 Red-Black Trees
11.6.1 Red-Black Tree Operations
11.6.2 Python Implementation
11.7 Exercises
12 Sorting and Selection
12.1 Why Study Sorting Algorithms?
12.2 Merge-Sort
12.2.1 Divide-and-Conquer
12.2.2 Array-Based Implementation of Merge-Sort
12.2.3 The Running Time of Merge-Sort
12.2.4 Merge-Sort and Recurrence Equations
12.2.5 Alternative Implementations of Merge-Sort
12.3 Quick-Sort
12.3.1 Randomized Quick-Sort
12.3.2 Additional Optimizations for Quick-Sort
12.4 Studying Sorting through an Algorithmic Lens
12.4.1 Lower Bound for Sorting
12.4.2 Linear-Time Sorting: Bucket-Sort and Radix-Sort
12.5 Comparing Sorting Algorithms
12.6 Python’s Built-In Sorting Functions
12.6.1 Sorting According to a Key Function
12.7 Selection
12.7.1 Prune-and-Search
12.7.2 Randomized Quick-Select
12.7.3 Analyzing Randomized Quick-Select
12.8 Exercises
13 Text Processing
13.1 Abundance of Digitized Text
13.1.1 Notations for Strings and the Python str Class
13.2 Pattern-Matching Algorithms
13.2.1 Brute Force
13.2.2 The Boyer-Moore Algorithm
13.2.3 The Knuth-Morris-Pratt Algorithm
13.3 Dynamic Programming
13.3.1 Matrix Chain-Product
13.3.2 DNA and Text Sequence Alignment
13.4 Text Compression and the Greedy Method
13.4.1 The Huffman Coding Algorithm
13.4.2 The Greedy Method
13.5 Tries
13.5.1 Standard Tries
13.5.2 Compressed Tries
13.5.3 Suffix Tries
13.5.4 Search Engine Indexing
13.6 Exercises
14 Graph Algorithms
14.1 Graphs
14.1.1 The Graph ADT
14.2 Data Structures for Graphs
14.2.1 Edge List Structure
14.2.2 Adjacency List Structure
14.2.3 Adjacency Map Structure
14.2.4 Adjacency Matrix Structure
14.2.5 Python Implementation
14.3 Graph Traversals
14.3.1 Depth-First Search
14.3.2 DFS Implementation and Extensions
14.3.3 Breadth-First Search
14.4 Transitive Closure
14.5 Directed Acyclic Graphs
14.5.1 Topological Ordering
14.6 Shortest Paths
14.6.1 Weighted Graphs
14.6.2 Dijkstra’s Algorithm
14.7 Minimum Spanning Trees
14.7.1 Prim-Jarník Algorithm
14.7.2 Kruskal’s Algorithm
14.7.3 Disjoint Partitions and Union-Find Structures
14.8 Exercises
15 Memory Management and B-Trees
15.1 Memory Management
15.1.1 Memory Allocation
15.1.2 Garbage Collection
15.1.3 Additional Memory Used by the Python Interpreter
15.2 Memory Hierarchies and Caching
15.2.1 Memory Systems
15.2.2 Caching Strategies
15.3 External Searching and B-Trees
15.3.1 (a,b) Trees
15.3.2 B-Trees
15.4 External-Memory Sorting
15.4.1 Multiway Merging
15.5 Exercises
A Character Strings in Python
B Useful Mathematical Facts
Bibliography
Index