กลับสู่คอร์สเรียน
AI028 Undergraduate

การวิเคราะห์โครงสร้างข้อมูลและอัลกอริธึมด้วย Python (ฉบับที่ 2)

หนังสือเล่มนี้เป็นหนังสือเรียนคลาสสิกที่ใช้ภาษา Python ในการอธิบายโครงสร้างข้อมูลและอัลกอริธึม โดยครอบคลุมหัวข้อต่างๆ เช่น การทบทวนพื้นฐานของ Python, การวิเคราะห์อัลกอริธึม (การเขียนแบบโอใหญ่), โครงสร้างข้อมูลพื้นฐาน (สแตก, คิว, ลิสต์), การเรียกซ้ำ, การค้นหาและการจัดเรียงข้อมูล, อัลกอริธึมของต้นไม้และกราฟ พร้อมด้วยรายการโค้ดจริงเพื่อช่วยให้ผู้อ่านเข้าใจวิธีการนำเอาชนิดข้อมูลเชิงนามธรรมต่างๆ มาใช้งานอย่างมีประสิทธิภาพผ่านภาษา Python

4.7
24.0h
1028 ผู้เรียน
0 การถูกใจ
ปัญญาประดิษฐ์
เริ่มเรียน

ภาพรวมคอร์สเรียน

📚 สรุปเนื้อหา

หนังสือเล่มนี้เป็นตำราคลาสสิกที่ใช้ภาษา Python ในการอธิบายโครงสร้างข้อมูลและอัลกอริธึม โดยครอบคลุมหัวข้อต่าง ๆ เช่น การทบทวนพื้นฐานของ Python, การวิเคราะห์อัลกอริธึม (การเขียนเชิงคำนวณแบบโอใหญ่), โครงสร้างข้อมูลพื้นฐาน (สแตก, คิว, ลิสต์), การเรียกซ้ำ, การค้นหาและการจัดเรียง, อัลกอริธึมของต้นไม้และกราฟ ผ่านรายการโค้ดที่ใช้งานจริง เพื่อช่วยให้ผู้อ่านเข้าใจวิธีการนำเอาประเภทข้อมูลที่ถูกนามธรรมมาใช้ในภาษา Python ได้อย่างมีประสิทธิภาพ

เพียงแค่เข้าใจโครงสร้างข้อมูลและอัลกอริธึมอย่างลึกซึ้ง จึงจะสามารถเชี่ยวชาญภาษา Python ได้จริง

ผู้แต่ง: แบรดลีย์ มิลเลอร์ (ศาสตราจารย์เกียรติคุณด้านวิทยาการคอมพิวเตอร์ มหาวิทยาลัยลูเธอรัน สหรัฐอเมริกา) และ เดวิด ราแนม (วิศวกรซอฟต์แวร์ด้านความฉลาดทางปัญญาจาก IBM Watson)

ขอบคุณ: ขอขอบคุณเพื่อนร่วมงานสตีฟ ฮับบาร์ด สำหรับข้อเสนอแนะจำนวนมากในฉบับที่ 1 และข้อมูลใหม่สำหรับฉบับที่ 2 รวมถึงผู้อ่านทุกท่านที่ส่งอีเมลแจ้งข้อผิดพลาดและข้อเสนอแนะ ขอบคุณพนักงานที่ร้านกาแฟ "จาเว่ จอห์น" ในเมืองดิโกล่า อย่างเมรี่ บ๊อบ เป็นต้น ที่ยอมให้เราเป็น “นักเขียนประจำ” ระหว่างหยุดพัก ขอขอบคุณทีมงานบริษัทสำนักพิมพ์แฟรงคลิน บีเดิล & แอสโซซิเอทส์ (โดยเฉพาะเจมส์ ไลซี่ และทอม ซัมเนอร์) ที่ทำงานร่วมกันอย่างสนุก ท้ายที่สุด ขอขอบคุณภรรยาของเราทั้งสองคน แจน มิลเลอร์ และเบรนดา ราแนม ที่มอบความรักและความสนับสนุน ทำให้หนังสือเล่มนี้กลายเป็นจริงได้

🎯 วัตถุประสงค์การเรียนรู้

  1. เข้าใจความสัมพันธ์ระหว่างวิทยาการคอมพิวเตอร์ อัลกอริธึม และการเขียนโปรแกรม พร้อมทั้งเข้าใจแนวคิดเรื่องประเภทข้อมูลที่ถูกนามธรรม (ADT) และการซ่อนข้อมูล (Information Hiding)
  2. ใช้ประเภทข้อมูลรวมภายในภาษา Python (ลิสต์ ทูเปิล เซต ไดก์ชันนารี) และโครงสร้างควบคุม (การวนซ้ำ การแยกเงื่อนไข การจัดการข้อผิดพลาด) ได้อย่างคล่องแคล่ว
  3. เข้าใจหลักการสำคัญของการเขียนโปรแกรมแบบวัตถุ (OOP) ของภาษา Python ได้แก่ การกำหนดคลาส การตั้งค่าคอนสตรัคเตอร์ การใช้โอเวอร์โหลดตัวดำเนินการ (เช่น การบวกเศษส่วน) การประยุกต์ใช้อัลกอริธึมยูคลิด และความแตกต่างระหว่างการเทียบเท่าแบบลึกกับแบบตื้น
  4. วิเคราะห์หลายแนวทางของอัลกอริธึม: สามารถอธิบายแนวทางสี่แบบในการตรวจจับคำที่มีตัวอักษรสลับกัน (การนับจำนวน, การเรียงลำดับ, การลองทุกกรณี, การนับจำนวน) พร้อมทั้งระบุความซับซ้อนตามเวลา (Time Complexity) ที่สัมพันธ์กัน
  5. วัดประสิทธิภาพของตัวเก็บข้อมูลในภาษา Python: เข้าใจประสิทธิภาพระดับโอใหญ่ (Big O) ของฟังก์ชันหลักในลิสต์ (List) และไดก์ชันนารี (Dict) และสามารถแยกความแตกต่างด้านประสิทธิภาพระหว่าง pop() กับ pop(i) ได้
  6. ความสามารถในการตรวจสอบประสิทธิภาพ: สามารถออกแบบการทดลองโดยใช้โมดูล timeit เพื่อยืนยันความสอดคล้องระหว่างความซับซ้อนทางทฤษฎีกับเวลาทำงานจริง
  7. เข้าใจและแยกแยะลักษณะเชิงตรรกะของโครงสร้างข้อมูลแบบเส้นตรง (สแตก คิว ควีว ลิสต์)
  8. สามารถใช้ประเภทข้อมูลพื้นฐานของภาษา Python (เช่น ลิสต์) สร้างสแตก คิว และควีวที่กำหนดเองได้
  9. เข้าใจการประยุกต์ใช้สแตกในการจัดการนิพจน์ (แปลงจากแบบปรกติเป็นแบบโพสต์ฟิกซ์ คำนวณผลลัพธ์จากแบบโพสต์ฟิกซ์) และการประยุกต์ใช้คิวในการจำลองระบบ (เช่น การจำลองเครื่องพิมพ์)
  10. เข้าใจหลักการสามข้อพื้นฐานของอัลกอริธึมแบบเรียกซ้ำ: สามารถระบุและเขียนฟังก์ชันแบบเรียกซ้ำที่มีเงื่อนไขพื้นฐาน สถานะที่เปลี่ยนแปลง และการเรียกตนเองได้อย่างแม่นยำ

🔹 บทเรียนที่ 1: พื้นฐานการเขียนโปรแกรมด้วยภาษา Python และการสร้างภาพจำแนกแบบวัตถุ

ภาพรวม: โมดูลบทเรียนนี้มีวัตถุประสงค์เพื่อช่วยให้ผู้เรียนก้าวผ่านจากทฤษฎีพื้นฐานด้านวิทยาการคอมพิวเตอร์ไปสู่การปฏิบัติการเขียนโปรแกรมด้วยภาษา Python บทเรียนเริ่มจากการกำหนดนิยามหลักของวิทยาการคอมพิวเตอร์ อัลกอริธึม และประเภทข้อมูลที่ถูกนามธรรม (ADT) จากนั้นขยายไปยังการใช้ประเภทข้อมูลภายในภาษา Python โครงสร้างควบคุม และการจัดการข้อผิดพลาด บทเรียนสิ้นสุดลงด้วยการสร้างคลาส Fraction และโครงสร้างการสืบทอดแบบ "ประตูตรรกะ" เพื่อแสดงถึงพลังของการเขียนโปรแกรมแบบวัตถุ (OOP) ในการจัดการกระบวนการและข้อมูลที่ถูกนามธรรม

ผลลัพธ์การเรียนรู้:

  • เข้าใจความสัมพันธ์ระหว่างวิทยาการคอมพิวเตอร์ อัลกอริธึม และการเขียนโปรแกรม พร้อมทั้งเข้าใจแนวคิดเรื่องประเภทข้อมูลที่ถูกนามธรรม (ADT) และการซ่อนข้อมูล (Information Hiding)
  • ใช้ประเภทข้อมูลรวมภายในภาษา Python (ลิสต์ ทูเปิล เซต ไดก์ชันนารี) และโครงสร้างควบคุม (การวนซ้ำ การแยกเงื่อนไข การจัดการข้อผิดพลาด) ได้อย่างคล่องแคล่ว
  • เข้าใจหลักการสำคัญของการเขียนโปรแกรมแบบวัตถุ (OOP) ของภาษา Python ได้แก่ การกำหนดคลาส การตั้งค่าคอนสตรัคเตอร์ การใช้โอเวอร์โหลดตัวดำเนินการ (เช่น การบวกเศษส่วน) การประยุกต์ใช้อัลกอริธึมยูคลิด และความแตกต่างระหว่างการเทียบเท่าแบบลึกกับแบบตื้น

🔹 บทเรียนที่ 2: การวิเคราะห์อัลกอริธึมและประสิทธิภาพของตัวเก็บข้อมูลในภาษา Python

ภาพรวม: บทเรียนนี้สำรวจอย่างลึกซึ้งเกี่ยวกับวิธีการประเมินประสิทธิภาพของอัลกอริธึมโดยใช้การเขียนเชิงคำนวณแบบโอใหญ่ (Big O Notation) และยกตัวอย่างการตรวจจับคำที่มีตัวอักษรสลับกัน เพื่อแสดงให้เห็นการพัฒนาความซับซ้อนตั้งแต่ O(n!) ไปจนถึง O(n) พร้อมกันนี้ ยังมีการวิเคราะห์เชิงปริมาณประสิทธิภาพของปฏิบัติการหลักในโครงสร้างข้อมูลหลักของภาษา Python (ลิสต์และไดก์ชันนารี) เพื่อช่วยให้ผู้พัฒนาสามารถเลือกตัวเก็บข้อมูลและออกแบบอัลกอริธึมได้อย่างเหมาะสมที่สุดในงานจริง

ผลลัพธ์การเรียนรู้:

  • วิเคราะห์หลายแนวทางของอัลกอริธึม: สามารถอธิบายแนวทางสี่แบบในการตรวจจับคำที่มีตัวอักษรสลับกัน (การนับจำนวน, การเรียงลำดับ, การลองทุกกรณี, การนับจำนวน) พร้อมทั้งระบุความซับซ้อนตามเวลา (Time Complexity) ที่สัมพันธ์กัน
  • วัดประสิทธิภาพของตัวเก็บข้อมูลในภาษา Python: เข้าใจประสิทธิภาพระดับโอใหญ่ (Big O) ของฟังก์ชันหลักในลิสต์ (List) และไดก์ชันนารี (Dict) และสามารถแยกความแตกต่างด้านประสิทธิภาพระหว่าง pop() กับ pop(i) ได้
  • ความสามารถในการตรวจสอบประสิทธิภาพ: สามารถออกแบบการทดลองโดยใช้โมดูล timeit เพื่อยืนยันความสอดคล้องระหว่างความซับซ้อนทางทฤษฎีกับเวลาทำงานจริง

🔹 บทเรียนที่ 3: โครงสร้างเชิงเส้นพื้นฐาน: สแตก คิว และลิสต์แบบเชื่อมโยง

ภาพรวม: บทเรียนนี้สำรวจโครงสร้างข้อมูลเชิงเส้นพื้นฐานสี่ชนิด ได้แก่ สแตก (Stack), คิว (Queue), ควีว (Deque) และลิสต์ (List) จุดสำคัญของโครงสร้างเชิงเส้นอยู่ที่การคงลำดับสัมพัทธ์ขององค์ประกอบ และความแตกต่างหลักอยู่ที่วิธีการเพิ่มและลบองค์ประกอบ ผ่านการนำเอาประเภทข้อมูลที่ถูกนามธรรม (ADT) มาใช้ในภาษา Python ผู้เรียนจะเข้าใจการใช้หลักการ LIFO (Last In First Out) และ FIFO (First In First Out) เพื่อแก้ปัญหาอัลกอริธึมจริง เช่น การแปลงนิพจน์ การจำลองระบบ และการจัดการหน่วยความจำในลิสต์แบบเชื่อมโยง

ผลลัพธ์การเรียนรู้:

  • เข้าใจและแยกแยะลักษณะเชิงตรรกะของโครงสร้างข้อมูลเชิงเส้น (สแตก คิว ควีว ลิสต์)
  • สามารถใช้ประเภทข้อมูลพื้นฐานของภาษา Python (เช่น ลิสต์) สร้างสแตก คิว และควีวที่กำหนดเองได้
  • เข้าใจการประยุกต์ใช้สแตกในการจัดการนิพจน์ (แปลงจากแบบปรกติเป็นแบบโพสต์ฟิกซ์ คำนวณผลลัพธ์จากแบบโพสต์ฟิกซ์) และการประยุกต์ใช้คิวในการจำลองระบบ (เช่น การจำลองเครื่องพิมพ์)

🔹 บทเรียนที่ 4: หลักการอัลกอริธึมแบบเรียกซ้ำ และการเริ่มต้นด้านการโปรแกรมแบบไดนามิก

ภาพรวม: บทเรียนนี้สำรวจหลักการสำคัญของอัลกอริธึมแบบเรียกซ้ำ ตั้งแต่หลักการสามข้อพื้นฐานของเรียกซ้ำ ผ่านตัวอย่างต่าง ๆ เช่น การแปลงค่าตัวเลข รูปทรงฟรัคทัล ปัญหาทายลับคลาสสิก (หอคอยฮานอย และปริศนาทางเดินในห้องโคม) เพื่อเปิดเผยกลไกพื้นฐานของการเรียกซ้ำ — บล็อกการเรียกฟังก์ชัน (Stack Frame) บทเรียนสิ้นสุดด้วยการแนะนำแนวคิดของ "การโปรแกรมแบบไดนามิก" (Dynamic Programming) แสดงให้เห็นว่าการใช้เทคนิคการจดจำ (Memoization) สามารถแก้ปัญหาการคำนวณซ้ำซ้อนในอัลกอริธึมแบบเรียกซ้ำ ทำให้ประสิทธิภาพของอัลกอริธึมเปลี่ยนแปลงอย่างมีนัยสำคัญ

ผลลัพธ์การเรียนรู้:

  • เข้าใจหลักการสามข้อพื้นฐานของอัลกอริธึมแบบเรียกซ้ำ: สามารถระบุและเขียนฟังก์ชันแบบเรียกซ้ำที่มีเงื่อนไขพื้นฐาน สถานะที่เปลี่ยนแปลง และการเรียกตนเองได้อย่างแม่นยำ
  • เข้าใจกลไกการทำงานที่ลึกซึ้ง: เข้าใจว่าบล็อกการเรียกฟังก์ชัน (Stack Frame) ของภาษา Python จัดการตัวแปรเฉพาะและเส้นทางการกลับคืนได้อย่างไรในกระบวนการเรียกซ้ำ
  • สามารถสร้างแบบจำลองปัญหาที่ซับซ้อน: สามารถใช้แนวคิดเรียกซ้ำและกลับคืน (Backtracking) เพื่อแก้ปัญหาที่ไม่เป็นเชิงเส้น เช่น หอคอยฮานอย และการหาทางผ่านห้องโคม

🔹 บทเรียนที่ 5: เทคนิคการค้นหา แฮช และอัลกอริธึมการจัดเรียง

ภาพรวม: โมดูลบทเรียนนี้มุ่งเน้นที่เทคโนโลยีการจัดการข้อมูลหลักในวิทยาการคอมพิวเตอร์ ได้แก่ การค้นหา การแฮช (Hashing) และการจัดเรียง ครอบคลุมตั้งแต่การค้นหาแบบลำดับพื้นฐานไปจนถึงการค้นหาแบบไบนารีที่มีประสิทธิภาพ สำรวจแนวคิดการสร้างตารางแฮช (Hash Tables) วิธีการจัดการข้อขัดแย้ง และการประยุกต์ใช้ประเภทข้อมูลเชิงแผนที่ (Map) อย่างละเอียด พร้อมทั้งวิเคราะห์อัลกอริธึมการจัดเรียง เช่น การจัดเรียงแบบปุย (Bubble Sort), การจัดเรียงแบบชิลล์ (Shell Sort), และการจัดเรียงแบบผสมผสาน (Merge Sort) ทั้งในเชิงตรรกะและประสิทธิภาพ

ผลลัพธ์การเรียนรู้:

  • เข้าใจและสามารถเปรียบเทียบสถานการณ์ที่เหมาะสมของการค้นหาแบบลำดับกับการค้นหาแบบไบนารี พร้อมทั้งระบุความซับซ้อนตามเวลา (O(n) แทน O(\log n))
  • เข้าใจการออกแบบฟังก์ชันแฮช (เช่น วิธีการพับ วิธีการยกกำลังกลาง) และกลไกการจัดการข้อขัดแย้ง (เช่น การค้นหาแบบเส้นตรง การค้นหาแบบกำลังสอง การเชื่อมโยง)
  • สามารถจำลองและเขียนโปรแกรมเพื่อใช้การจัดเรียงแบบปุย การจัดเรียงแบบชิลล์ และการจัดเรียงแบบผสมผสาน พร้อมทั้งเข้าใจการประยุกต์ใช้กลยุทธ์การแบ่งแยกและเอาชนะ (Divide and Conquer) ในการจัดเรียง

🔹 บทเรียนที่ 6: โครงสร้างต้นไม้: คิวแบบทวิภาค ต้นไม้ค้นหา และต้นไม้สมดุล (AVL)

ภาพรวม: บทเรียนนี้สำรวจโครงสร้างข้อมูลที่สำคัญที่สุดในวิทยาการคอมพิวเตอร์ — ต้นไม้ เราจะเริ่มต้นจากศัพท์พื้นฐานและวิธีการสร้างต้นไม้ทวิภาค แล้วพัฒนาไปสู่การประยุกต์ใช้ขั้นสูงของต้นไม้ทวิภาค เช่น ต้นไม้การวิเคราะห์นิพจน์และวิธีการท่องต้นไม้ ต่อไปเราจะเรียนรู้เกี่ยวกับสองรูปแบบที่มีประสิทธิภาพ: คิวแบบทวิภาค (Binary Heap) สำหรับคิวความสำคัญ และต้นไม้ค้นหาทวิภาค (BST) สำหรับการค้นหาที่รวดเร็ว ท้ายที่สุด เราจะศึกษาต้นไม้ AVL ที่ใช้การหมุนเพื่อรักษาตัวแปรสมดุล แก้ปัญหาประสิทธิภาพที่ลดลงในกรณีที่เลวร้ายที่สุดของต้นไม้ค้นหาทวิภาค

ผลลัพธ์การเรียนรู้:

  • สามารถนิยามศัพท์หลักของต้นไม้ได้อย่างแม่นยำ (ราก ขอบ เส้นทาง สูง ฯลฯ) และอธิบายคุณสมบัติแบบเรียกซ้ำของต้นไม้ทวิภาคได้
  • เข้าใจอัลกอริธึมหลักที่ใช้ในภาษา Python ในการสร้างคิวแบบทวิภาค ต้นไม้ค้นหาทวิภาค และต้นไม้ AVL (เช่น การแทรก การลบ การหมุน และการปรับสมดุล)
  • สามารถดำเนินการและอธิบายอัลกอริธึมการท่องต้นไม้สามแบบ และใช้ต้นไม้การวิเคราะห์เพื่อจัดการนิพจน์ทางคณิตศาสตร์

🔹 บทเรียนที่ 7: อัลกอริธึมกราฟ: การค้นหา ระยะทางสั้นสุด และต้นไม้ครอบคลุมต่ำสุด

ภาพรวม: บทเรียนนี้สำรวจทฤษฎีพื้นฐานของกราฟและวิธีการใช้งานอย่างมีประสิทธิภาพในภาษา Python ครอบคลุมประเภทข้อมูลกราฟ (เมทริกซ์ใกล้เคียงและรายการใกล้เคียง) อัลกอริธึมการค้นหาพื้นฐาน (BFS และ DFS) พร้อมทั้งการประยุกต์ใช้ในสถานการณ์จริง บทเรียนสิ้นสุดด้วยการศึกษาอัลกอริธึมระยะทางสั้นสุด (ดิคสตรา) และต้นไม้ครอบคลุมต่ำสุด (พริม) ในกราฟที่มีน้ำหนัก

ผลลัพธ์การเรียนรู้:

  • เข้าใจและสามารถเปรียบเทียบวิธีการแทนกราฟสองแบบหลัก (เมทริกซ์ใกล้เคียง และรายการใกล้เคียง) ทั้งในด้านประสิทธิภาพและสถานการณ์ที่เหมาะสม
  • เข้าใจหลักการของอัลกอริธึมการค้นหาแบบกว้าง (BFS) และแบบลึก (DFS) และสามารถใช้แก้ปัญหาการค้นหาเส้นทางและปัญหาการเดินทางรอบกราฟได้
  • สามารถประยุกต์ใช้อัลกอริธึมกราฟเพื่อแก้ปัญหาความสัมพันธ์เชิงตรรกะที่ซับซ้อน (การจัดลำดับแบบโทพอโลจี) และปัญหาความเชื่อมโยงในเครือข่าย (หน่วยเชื่อมต่อแรง, ต้นไม้ครอบคลุมต่ำสุด)

🔹 บทเรียนที่ 8: หัวข้อเสริม: การเข้ารหัส RSA ตารางกระโดด และการปรับสีภาพดิจิทัลด้วยต้นไม้แปดมิติ

ภาพรวม: บทเรียนนี้สำรวจการย้ายต่อยอดจากโครงสร้างข้อมูลพื้นฐานไปสู่อัลกอริธึมที่ซับซ้อนในวิทยาการคอมพิวเตอร์ ครอบคลุมหัวข้อต่าง ๆ เช่น การประยุกต์ใช้โครงสร้างข้อมูลลิสต์ในภาษา Python (การจัดเก็บข้อมูลแบบอาร์เรย์) พร้อมการวิเคราะห์แบบเฉลี่ย (Amortized Analysis), อัลกอริธึมเชิงเรียกซ้ำทางทฤษฎีจำนวนที่รองรับการเข้ารหัสแบบ RSA, การสร้างตารางกระโดด (Skip List) เพื่อเพิ่มประสิทธิภาพการค้นหาในไดก์ชันนารี และหลักการใช้ต้นไม้แปดมิติ (Octree) ในการปรับสีภาพดิจิทัล

ผลลัพธ์การเรียนรู้:

  • เข้าใจการจัดวางหน่วยความจำของอาร์เรย์แบบที่มีการจัดการแบบเฉลี่ย (Amortized Analysis) และการอนุมานทางคณิตศาสตร์
  • เข้าใจหลักการทางคณิตศาสตร์หลักของการเข้ารหัสแบบ RSA ได้แก่ กฎการเท่ากันแบบโมดูลัส ผลลัพธ์กำลัง และอัลกอริธึมยูคลิดแบบขยาย
  • สามารถอธิบายโครงสร้างระดับของตารางกระโดด กระบวนการสร้างแบบสุ่ม และประสิทธิภาพการค้นหาที่ระดับ O(\log n)