{
  "title": "OpenDSA Data Structures and Algorithms Modules Collection",
  "desc": "OpenDSA Data Structures and Algorithms Modules Collection",
  "build_dir": "Books",
  "code_dir": "SourceCode/",
  "code_lang": {
    "Java": {
      "ext": [
        "java"
      ],
      "label": "Java",
      "lang": "java"
    },
    "Java_Generic": {
      "ext": [
        "java"
      ],
      "label": "Java (Generic)",
      "lang": "java"
    },
    "C++": {
      "ext": [
        "cpp",
        "h"
      ],
      "label": "C++",
      "lang": "C++"
    }
  },
  "lang": "en",
  "build_JSAV": false,
  "suppress_todo": false,
  "dispModComp": true,
  "glob_exer_options": {
    "JXOP-debug": "true"
  },
  "chapters": {
    "Preface": {
      "Intro": {
        "long_name": "How to Use this System",
        "sections": {}
      },
      "Status": {
        "long_name": "OpenDSA Project Content Status",
        "sections": {
          "Status Report": {}
        }
      }
    },
    "Introduction for Data Structures and Algorithms Courses": {
      "Background/IntroDSA": {
        "long_name": "Data Structures and Algorithms",
        "sections": {
          "Data Structures and Algorithms": {},
          "Some Software Engineering Topics": {
            "showsection": true
          }
        }
      }
    },
    "Biographies": {
      "Biography/CarlGauss": {
        "long_name": "Spotlight: Carl Friedrich Gauss",
        "sections": {
          "Spotlight: Carl Friedrich Gauss": {}
        }
      },
      "Biography/FrancisBacon": {
        "long_name": "Spotlight: Francis Bacon",
        "sections": {
          "Spotlight: Francis Bacon": {}
        }
      }
    },
    "Programming Tutorials": {
      "Tutorials/cmdline": {
        "long_name": "Command Line Basics",
        "sections": {
          "What's A CLI?": {}
        }
      },
      "Tutorials/parameters": {
        "long_name": "Parsing Command Line Parameters In Your Program",
        "sections": {
          "Parameters In Programming": {}
        }
      },
      "Tutorials/eclipseparameters": {
        "long_name": "Using Command Line Parameters in Eclipse",
        "sections": {
          "Using Command Line Parameters in Eclipse": {}
        }
      },
      "Tutorials/webcattools": {
        "long_name": "Installing the Web-CAT Submission Plug-in for Eclipse",
        "sections": {
          "Introduction": {},
          "Installing Java 11": {},
          "Installing the Plug-in": {},
          "Installing student.jar": {},
          "Installing formatting support": {}
        }
      },
      "Tutorials/debugmethods": {
        "long_name": "Common Debugging Methods",
        "sections": {
          "Common Debugging Methods": {}
        }
      },
      "Tutorials/debug": {
        "long_name": "Debugging In Eclipse",
        "sections": {
          "Debugging In Eclipse": {}
        }
      },
      "Tutorials/scanning": {
        "long_name": "Using the Java Scanner Class",
        "sections": {
          "The Scanner Class": {}
        }
      },
      "Tutorials/randomaccessfile": {
        "long_name": "Random Access Files In Java",
        "sections": {
          "Understanding File I/O": {}
        }
      },
      "Tutorials/junitstart": {
        "long_name": "JUnit Testing And You",
        "sections": {
          "Getting Started": {}
        }
      },
      "Tutorials/junitbasic": {
        "long_name": "Writing JUnit Tests",
        "sections": {
          "Writing JUnit Tests": {}
        }
      },
      "Tutorials/junitcoverage": {
        "long_name": "Code Coverage In JUnit",
        "sections": {
          "Code Coverage In JUnit": {}
        }
      },
      "Tutorials/MTeclipse": {
        "long_name": "Using Mutation Coverage In Eclipse",
        "sections": {
          "Using Mutation Coverage In Eclipse": {}
        }
      },
      "Tutorials/MTbasics": {
        "long_name": "Mutation Testing Basics",
        "sections": {
          "Types of Mutants": {}
        }
      },
      "Tutorials/MTadvanced": {
        "long_name": "Mutation Coverage Advanced Examples",
        "sections": {
          "Seeing the Effect: BST Range Query": {},
          "Over-Constrained Code: Visiting Quadrants": {},
          "Over-Constrained Code: Deleting from a BST Tree": {},
          "Over-Constrained Code: BigNum Exponents": {},
          "Bugs not caught by mutation testing: Hash Insert": {}
        }
      },
      "Testing/TriangleIntro": {
        "long_name": "Testing",
        "sections": {
          "Testing vs. Debugging": {}
        }
      },
      "Testing/TriangleCoverage": {
        "long_name": "Testing for Code Coverage",
        "sections": {
          "Testing for Code Coverage": {}
        }
      },
      "Testing/BowlingIntro": {
        "long_name": "Bowling Test Coverage Example",
        "sections": {
          "Bowling Test Coverage Example": {}
        }
      },
      "Testing/BowlingCoverage": {
        "long_name": "Bowling Example: Testing to Code",
        "sections": {
          "Bowling Example Testing to Code": {}
        }
      }
    },
    "Design I": {
      "Design/ADT": {
        "long_name": "Abstract Data Types",
        "sections": {
          "Abstract Data Types": {
            "ADTCON": {
              "type": "dgm",
              "mod_name": "ADT"
            }
          },
          "Concept Map Exercise": {},
          "Review Questions": {}
        }
      },
      "Design/IntroOO": {
        "long_name": "Introduction to Object-Oriented Programming",
        "sections": {
          "Introduction to Object-Oriented Programming": {}
        }
      },
      "Design/IntroUML": {
        "long_name": "The Unified Modeling Language",
        "sections": {
          "The Unified Modeling Language": {}
        }
      },
      "Design/IntroProcess": {
        "long_name": "Software Development Processes",
        "sections": {
          "Software Development Processes": {}
        }
      }
    },
    "Introduction to Pointers in Java": {
      "PointersJava/PointerIntro": {
        "long_name": "Pointers Chapter Introduction",
        "sections": {}
      },
      "PointersJava/BasicPointers1": {
        "long_name": "Basic References Part 1",
        "sections": {
          "Pointers and References": {},
          "Data Types in Java": {},
          "Referencing and Dereferencing": {},
          "changePointeeDataDirect": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changePointeeDataDirect",
            "long_name": "changePointeeDataDirect",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "419",
            "type": "extr",
            "mod_name": "BasicPointers1"
          },
          "The Employee Class": {},
          "Reference Assignments": {},
          "circularList1": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "circularList1",
            "long_name": "circularList1",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "421",
            "type": "extr",
            "mod_name": "BasicPointers1"
          }
        }
      },
      "PointersJava/BasicPointers2": {
        "long_name": "Basic References Part 2",
        "sections": {
          "Sharing": {},
          "Shallow and Deep Copying": {},
          "Shallow and Deep Comparing": {},
          "Bad References": {}
        }
      },
      "PointersJava/Syntax": {
        "long_name": "Pointers Syntax",
        "sections": {
          "Syntax": {},
          "changeHeadPointer1": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeHeadPointer1",
            "long_name": "changeHeadPointer1",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "415",
            "type": "extr",
            "mod_name": "Syntax"
          },
          "Java References vs Pointers": {},
          "How Are References Implemented In The Machine?": {}
        }
      },
      "PointersJava/LocalMem": {
        "long_name": "Local Memory",
        "sections": {
          "Local Memory": {}
        }
      },
      "PointersJava/HeapMem": {
        "long_name": "Heap Memory",
        "sections": {
          "Heap Memory": {}
        }
      },
      "PointersJava/Links1": {
        "long_name": "Link Nodes",
        "sections": {
          "Link Nodes": {}
        }
      },
      "PointersJava/Links2": {
        "long_name": "Link Nodes Practice Exercises",
        "sections": {
          "createList": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "createList",
            "long_name": "createList",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "428",
            "type": "extr",
            "mod_name": "Links2"
          },
          "iterateOverList": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "iterateOverList",
            "long_name": "iterateOverList",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "426",
            "type": "extr",
            "mod_name": "Links2"
          },
          "changePointeeNext1": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changePointeeNext1",
            "long_name": "changePointeeNext1",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "424",
            "type": "extr",
            "mod_name": "Links2"
          },
          "addNodeAtHead": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "addNodeAtHead",
            "long_name": "addNodeAtHead",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "429",
            "type": "extr",
            "mod_name": "Links2"
          }
        }
      },
      "PointersJava/ExercisesPtr": {
        "long_name": "Additional Practice Exercises",
        "sections": {
          "changeHeadPointer2": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeHeadPointer2",
            "long_name": "changeHeadPointer2",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "416",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "changeQPointer": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeQPointer",
            "long_name": "changeQPointer",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "417",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "changeRPointer": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeRPointer",
            "long_name": "changeRPointer",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "418",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "changePointeeDataInDirect": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changePointeeDataInDirect",
            "long_name": "changePointeeDataInDirect",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "420",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "circularList2": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "circularList2",
            "long_name": "circularList2",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "422",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "circularList3": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "circularList3",
            "long_name": "circularList3",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "423",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "changePointeeNext2": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changePointeeNext2",
            "long_name": "changePointeeNext2",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "425",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "findValueInList": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "findValueInList",
            "long_name": "findValueInList",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "427",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "addNodeAtTail": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "addNodeAtTail",
            "long_name": "addNodeAtTail",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "430",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "changeNodesOrder1": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeNodesOrder1",
            "long_name": "changeNodesOrder1",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "431",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          },
          "changeNodesOrder2": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "changeNodesOrder2",
            "long_name": "changeNodesOrder2",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "432",
            "type": "extr",
            "mod_name": "ExercisesPtr"
          }
        }
      }
    },
    "Mathematical Background": {
      "Background/MathpreIntro": {
        "long_name": "Chapter Introduction",
        "sections": {}
      },
      "Background/SetDef": {
        "long_name": "Sets and Relations",
        "sections": {
          "Set Notation": {},
          "Equivalence Relations": {},
          "Partial Orders": {}
        }
      },
      "Background/MiscMath": {
        "long_name": "Miscellaneous Math Notation",
        "sections": {}
      },
      "Background/Logarithms": {
        "long_name": "Logarithms",
        "sections": {
          "Logarithms": {}
        }
      },
      "Background/Summations": {
        "long_name": "Summations Introduction",
        "sections": {
          "Summations": {}
        }
      },
      "Background/RecurrenceIntro": {
        "long_name": "An Introduction to Recurrence Relations",
        "sections": {
          "Recurrence Relations": {}
        }
      },
      "Background/Proofs": {
        "long_name": "Mathematical Proof Techniques",
        "sections": {
          "Mathematical Proof Techniques": {}
        }
      },
      "Background/Estimation": {
        "long_name": "Introduction to Estimation",
        "sections": {}
      },
      "Background/MathpreSumm": {
        "long_name": "Chapter Summary Questions",
        "sections": {
          "Chapter Summary Questions": {}
        }
      }
    },
    "Searching I": {
      "Searching/BinarySearch": {
        "long_name": "Searching in an Array",
        "sections": {
          "Searching in an Array": {}
        }
      }
    },
    "Algorithm Analysis": {
      "AlgAnal/AnalChap": {
        "long_name": "Chapter Introduction",
        "sections": {}
      },
      "AlgAnal/AnalPrelim": {
        "long_name": "Problems, Algorithms, and Programs",
        "sections": {
          "Problems, Algorithms, and Programs": {}
        }
      },
      "AlgAnal/AnalIntro": {
        "long_name": "Comparing Algorithms",
        "sections": {
          "Comparing Algorithms": {},
          "Growth Rates Ordering Exercise": {}
        }
      },
      "AlgAnal/AnalCases": {
        "long_name": "Best, Worst, and Average Cases",
        "sections": {
          "Best, Worst, and Average Cases": {}
        }
      },
      "AlgAnal/AnalCompvsAlg": {
        "long_name": "Faster Computer, or Faster Algorithm?",
        "sections": {
          "Faster Computer, or Faster Algorithm?": {}
        }
      },
      "AlgAnal/AnalAsymptotic": {
        "long_name": "Asymptotic Analysis and Upper Bounds",
        "sections": {
          "Asymptotic Analysis and Upper Bounds": {
            "SimpleCosts1CON": {
              "type": "dgm",
              "mod_name": "AnalAsymptotic"
            },
            "SimpleCosts2CON": {
              "type": "dgm",
              "mod_name": "AnalAsymptotic"
            }
          }
        }
      },
      "AlgAnal/AnalLower": {
        "long_name": "Lower Bounds and Theta Notation",
        "sections": {
          "Lower Bounds and Theta Notation": {}
        }
      },
      "AlgAnal/AnalProgram": {
        "long_name": "Calculating Program Running Time",
        "sections": {
          "Calculating Program Running Time": {},
          "Summary Exercise": {}
        }
      },
      "AlgAnal/AnalProblem": {
        "long_name": "Analyzing Problems",
        "sections": {
          "Analyzing Problems": {}
        }
      },
      "AlgAnal/AnalMisunderstanding": {
        "long_name": "Common Misunderstandings",
        "sections": {
          "Common Misunderstandings": {}
        }
      },
      "AlgAnal/AnalMultiple": {
        "long_name": "Multiple Parameters",
        "sections": {}
      },
      "AlgAnal/AnalSpace": {
        "long_name": "Space Bounds",
        "sections": {}
      },
      "AlgAnal/AnalTuning": {
        "long_name": "Code Tuning and Empirical Analysis",
        "sections": {
          "Code Tuning and Empirical Analysis": {}
        }
      },
      "AlgAnal/AlgAnalSummCS2": {
        "long_name": "Algorithm Analysis Summary Exercises",
        "sections": {
          "Summary Exercise: CS2": {}
        }
      },
      "AlgAnal/AlgAnalSummCS3": {
        "long_name": "Algorithm Analysis Summary Exercises",
        "sections": {
          "Summary Exercise: CS3": {}
        }
      }
    },
    "Linear Structures": {
      "List/ListIntro": {
        "long_name": "Chapter Introduction: Lists",
        "sections": {}
      },
      "List/ListADT": {
        "long_name": "A List ADT",
        "sections": {
          "A List ADT": {},
          "List ADT Programming Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "List ADT Programming Exercise",
            "long_name": "List ADT Programming Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "type": "extr",
            "mod_name": "ListADT"
          }
        }
      },
      "List/ListArray": {
        "long_name": "Array-Based List Implementation",
        "sections": {
          "Array-Based List Implementation": {
            "alistInsertCON": {
              "long_name": "Array-based List Insertion Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/List/alistCON.css"
              ],
              "scripts": [
                "AV/List/alistInsertCON.js"
              ],
              "mod_name": "ListArray"
            }
          },
          "Append and Remove": {},
          "Array-based List Practice Questions": {}
        }
      },
      "List/ListLinked": {
        "long_name": "Linked Lists",
        "sections": {
          "Linked Lists": {},
          "Linked List Remove": {}
        }
      },
      "List/ListAnalysis": {
        "long_name": "Comparison of List Implementations",
        "sections": {
          "Space Comparison": {},
          "Time Comparison": {}
        }
      },
      "List/ListDouble": {
        "long_name": "Doubly Linked Lists",
        "sections": {
          "Doubly Linked Lists": {}
        }
      },
      "List/ListElement": {
        "long_name": "List Element Implementations",
        "sections": {
          "List Element Implementations": {}
        }
      },
      "List/StackArray": {
        "long_name": "Stacks",
        "sections": {
          "Stack Terminology and Implementation": {},
          "Pop": {}
        }
      },
      "List/StackLinked": {
        "long_name": "Linked Stacks",
        "sections": {
          "Linked Stack Implementation": {},
          "Linked Stack Pop": {}
        }
      },
      "List/Freelist": {
        "long_name": "Freelists",
        "sections": {
          "Freelists": {}
        }
      },
      "List/StackRecur": {
        "long_name": "Implementing Recursion",
        "sections": {}
      },
      "List/Queue": {
        "long_name": "Queues",
        "sections": {
          "Queue Terminology and Implementation": {},
          "Array-based Dequeue Practice": {}
        }
      },
      "List/QueueLinked": {
        "long_name": "Linked Queues",
        "sections": {
          "Linked Queues": {},
          "Linked Dequeue": {},
          "Comparison of Array-Based and Linked Queues": {}
        }
      },
      "List/ListSumm": {
        "long_name": "Linear Structure Summary Exercises",
        "sections": {
          "Practice Questions": {},
          "Chapter Review Questions": {}
        }
      }
    },
    "Recursion": {
      "RecurTutor/RecIntro": {
        "long_name": "Introduction to Recursion",
        "sections": {
          "Introduction": {}
        }
      },
      "RecurTutor/Write": {
        "long_name": "Writing a recursive function",
        "sections": {
          "Writing a recursive function": {}
        }
      },
      "RecurTutor/CodeCompletionEx": {
        "long_name": "Code Completion Practice Exercises",
        "sections": {
          "Introduction": {},
          "Recursion Programming Exercise: Largest": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Largest",
            "long_name": "Recursion Programming Exercise: Largest",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "46",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Multiply": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Multiply",
            "long_name": "Recursion Programming Exercise: Multiply",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "47",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: GCD": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: GCD",
            "long_name": "Recursion Programming Exercise: GCD",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "48",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: log": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: log",
            "long_name": "Recursion Programming Exercise: log",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "49",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Cummulative Sum": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Cummulative Sum",
            "long_name": "Recursion Programming Exercise: Cummulative Sum",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "51",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Add odd values": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Add odd values",
            "long_name": "Recursion Programming Exercise: Add odd values",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "52",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Sum Of the Digits": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Sum Of the Digits",
            "long_name": "Recursion Programming Exercise: Sum Of the Digits",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "53",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          },
          "Recursion Programming Exercise: Count Characters": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Count Characters",
            "long_name": "Recursion Programming Exercise: Count Characters",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "54",
            "type": "extr",
            "mod_name": "CodeCompletionEx"
          }
        }
      },
      "RecurTutor/HarderWrite": {
        "long_name": "Writing More Sophisticated Recursive Functions",
        "sections": {}
      },
      "RecurTutor/HarderCodeCompletionEx": {
        "long_name": "Intermediate Recursion Code Completion Exercises",
        "sections": {
          "Recursion Programming Exercise: Minimum of array": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Minimum of array",
            "long_name": "Recursion Programming Exercise: Minimum of array",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "55",
            "type": "extr",
            "mod_name": "HarderCodeCompletionEx"
          },
          "Recursion Programming Exercise: Is Reverse": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Is Reverse",
            "long_name": "Recursion Programming Exercise: Is Reverse",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "56",
            "type": "extr",
            "mod_name": "HarderCodeCompletionEx"
          },
          "Recursion Programming Exercise: Decimal to Binary": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Decimal to Binary",
            "long_name": "Recursion Programming Exercise: Decimal to Binary",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "57",
            "type": "extr",
            "mod_name": "HarderCodeCompletionEx"
          }
        }
      },
      "RecurTutor/WritingEx": {
        "long_name": "Writing Practice Exercises",
        "sections": {
          "Recursion Programming Exercise: Cannonballs": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Cannonballs",
            "long_name": "Recursion Programming Exercise: Cannonballs",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "58",
            "type": "extr",
            "mod_name": "WritingEx"
          },
          "Recursion Programming Exercise: Check Palindrome": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Check Palindrome",
            "long_name": "Recursion Programming Exercise: Check Palindrome",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "59",
            "type": "extr",
            "mod_name": "WritingEx"
          },
          "Recursion Programming Exercise: Subset Sum": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Subset Sum",
            "long_name": "Recursion Programming Exercise: Subset Sum",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "60",
            "type": "extr",
            "mod_name": "WritingEx"
          },
          "Recursion Programming Exercise: Pascal Triangle": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Recursion Programming Exercise: Pascal Triangle",
            "long_name": "Recursion Programming Exercise: Pascal Triangle",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "61",
            "type": "extr",
            "mod_name": "WritingEx"
          }
        }
      },
      "RecurTutor/Trace": {
        "long_name": "Tracing Recursive Code",
        "sections": {
          "Tracing Recursive Code": {}
        }
      },
      "RecurTutor/TracingEx": {
        "long_name": "Recursion Code Tracing Practice Exercises",
        "sections": {
          "Forward Flow Tracing Exercises": {},
          "Backward Flow Tracing Exercises": {},
          "Find Error Tracing Exercises": {},
          "Two Recursive Calls Tracing Exercises": {},
          "How Many Times Tracing Exercises": {},
          "Harder Tracing Exercises": {}
        }
      },
      "RecurTutor/RecSummaryEx": {
        "long_name": "Recursion Summary Questions",
        "sections": {
          "Recursion Summary Questions": {
            "RecChapterSumm": {
              "long_name": "Recursion Summary Exercise",
              "required": false,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/RecurTutor/RecChapterSumm.html",
              "mod_name": "RecSummaryEx",
              "threshold": 5
            }
          }
        }
      }
    },
    "Design II": {
      "Design/DesignPatterns": {
        "long_name": "Design Patterns",
        "sections": {
          "Design Patterns": {}
        }
      },
      "Design/DesignAltList": {
        "long_name": "Alternative List ADT Designs",
        "sections": {}
      },
      "Design/Comparison": {
        "long_name": "Comparing Records",
        "sections": {
          "Comparing Records": {}
        }
      },
      "Design/Dictionary": {
        "long_name": "The Dictionary ADT",
        "sections": {
          "The Dictionary ADT": {}
        }
      }
    },
    "Binary Trees": {
      "Binary/BinaryTreeIntro": {
        "long_name": "Binary Trees Chapter Introduction",
        "sections": {}
      },
      "Binary/BinaryTree": {
        "long_name": "Binary Trees",
        "sections": {
          "Definitions and Properties": {},
          "Practice Questions": {}
        }
      },
      "Binary/RecursiveDS": {
        "long_name": "Binary Tree as a Recursive Data Structure",
        "sections": {
          "Binary Tree as a Recursive Data Structure": {}
        }
      },
      "Binary/BinaryTreeFullThm": {
        "long_name": "The Full Binary Tree Theorem",
        "sections": {}
      },
      "Binary/BinaryTreeTraversal": {
        "long_name": "Binary Tree Traversals",
        "sections": {
          "Binary Tree Traversals": {},
          "Postorder Traversal Practice": {},
          "Inorder Traversal Practice": {},
          "Summary Questions": {}
        }
      },
      "Binary/WritingTraversals": {
        "long_name": "Implementing Tree Traversals",
        "sections": {
          "Implementing Tree Traversals": {},
          "Binary Tree Increment By One Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Increment By One Exercise",
            "long_name": "Binary Tree Increment By One Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 1.0,
            "workout_id": "80",
            "type": "extr",
            "mod_name": "WritingTraversals"
          }
        }
      },
      "BTRecurTutor/BinaryTreeInfFlw": {
        "long_name": "Information Flow in Recursive Functions",
        "sections": {
          "Information Flow in Recursive Functions": {},
          "Binary Tree Set Depth Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Set Depth Exercise",
            "long_name": "Binary Tree Set Depth Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "66",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Collect-and-return": {},
          "Binary Tree Check Sum Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Check Sum Exercise",
            "long_name": "Binary Tree Check Sum Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "71",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Binary Tree Leaf Nodes Count Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Leaf Nodes Count Exercise",
            "long_name": "Binary Tree Leaf Nodes Count Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "72",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Binary Tree Sum Nodes Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Sum Nodes Exercise",
            "long_name": "Binary Tree Sum Nodes Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "68",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Combining Information Flows": {},
          "Binary Tree Check Value Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Check Value Exercise",
            "long_name": "Binary Tree Check Value Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "65",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Combination Problems": {},
          "Binary Tree Height Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Height Exercise",
            "long_name": "Binary Tree Height Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "70",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Binary Tree Get Difference Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Get Difference Exercise",
            "long_name": "Binary Tree Get Difference Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "73",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          },
          "Binary Tree Has Path Sum Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Tree Has Path Sum Exercise",
            "long_name": "Binary Tree Has Path Sum Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "67",
            "type": "extr",
            "mod_name": "BinaryTreeInfFlw"
          }
        }
      },
      "Binary/BinaryTreeImpl": {
        "long_name": "Binary Tree Node Implementations",
        "sections": {
          "Binary Tree Node Implementations": {}
        }
      },
      "Binary/Composite": {
        "long_name": "Composite-based Expression Tree",
        "sections": {
          "Composite-based Expression Tree": {}
        }
      },
      "Binary/BinaryTreeNodeSpace": {
        "long_name": "Binary Tree Space Requirements",
        "sections": {
          "Binary Tree Space Requirements": {}
        }
      },
      "Binary/BST": {
        "long_name": "Binary Search Trees",
        "sections": {
          "Binary Search Tree Definition": {},
          "BST Insert": {},
          "BST Remove": {},
          "BST Analysis": {}
        }
      },
      "Binary/BSTDict": {
        "long_name": "Dictionary Implementation Using a BST",
        "sections": {}
      },
      "BTRecurTutor/BinaryTreeGuidedInfFlw": {
        "long_name": "Binary Tree Guided Information Flow",
        "sections": {
          "Binary Tree Guided Information Flow": {},
          "Binary Search Tree Small Count Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Binary Search Tree Small Count Exercise",
            "long_name": "Binary Search Tree Small Count Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "64",
            "type": "extr",
            "mod_name": "BinaryTreeGuidedInfFlw"
          }
        }
      },
      "BTRecurTutor/MultipleBinaryTrees": {
        "long_name": "Multiple Binary Trees",
        "sections": {
          "Mirror Image Binary Trees Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Mirror Image Binary Trees Exercise",
            "long_name": "Mirror Image Binary Trees Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "74",
            "type": "extr",
            "mod_name": "MultipleBinaryTrees"
          },
          "Same Binary Tree Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Same Binary Tree Exercise",
            "long_name": "Same Binary Tree Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "69",
            "type": "extr",
            "mod_name": "MultipleBinaryTrees"
          },
          "Structurally Identical Binary Trees Exercise": {
            "learning_tool": "code-workout",
            "resource_type": "external_assignment",
            "resource_name": "Structurally Identical Binary Trees Exercise",
            "long_name": "Structurally Identical Binary Trees Exercise",
            "enable_scrolling": "False",
            "frame_width": "1000",
            "frame_height": "900",
            "partial_credit": "False",
            "points": 2.0,
            "workout_id": "75",
            "type": "extr",
            "mod_name": "MultipleBinaryTrees"
          }
        }
      },
      "BTRecurTutor/BSTCheck": {
        "long_name": "A Hard Information Flow Problem",
        "sections": {}
      },
      "Binary/CompleteTree": {
        "long_name": "Array Implementation for Complete Binary Trees",
        "sections": {
          "Array Implementation for Complete Binary Trees": {}
        }
      },
      "Binary/Heaps": {
        "long_name": "Heaps and Priority Queues",
        "sections": {
          "Heaps and Priority Queues": {},
          "Building a Heap": {},
          "Removing from the heap or updating an object's priority": {},
          "Priority Queues": {}
        }
      },
      "Binary/Huffman": {
        "long_name": "Huffman Coding Trees",
        "sections": {
          "Huffman Coding Trees": {}
        }
      },
      "Binary/TreeTrie": {
        "long_name": "Trees versus Tries",
        "sections": {
          "Trees versus Tries": {}
        }
      },
      "Binary/HuffProof": {
        "long_name": "Proof of Optimality for Huffman Coding",
        "sections": {
          "Proof of Optimality for Huffman Coding": {}
        }
      },
      "Binary/BinaryChapSumm": {
        "long_name": "Binary Tree Chapter Summary",
        "sections": {
          "Summary Questions": {}
        }
      }
    },
    "Sorting": {
      "Sorting/InSort": {
        "long_name": "Chapter Introduction: Sorting",
        "sections": {}
      },
      "Sorting/SortNotation": {
        "long_name": "Sorting Terminology and Notation",
        "sections": {
          "Sorting Terminology and Notation": {
            "SortNotationS1CON": {
              "long_name": "Sorting Terminology and Notation Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Sorting/SortNotationS1CON.css"
              ],
              "scripts": [
                "AV/Sorting/SortNotationS1CON.js"
              ],
              "mod_name": "SortNotation"
            },
            "SortIntroSumm": {
              "long_name": "Sorting Intro Summary",
              "required": false,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/Sorting/SortIntroSumm.html",
              "mod_name": "SortNotation",
              "threshold": 3
            }
          }
        }
      },
      "Sorting/InsertionSort": {
        "long_name": "Insertion Sort",
        "sections": {
          "Insertion Sort": {},
          "Insertion Sort Analysis": {}
        }
      },
      "Sorting/BubbleSort": {
        "long_name": "Bubble Sort",
        "sections": {
          "Bubble Sort": {},
          "Bubble Sort Analysis": {}
        }
      },
      "Sorting/SelectionSort": {
        "long_name": "Selection Sort",
        "sections": {
          "Selection Sort": {},
          "Selection Sort Analysis": {},
          "Pointer Swapping": {}
        }
      },
      "Sorting/ExchangeSort": {
        "long_name": "The Cost of Exchange Sorting",
        "sections": {
          "The Cost of Exchange Sorting": {},
          "Analysis": {}
        }
      },
      "Sorting/SortOpt": {
        "long_name": "Optimizing Sort Algorithms with Code Tuning",
        "sections": {
          "Code Tuning for Simple Sorting Algorithms": {}
        }
      },
      "Sorting/Shellsort": {
        "long_name": "Shellsort",
        "sections": {
          "Shellsort": {},
          "Putting It Together": {},
          "Shellsort Practice Exercise": {},
          "Optimizing Shellsort": {},
          "Shellsort Summary Questions": {}
        }
      },
      "Sorting/Mergesort": {
        "long_name": "Mergesort Concepts",
        "sections": {
          "Mergesort Concepts": {},
          "Mergesort Practice Exercise": {}
        }
      },
      "Sorting/MergesortImpl": {
        "long_name": "Implementing Mergesort",
        "sections": {
          "Implementing Mergesort": {}
        }
      },
      "Sorting/Quicksort": {
        "long_name": "Quicksort",
        "sections": {
          "Introduction": {},
          "Partition": {},
          "Putting It Together": {},
          "Quicksort Analysis": {}
        }
      },
      "Sorting/Heapsort": {
        "long_name": "Heapsort",
        "sections": {
          "Heapsort": {},
          "Heapsort Proficiency Practice": {},
          "Heapsort Analysis": {}
        }
      },
      "Sorting/BinSort": {
        "long_name": "Binsort",
        "sections": {
          "Binsort": {}
        }
      },
      "Sorting/RadixSort": {
        "long_name": "Radix Sort",
        "sections": {
          "Radix Sort": {},
          "Array-based Radix Sort": {}
        }
      },
      "Sorting/SortingEmpirical": {
        "long_name": "An Empirical Comparison of Sorting Algorithms",
        "sections": {
          "An Empirical Comparison of Sorting Algorithms": {}
        }
      },
      "Sorting/SortingLowerBound": {
        "long_name": "Lower Bounds for Sorting",
        "sections": {
          "Lower Bounds for Sorting": {}
        }
      },
      "Sorting/SortSumm": {
        "long_name": "Sorting Summary Exercises",
        "sections": {
          "Sorting Summary Exercises": {}
        }
      }
    },
    "File Processing": {
      "Files/FileProc": {
        "long_name": "Chapter Introduction: File Processing",
        "sections": {}
      },
      "Files/Secondary": {
        "long_name": "Primary versus Secondary Storage",
        "sections": {}
      },
      "Files/Diskdrive": {
        "long_name": "Disk Drives",
        "sections": {
          "Disk Drives": {}
        }
      },
      "Files/BuffPool": {
        "long_name": "Buffer Pools",
        "sections": {
          "Buffer Pools": {}
        }
      },
      "Files/FileProg": {
        "long_name": "The Programmer's View of Files",
        "sections": {}
      },
      "Files/ExternalSort": {
        "long_name": "External Sorting",
        "sections": {
          "External Sorting": {},
          "Multiway Merging": {}
        }
      }
    },
    "Hashing": {
      "Hashing/HashIntro": {
        "long_name": "Introduction to Hashing",
        "sections": {
          "Introduction": {}
        }
      },
      "Hashing/HashFunc": {
        "long_name": "Hash Function Principles",
        "sections": {
          "Hash Function Principles": {}
        }
      },
      "Hashing/HashFuncExamp": {
        "long_name": "Sample Hash Functions",
        "sections": {
          "Sample Hash Functions": {},
          "A Simple Hash Function for Strings": {},
          "String Folding": {},
          "Hash Function Practice": {},
          "Hash Function Review Questions": {}
        }
      },
      "Hashing/OpenHash": {
        "long_name": "Open Hashing",
        "sections": {
          "Open Hashing": {}
        }
      },
      "Hashing/BucketHash": {
        "long_name": "Bucket Hashing",
        "sections": {
          "Bucket Hashing": {},
          "An Alternate Approach": {}
        }
      },
      "Hashing/HashCSimple": {
        "long_name": "Collision Resolution",
        "sections": {
          "Collision Resolution": {}
        }
      },
      "Hashing/HashCImproved": {
        "long_name": "Improved Collision Resolution",
        "sections": {
          "Linear Probing by Steps": {},
          "Pseudo-Random Probing": {},
          "Quadratic Probing": {},
          "Double Hashing": {}
        }
      },
      "Hashing/HashAnal": {
        "long_name": "Analysis of Closed Hashing",
        "sections": {
          "Analysis of Closed Hashing": {}
        }
      },
      "Hashing/HashDel": {
        "long_name": "Hahing Deletion",
        "sections": {
          "Deletion": {},
          "Hashing Deletion Summary Questions": {}
        }
      },
      "Hashing/HashSumm": {
        "long_name": "Hashing Chapter Summary Exercises",
        "sections": {
          "Hashing Review": {}
        }
      }
    },
    "Memory Management": {
      "MemManage/MemmanIntro": {
        "long_name": "Chapter Introduction: Memory Management",
        "sections": {}
      },
      "MemManage/Dynamic": {
        "long_name": "Dynamic Storage Allocation",
        "sections": {
          "Dynamic Storage Allocation": {}
        }
      },
      "MemManage/SequentialFit": {
        "long_name": "Sequential-Fit Methods",
        "sections": {
          "Sequential-Fit Methods": {}
        }
      },
      "MemManage/FirstFit": {
        "long_name": "First Fit Memory Allocation",
        "sections": {
          "First Fit": {}
        }
      },
      "MemManage/CircularFit": {
        "long_name": "Circular First Fit",
        "sections": {
          "Circular First Fit": {}
        }
      },
      "MemManage/BestFit": {
        "long_name": "Best Fit Memory Manager",
        "sections": {
          "Best Fit": {}
        }
      },
      "MemManage/WorstFit": {
        "long_name": "Worst Fit Memory Manager",
        "sections": {
          "Worst Fit": {}
        }
      },
      "MemManage/MMPerformance": {
        "long_name": "Sequential Fit Peformance",
        "sections": {
          "Sequential Fit Peformance": {}
        }
      },
      "MemManage/Buddy": {
        "long_name": "Buddy Method and Other Memory Allocation Methods",
        "sections": {
          "Other Memory Allocation Methods": {}
        }
      },
      "MemManage/Garbage": {
        "long_name": "Failure Policies and Garbage Collection",
        "sections": {}
      }
    },
    "Indexing": {
      "Indexing/IndexIntro": {
        "long_name": "Indexing Chapter Introduction",
        "sections": {}
      },
      "Indexing/LinearIndexing": {
        "long_name": "Linear Indexing",
        "sections": {
          "Linear Indexing": {}
        }
      },
      "Indexing/ISAM": {
        "long_name": "ISAM",
        "sections": {}
      },
      "Indexing/TreeIndexing": {
        "long_name": "Tree-based Indexing",
        "sections": {
          "Tree-based Indexing": {}
        }
      },
      "Indexing/TwoThreeTree": {
        "long_name": "2-3 Trees",
        "sections": {
          "2-3 Trees": {}
        }
      },
      "Indexing/BTree": {
        "long_name": "B-Trees",
        "sections": {
          "B-Trees": {}
        }
      },
      "Indexing/IndexingSumm": {
        "long_name": "Indexing Summary Exercises",
        "sections": {
          "Indexing Summary": {}
        }
      }
    },
    "General Trees": {
      "General/GenTreeIntro": {
        "long_name": "General Trees",
        "sections": {
          "General Trees": {}
        }
      },
      "General/UnionFind": {
        "long_name": "Union/Find and the Parent Pointer Implementation",
        "sections": {
          "The Union/Find Problem": {}
        }
      },
      "General/SequentialRep": {
        "long_name": "Sequential Tree Representations",
        "sections": {
          "Sequential Tree Representations": {},
          "Alternative Sequential Representation": {},
          "Bit Vector Representation": {},
          "General Tree Sequential Representation": {}
        }
      }
    },
    "Graphs": {
      "Graph/GraphIntro": {
        "long_name": "Graphs Chapter Introduction",
        "sections": {
          "Graph Terminology and Implementation": {
            "GspaceCalcSumm": {
              "long_name": "Graph Space Requirements Exercise",
              "required": false,
              "points": 2.0,
              "type": "ka",
              "av_address": "Exercises/Graph/GspaceCalcSumm.html",
              "mod_name": "GraphIntro",
              "threshold": 5
            }
          },
          "Graph Terminology Questions": {
            "GraphIntroSumm": {
              "long_name": "Graph Terminology Summary Exercise",
              "required": false,
              "points": 3.0,
              "type": "ka",
              "av_address": "Exercises/Graph/GraphIntroSumm.html",
              "mod_name": "GraphIntro",
              "threshold": 10
            }
          }
        }
      },
      "Graph/GraphImpl": {
        "long_name": "Graph Implementations",
        "sections": {}
      },
      "Graph/GraphTraversal": {
        "long_name": "Graph Traversals",
        "sections": {
          "Graph Traversals": {
            "DFSCON": {
              "long_name": "Depth-First Search Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Graph/DFSCON.css"
              ],
              "scripts": [
                "AV/Graph/DFSCON.js"
              ],
              "mod_name": "GraphTraversal"
            }
          },
          "Breadth-First Search": {
            "BFSCON": {
              "long_name": "Breadth-First Search Slideshow",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/Graph/BFSCON.css"
              ],
              "scripts": [
                "AV/Graph/BFSCON.js"
              ],
              "mod_name": "GraphTraversal"
            }
          }
        }
      },
      "Graph/GraphTopsort": {
        "long_name": "Topological Sort",
        "sections": {
          "Topological Sort": {}
        }
      },
      "Graph/GraphShortest": {
        "long_name": "Shortest-Paths Problems",
        "sections": {
          "Shortest-Paths Problems": {}
        }
      },
      "Graph/MCST": {
        "long_name": "Minimal Cost Spanning Trees",
        "sections": {
          "Minimal Cost Spanning Trees": {}
        }
      },
      "Graph/Kruskal": {
        "long_name": "Kruskal's Algorithm",
        "sections": {
          "Kruskal's Algorithm": {}
        }
      },
      "Graph/Floyd": {
        "long_name": "All-Pairs Shortest Paths",
        "sections": {}
      }
    },
    "Spatial Data Structures": {
      "Spatial/Spatial": {
        "long_name": "Spatial Data Structures",
        "sections": {
          "Spatial Data Structures": {}
        }
      },
      "Spatial/PRquadtree": {
        "long_name": "The PR Quadtree",
        "sections": {
          "The PR Quadtree": {}
        }
      },
      "Spatial/KDtree": {
        "long_name": "KD Trees",
        "sections": {
          "KD Trees": {}
        }
      },
      "Spatial/Bintree": {
        "long_name": "The Bintree",
        "sections": {
          "The Bintree": {}
        }
      },
      "Spatial/OtherSpatial": {
        "long_name": "Other Spatial Data Structures",
        "sections": {}
      }
    },
    "Senior Algorithms Course": {
      "SeniorAlgAnal/AAIntro": {
        "long_name": "Data and Algorithm Analysis",
        "sections": {
          "Introduction": {}
        }
      },
      "SeniorAlgAnal/ProblemSolving": {
        "long_name": "An Introduction to Problem Solving",
        "sections": {
          "An Introduction to Problem Solving": {}
        }
      },
      "SeniorAlgAnal/AAOverview": {
        "long_name": "Semester Overview",
        "sections": {
          "Semester Overview": {},
          "Acknowledgement": {}
        }
      },
      "SeniorAlgAnal/TOH": {
        "long_name": "Introduction to Analyzing a Problem",
        "sections": {
          "Introduction": {},
          "Towers of Hanoi": {},
          "Acknowledgement": {}
        }
      },
      "SeniorAlgAnal/BoundsReview": {
        "long_name": "Bounds Review",
        "sections": {
          "Bounds Review": {
            "SimpleCosts1CON": {
              "type": "dgm",
              "mod_name": "BoundsReview"
            },
            "SimpleCosts2CON": {
              "type": "dgm",
              "mod_name": "BoundsReview"
            }
          }
        }
      },
      "SeniorAlgAnal/GrowthRate": {
        "long_name": "Growth Rates Review",
        "sections": {
          "Growth Rates Review": {}
        }
      },
      "SeniorAlgAnal/AdvSumm": {
        "long_name": "Summation Techniques",
        "sections": {}
      },
      "SeniorAlgAnal/Recurrence": {
        "long_name": "Solving Recurrence Relations",
        "sections": {
          "Solving Recurrence Relations": {}
        }
      }
    },
    "Searching": {
      "Searching/SearchIntro": {
        "long_name": "Chapter Introduction: Search",
        "sections": {}
      },
      "Searching/UnsortedSearch": {
        "long_name": "Analyzing Search in Unsorted Lists",
        "sections": {
          "Analyzing Search in Unsorted Lists": {}
        }
      },
      "Searching/SortedSearch": {
        "long_name": "Search in Sorted Arrays",
        "sections": {
          "Analysis": {}
        }
      },
      "Searching/SelfOrg": {
        "long_name": "Self-Organizing Lists",
        "sections": {
          "Introduction": {},
          "Move to Front": {},
          "Transpose": {}
        }
      },
      "Development/SetSearch": {
        "long_name": "Bit Vectors for Representing Sets",
        "sections": {}
      },
      "Development/PerfectHash": {
        "long_name": "Perfect Hashing",
        "sections": {
          "Perfect Hashing": {}
        }
      }
    },
    "Lower Bounds": {
      "Bounds/BoundMax": {
        "long_name": "Finding the Maximum Value",
        "sections": {
          "Finding the Maximum Value": {},
          "Acknowledgement": {}
        }
      },
      "Bounds/BoundAdversary": {
        "long_name": "Adversarial Lower Bounds Proofs",
        "sections": {}
      },
      "Bounds/BoundState": {
        "long_name": "State Space Lower Bounds Proofs",
        "sections": {}
      },
      "Bounds/BoundiBest": {
        "long_name": "Finding the i th Best Element",
        "sections": {}
      },
      "Bounds/SortingOptimal": {
        "long_name": "Optimal Sorting",
        "sections": {}
      }
    },
    "Number Problems": {
      "SeniorAlgAnal/Numeric": {
        "long_name": "Number Problems",
        "sections": {
          "Number Problems": {}
        }
      },
      "SeniorAlgAnal/Transform": {
        "long_name": "The Transformation Concept",
        "sections": {
          "The Transformation Concept: Integer Multiplication": {},
          "Polynomial Multiplication": {}
        }
      },
      "SeniorAlgAnal/FFT": {
        "long_name": "The Fast Fourier Transform",
        "sections": {
          "The Fast Fourier Transform": {}
        }
      }
    },
    "Probabilistic Algorithms": {
      "SeniorAlgAnal/Probabilistic": {
        "long_name": "Introduction to Probabilistic Algorithms",
        "sections": {
          "Probabilistic Algorithms": {}
        }
      },
      "SeniorAlgAnal/Primes": {
        "long_name": "Finding Prime Numbers",
        "sections": {}
      },
      "SeniorAlgAnal/RandomNums": {
        "long_name": "Random Numbers",
        "sections": {
          "Random Numbers": {}
        }
      },
      "SearchStruct/SkipList": {
        "long_name": "Skip Lists",
        "sections": {
          "Skip Lists": {}
        }
      }
    },
    "Search Structures": {
      "SearchStruct/BalancedTree": {
        "long_name": "Balanced Trees",
        "sections": {}
      },
      "SearchStruct/AVL": {
        "long_name": "The AVL Tree",
        "sections": {}
      },
      "SearchStruct/Splay": {
        "long_name": "The Splay Tree",
        "sections": {}
      },
      "SearchStruct/RedBlack": {
        "long_name": "The Red-Black Tree",
        "sections": {
          "Exercise 1": {},
          "Exercise 2": {}
        }
      }
    },
    "Miscellaneous": {
      "SearchStruct/Sparse": {
        "long_name": "The Sparse Matrix",
        "sections": {}
      },
      "SeniorAlgAnal/DynamicProgramming": {
        "long_name": "Dynamic Programming",
        "sections": {
          "Dynamic Programming": {},
          "Computing Fibonacci Numbers": {},
          "The Knapsack Problem": {},
          "Chained Matrix Multiplication": {}
        }
      },
      "SeniorAlgAnal/AmortAnal": {
        "long_name": "Amortized Analysis",
        "sections": {}
      },
      "Development/Knapsack": {
        "long_name": "0/1 Knapsack Problem",
        "sections": {
          "0/1 Knapsack Problem": {},
          "Exercise 2": {},
          "Exercise 3": {},
          "Exercise 4": {}
        }
      },
      "Development/EditDistance": {
        "long_name": "Edit Distance",
        "sections": {
          "Edit Distance": {},
          "Exercise 1": {},
          "Exercise 2": {}
        }
      },
      "Development/StringSearchKMP": {
        "long_name": "KMP String Search Algorithm",
        "sections": {
          "KMP String Search Algorithm": {}
        }
      },
      "Development/StringSearchBoyerMoore": {
        "long_name": "Boyer-Moore String Search Algorithm",
        "sections": {
          "Boyer-Moore String Search Algorithm": {}
        }
      },
      "Development/StringSearchRabinKarp": {
        "long_name": "Rabin-Karp String Search Algorithm [Draft]",
        "sections": {
          "Rabin-Karp String Search Algorithm [Draft]": {}
        }
      },
      "Development/GenTreeImplement": {
        "long_name": "General Tree Implementations",
        "sections": {
          "General Tree Implementations": {}
        }
      },
      "Development/Kary": {
        "long_name": "K-ary Tree Implementations",
        "sections": {
          "K-ary Tree Implementations": {}
        }
      }
    },
    "Limits to Computing": {
      "NP/LimComp": {
        "long_name": "Limits to Computing",
        "sections": {
          "Limits to Computing": {}
        }
      },
      "NP/Reduction": {
        "long_name": "Reductions",
        "sections": {
          "Reductions": {}
        }
      },
      "NP/NPComplete": {
        "long_name": "NP-Completeness",
        "sections": {
          "NP-Completeness": {}
        }
      },
      "NP/circuitSAT": {
        "long_name": "Circuit Satisfiability",
        "sections": {
          "Circuit Satisfiability": {}
        }
      },
      "NP/SAT": {
        "long_name": "Formula Satisfiability",
        "sections": {
          "Formula Satisfiability": {}
        }
      },
      "NP/threeSAT": {
        "long_name": "3-CNF Satisfiability",
        "sections": {
          "3-CNF Satisfiability (3-SAT)": {}
        }
      },
      "NP/clique": {
        "long_name": "The Clique Problem",
        "sections": {
          "The Clique Problem": {}
        }
      },
      "NP/independentSet": {
        "long_name": "The Independent Set Problem",
        "sections": {
          "Independent Set": {}
        }
      },
      "NP/vertexCover": {
        "long_name": "The Vertex Cover Problem",
        "sections": {
          "Vertex Cover": {}
        }
      },
      "NP/hamiltonianCycle": {
        "long_name": "The Hamiltonian Cycle Problem",
        "sections": {
          "Hamiltonian Cycle": {}
        }
      },
      "NP/TSP": {
        "long_name": "The Traveling Salesman Problem",
        "sections": {
          "Traveling Salesman": {}
        }
      },
      "NP/provingNPC": {
        "long_name": "NP-Completeness Proofs",
        "sections": {
          "NP-Completeness Proofs": {}
        }
      },
      "NP/circuitSAT_to_SAT": {
        "long_name": "Reduction of Circuit SAT to SAT",
        "sections": {
          "Reduction of Circuit SAT to SAT": {}
        }
      },
      "NP/SAT_to_threeSAT": {
        "long_name": "Reduction of SAT to 3-SAT",
        "sections": {
          "Reduction of SAT to 3-SAT": {}
        }
      },
      "NP/threeSAT_to_clique": {
        "long_name": "Reduction of 3-SAT to Clique",
        "sections": {
          "Reduction of 3-SAT to Clique": {}
        }
      },
      "NP/clique_to_independentSet": {
        "long_name": "Reduction of Clique to Independent Set",
        "sections": {
          "Clique to Independent Set": {}
        }
      },
      "NP/independentSet_to_vertexCover": {
        "long_name": "Reduction of Independent Set to Vertex Cover",
        "sections": {
          "Independent Set to Vertex Cover": {}
        }
      },
      "NP/threeSAT_to_hamiltonianCycle": {
        "long_name": "Reduction of 3-SAT to Hamiltonian Cycle",
        "sections": {
          "3-SAT to Hamiltonian Cycle": {}
        }
      },
      "NP/hamiltonianCycle_to_TSP": {
        "long_name": "Reduction of Hamiltonian Cycle to Traveling Salesman",
        "sections": {
          "Hamiltonian Cycle to Traveling Salesman": {}
        }
      },
      "NP/NPCoping": {
        "long_name": "Coping with NP-Complete Problems",
        "sections": {}
      },
      "SeniorAlgAnal/Impossible": {
        "long_name": "Unsolvable Problems",
        "sections": {
          "Unsolvable Problems": {}
        }
      },
      "SeniorAlgAnal/Turing": {
        "long_name": "Turing Machines",
        "sections": {
          "Turing Machines": {}
        }
      }
    },
    "Appendix": {
      "Glossary": {
        "long_name": "Glossary",
        "sections": {}
      },
      "Bibliography": {
        "long_name": "Bibliography",
        "sections": {}
      }
    }
  }
}