{
  "title": "Open Data Structures (in Java)",
  "author": "Pat Morin",
  "edition": "0.1G",
  "content_language": "en",
  "pages": 334,
  "licence": "CC BY 2.5 Canada",
  "licence_url": "https://creativecommons.org/licenses/by/2.5/ca/",
  "original": "https://opendatastructures.org/",
  "source_repository": "https://github.com/patmorin/ods",
  "source_commit": "9d22c44906dda2017b2ef0c762025bee644b58aa",
  "pdf": "00-open-data-structures-java.pdf",
  "latex": "01-open-data-structures-java.tex",
  "source_zip": "02-open-data-structures-java-source.zip",
  "chapters": [
    {
      "number": 1,
      "title": "Introduction",
      "pdf_page": 13,
      "pdf_destination": "chapter.1",
      "exercise_destination": "section.1.8",
      "exercise_pdf_page": 34
    },
    {
      "number": 2,
      "title": "Array-Based Lists",
      "pdf_page": 41,
      "pdf_destination": "chapter.2",
      "exercise_destination": "section.2.7",
      "exercise_pdf_page": 71
    },
    {
      "number": 3,
      "title": "Linked Lists",
      "pdf_page": 75,
      "pdf_destination": "chapter.3",
      "exercise_destination": "section.3.4",
      "exercise_pdf_page": 94
    },
    {
      "number": 4,
      "title": "Skiplists",
      "pdf_page": 99,
      "pdf_destination": "chapter.4",
      "exercise_destination": "section.4.5",
      "exercise_pdf_page": 114
    },
    {
      "number": 5,
      "title": "Hash Tables",
      "pdf_page": 119,
      "pdf_destination": "chapter.5",
      "exercise_destination": "section.5.4",
      "exercise_pdf_page": 140
    },
    {
      "number": 6,
      "title": "Binary Trees",
      "pdf_page": 145,
      "pdf_destination": "chapter.6",
      "exercise_destination": "section.6.3",
      "exercise_pdf_page": 158
    },
    {
      "number": 7,
      "title": "Random Binary Search Trees",
      "pdf_page": 165,
      "pdf_destination": "chapter.7",
      "exercise_destination": "section.7.3",
      "exercise_pdf_page": 180
    },
    {
      "number": 8,
      "title": "Scapegoat Trees",
      "pdf_page": 185,
      "pdf_destination": "chapter.8",
      "exercise_destination": "section.8.2",
      "exercise_pdf_page": 193
    },
    {
      "number": 9,
      "title": "Red-Black Trees",
      "pdf_page": 197,
      "pdf_destination": "chapter.9",
      "exercise_destination": "section.9.4",
      "exercise_pdf_page": 218
    },
    {
      "number": 10,
      "title": "Heaps",
      "pdf_page": 223,
      "pdf_destination": "chapter.10",
      "exercise_destination": "section.10.3",
      "exercise_pdf_page": 233
    },
    {
      "number": 11,
      "title": "Sorting Algorithms",
      "pdf_page": 237,
      "pdf_destination": "chapter.11",
      "exercise_destination": "section.11.3",
      "exercise_pdf_page": 254
    },
    {
      "number": 12,
      "title": "Graphs",
      "pdf_page": 259,
      "pdf_destination": "chapter.12",
      "exercise_destination": "section.12.4",
      "exercise_pdf_page": 273
    },
    {
      "number": 13,
      "title": "Data Structures for Integers",
      "pdf_page": 277,
      "pdf_destination": "chapter.13",
      "exercise_destination": "section.13.4",
      "exercise_pdf_page": 292
    },
    {
      "number": 14,
      "title": "External Memory Searching",
      "pdf_page": 295,
      "pdf_destination": "chapter.14",
      "exercise_destination": "section.14.3",
      "exercise_pdf_page": 316
    }
  ],
  "programme_preparation": [
    "B10",
    "B80"
  ],
  "ai_contribution": {
    "role": "Source assembly, typesetting and programme navigation",
    "model": "OpenAI Codex - GPT-6.1 Sol",
    "effort": "Ultra"
  }
}
