โครงสร้างข้อมูล: ข้อสอบฝึกหัดพร้อมคำอธิบาย

ข้อสอบปรนัย โครงสร้างข้อมูล ฟรี พร้อมคำใบ้และคำอธิบาย สามระดับ: ศัพท์สำคัญและข้อเท็จจริง, การประยุกต์ใช้แนวคิด, กรณีศึกษาและการวิเคราะห์

โจทย์ฝึกฟรีง่าย

คุณสมบัติ max-heap คืออะไร

โจทย์ถัดไป →
ฝึก โครงสร้างข้อมูล ฟรีฝึก โครงสร้างข้อมูล เลยโจทย์ฟรีวันละ 5 ข้อ ไม่ต้องใช้บัตร

สิ่งที่คุณจะได้ฝึก

  1. ง่ายศัพท์สำคัญและข้อเท็จจริง
  2. ปานกลางการประยุกต์ใช้แนวคิด
  3. ยากกรณีศึกษาและการวิเคราะห์

เรียนรู้ โครงสร้างข้อมูล ตั้งแต่ต้น

ก่อนหน้านี้: อัลกอริทึมและความซับซ้อน

1โครงสร้างข้อมูลคืออะไร

โครงสร้างข้อมูล (data structure) คือวิธีจัดระเบียบข้อมูลในหน่วยความจำเพื่อให้การดำเนินการบางอย่างเร็ว เช่น การหารายการ การเพิ่ม การลบ

ไม่มีโครงสร้างใดเร็วในทุกอย่าง การเลือกโครงสร้างคือการเลือกว่าการดำเนินการใดควรมีต้นทุนต่ำ ต้นทุนเขียนด้วยบิ๊กโอ โดย n คือจำนวนรายการ

องค์ประกอบพื้นฐานสองอย่างคืออาร์เรย์และลิงก์ลิสต์

a7[0]3[1]9[2]4[3]7394∅h

อาร์เรย์ (array) เก็บรายการในหน่วยความจำก้อนเดียวเรียงต่อกัน คอมพิวเตอร์คำนวณได้ว่ารายการ i อยู่ที่ใด การอ่าน a[i] จึงใช้ O(1) การแทรกที่ด้านหน้าต้องเลื่อนทุกรายการ: O(n)

ลิงก์ลิสต์ (linked list) เก็บแต่ละรายการในโหนดพร้อมตัวชี้ไปยังโหนดถัดไป ตัวชี้สุดท้ายเป็น null การแทรกที่หัว (h) เปลี่ยนตัวชี้เพียงตัวเดียว: O(1) แต่การไปถึงรายการ i ต้องตามตัวชี้ i ตัว: O(n)

ลิงก์ลิสต์สองทิศทาง (doubly linked list) มีตัวชี้ไปยังโหนดก่อนหน้าด้วย จึงเดินได้ทั้งสองทาง

ตรวจสอบตนเอง การดำเนินการใดเป็น O(1) สำหรับอาร์เรย์ แต่เป็น O(n) สำหรับลิงก์ลิสต์ทิศทางเดียว
  1. การนับรายการทีละรายการ
  2. การอ่านรายการที่ดัชนี i
  3. การเยี่ยมชมทุกรายการหนึ่งครั้ง
  4. การแทรกรายการใหม่ที่ด้านหน้า

คำตอบ: การอ่านรายการที่ดัชนี i. อาร์เรย์คำนวณที่อยู่ของรายการ i ได้โดยตรง ลิงก์ลิสต์ต้องตามตัวชี้ i ตัวจากหัว การแทรกที่ด้านหน้าเป็นกรณีตรงข้าม: ถูกสำหรับลิสต์ แพงสำหรับอาร์เรย์

2สแตกและคิว

สแตก (stack) เหมือนกองจาน: เพิ่มและเอาออกที่ด้านบนเท่านั้น รายการที่เข้าทีหลังสุดออกก่อน: LIFO

  • push วางรายการไว้ด้านบน pop เอารายการบนสุดออก peek อ่านรายการบนสุดโดยไม่เอาออก ทั้งหมดเป็น O(1)
  • การใช้งาน: ฟังก์ชันเลิกทำของโปรแกรมแก้ไข สแตกการเรียกฟังก์ชันของโปรแกรม การตรวจว่าวงเล็บสมดุล การค้นหาตามความลึก

คิว (queue) เหมือนแถวที่แคชเชียร์: เข้าต่อท้ายแถวและออกที่หัวแถว รายการที่เข้าก่อนออกก่อน: FIFO

  • enqueue เพิ่มที่ท้าย dequeue เอาออกจากหน้า ทั้งสองเป็น O(1)
  • การใช้งาน: งานพิมพ์ ข้อความที่รอการจัดการ การค้นหาตามความกว้าง

ดีคิว (deque หรือ double-ended queue) เพิ่มและเอาออกได้ทั้งสองปลาย คิวลำดับความสำคัญ (priority queue) เอารายการที่มีความสำคัญสูงสุดออกก่อนเสมอ โดยทั่วไปสร้างเป็นฮีป

ตรวจสอบตนเอง โครงสร้างข้อมูลใดเหมาะกับปุ่ม “เลิกทำ” ของโปรแกรมแก้ไขข้อความที่สุด
  1. กราฟ
  2. คิว
  3. ตารางแฮช
  4. สแตก

คำตอบ: สแตก. การเลิกทำต้องย้อนการกระทำล่าสุดก่อน: เข้าทีหลังสุดออกก่อน ถ้าเป็นคิวจะเลิกทำการกระทำเก่าที่สุดก่อน

3ต้นไม้ ฮีป ตารางแฮช และกราฟ

ต้นไม้ (tree) มีโหนดบนสุดหนึ่งโหนดคือราก (root) โหนดอื่นทุกโหนดมีพ่อแม่หนึ่งโหนดพอดี โหนดที่ไม่มีลูกคือใบ (leaf) ต้นไม้ที่มี n โหนดมี n − 1 เส้นเชื่อม

ในต้นไม้ทวิภาค (binary tree) แต่ละโหนดมีลูกไม่เกินสองโหนด ต้นไม้ค้นหาแบบทวิภาค (BST) เพิ่มกฎ: คีย์ในต้นไม้ย่อยซ้ายน้อยกว่าโหนด คีย์ในต้นไม้ย่อยขวามากกว่า

การค้นหาใน BST ตามเส้นทางเดียวลงไป จึงมีต้นทุน O(ความสูง) ต้นไม้สมดุล (AVL, red-black) รักษาความสูงให้ใกล้ log₂ n คีย์ที่แทรกตามลำดับเรียงทำให้เป็นสายโซ่สูง n

ฮีป (heap) คือต้นไม้ทวิภาคที่พ่อแม่ทุกโหนดน้อยกว่าลูก (min-heap) หรือมากกว่า (max-heap) ค่าน้อยที่สุดหรือมากที่สุดอยู่ที่ราก และการแทรกและเอาออกมีต้นทุน O(log n)

ตารางแฮช (hash table) เก็บคู่คีย์–ค่า ฟังก์ชันแฮช เปลี่ยนคีย์เป็นดัชนี การแทรกและค้นหาจึงใช้ O(1) โดยเฉลี่ย คีย์สองตัวที่ได้ดัชนีเดียวกันคือการชน (collision) แก้ด้วย chaining (ลิสต์ต่อช่อง) หรือ open addressing (ลองช่องอื่น)

กราฟ (graph) มีจุดยอดที่เชื่อมด้วยเส้นเชื่อม ซึ่งอาจมีทิศทางหรือน้ำหนัก เก็บเป็นเมทริกซ์ประชิด ใช้หน่วยความจำ O(V²) หรือเป็นลิสต์ประชิด ใช้ O(V + E)

ตรวจสอบตนเอง คีย์ 50, 30, 70, 20 และ 40 ถูกแทรกตามลำดับนี้ลงใน BST ที่ว่างเปล่า ลูกซ้ายของ 30 คืออะไร
  1. 20
  2. 40
  3. 70
  4. ไม่มีลูกซ้าย

คำตอบ: 20. 20 น้อยกว่า 50 จึงไปทางซ้ายถึง 30 และน้อยกว่า 30 ด้วย จึงไปทางซ้ายอีก 40 มากกว่า 30 และกลายเป็นลูกขวาของ 30

4วิธีทำทีละขั้น

คำถามมักอธิบายงานหนึ่งแล้วถามว่าโครงสร้างใดเหมาะ หรือถามว่าโครงสร้างหน้าตาเป็นอย่างไรหลังการดำเนินการบางอย่าง

  1. หาการดำเนินการที่ต้องเร็ว: เข้าถึงด้วยตำแหน่ง ด้วยคีย์ รายการใหม่สุด รายการเก่าสุด รายการเล็กสุด หรือช่วง
  2. จับคู่กับโครงสร้าง: ดัชนี → อาร์เรย์ คีย์ → ตารางแฮช ใหม่สุด → สแตก เก่าสุด → คิว เล็กสุดหรือใหญ่สุด → ฮีป ลำดับเรียงหรือช่วง → ต้นไม้ค้นหาสมดุล
  3. ตรวจต้นทุนของการดำเนินการอื่นที่งานต้องการ เป็นบิ๊กโอ
  4. สำหรับโจทย์ไล่สถานะ ให้ทำการดำเนินการทีละอย่างและเขียนสถานะหลังแต่ละขั้น
  5. ตรวจสถานะสุดท้ายกับกฎของโครงสร้าง: LIFO, FIFO, ลำดับ BST หรือลำดับฮีป

5ตัวอย่างที่แก้ให้ดู

ทำตามทุกขั้นตอน ลองทำนายขั้นถัดไปก่อนเปิดดู

ตัวอย่างที่แก้ให้ดู

คีย์ 50, 30, 70, 20, 40 และ 60 ถูกแทรกตามลำดับนี้ลงใน BST ที่ว่างเปล่า การท่องแบบ in-order ได้ผลอย่างไร และการค้นหา 60 ต้องเปรียบเทียบกี่ครั้ง

1

แทรกราก

คีย์แรก 50 กลายเป็นราก

2

แทรก 30 และ 70

30 น้อยกว่า 50 จึงไปทางซ้าย 70 มากกว่า 50 จึงไปทางขวา

503070
3

แทรก 20, 40 และ 60

20: น้อยกว่า 50 น้อยกว่า 30 จึงอยู่ซ้ายของ 30 40: น้อยกว่า 50 มากกว่า 30 จึงอยู่ขวาของ 30 60: มากกว่า 50 น้อยกว่า 70 จึงอยู่ซ้ายของ 70

503070204060
4

ท่องแบบ in-order

การท่องแบบ in-order เยี่ยมต้นไม้ย่อยซ้าย แล้วโหนด แล้วต้นไม้ย่อยขวา

ได้ 20, 30, 40, 50, 60, 70: คีย์ตามลำดับเรียง ซึ่งเป็นเช่นนี้เสมอสำหรับ BST

5

ค้นหา 60

เปรียบเทียบกับ 50: มากกว่า ไปขวา เปรียบเทียบกับ 70: น้อยกว่า ไปซ้าย เปรียบเทียบกับ 60: พบ

503070204060

การค้นหาต้องเปรียบเทียบ 3 ครั้ง หนึ่งครั้งต่อหนึ่งระดับ

คำตอบ

In-order: 20, 30, 40, 50, 60, 70 การค้นหา 60 ต้องเปรียบเทียบ 3 ครั้ง

6ข้อผิดพลาดที่พบบ่อย

  • สับสน LIFO กับ FIFO สแตกคืนรายการใหม่สุด คิวคืนรายการเก่าสุด
  • คิดว่าลิงก์ลิสต์เข้าถึงด้วยดัชนีได้เร็ว ต้องเดินจากหัว
  • สมมติว่า BST เป็น O(log n) เสมอ เฉพาะต้นไม้สมดุลเท่านั้น การแทรกตามลำดับเรียงให้ O(n)
  • ลืมการชนในตารางแฮช O(1) เป็นค่าเฉลี่ย ไม่ใช่กรณีเลวร้ายที่สุด
  • สับสนการท่อง Preorder: โหนดก่อน In-order: โหนดตรงกลาง Postorder: โหนดท้ายสุด
  • ใช้เมทริกซ์ประชิดกับกราฟใหญ่ที่เบาบาง สิ้นเปลืองหน่วยความจำ O(V²)
ตรวจสอบตนเอง คุณ enqueue 1, 2 และ 3 ลงในคิวว่างตามลำดับนี้ dequeue ครั้งแรกคืนรายการใด
  1. 1, 2 และ 3 พร้อมกัน
  2. 1
  3. 2
  4. 3

คำตอบ: 1. คิวเป็นเข้าก่อนออกก่อน 1 จึงออกก่อน 3 เป็นคำตอบของสแตก (pop) ซึ่งคืนรายการใหม่สุด

7ข้อสอบมีหน้าตาอย่างไร

  • ง่าย: ศัพท์และข้อเท็จจริงสำคัญ LIFO และ FIFO โหนด ราก หรือใบคืออะไร กฎของ BST ฟังก์ชันแฮชทำอะไร
  • ปานกลาง: การประยุกต์แนวคิด โครงสร้างใดเหมาะกับงาน ผลของ push และ pop หรือการแทรกใน BST การท่องต้นไม้ ตารางแฮชแบบ linear probing ต้นทุนบิ๊กโอ
  • ยาก: กรณีศึกษาและการวิเคราะห์ ต้นไม้สมดุล ฮีปในอาร์เรย์ B-tree, trie, union-find, Bloom filter และการออกแบบ เช่น LRU cache

สำหรับฮีปที่เก็บในอาร์เรย์เริ่มจากดัชนี 0 ลูกของดัชนี i อยู่ที่ 2i + 1 และ 2i + 2 และพ่อแม่อยู่ที่ ⌊(i − 1) / 2⌋

เรียนรู้ทีละขั้นในแอปเรียนรู้ทีละขั้นในแอป

ตัวอย่างคำถาม

ตัวอย่างที่ 1ง่าย

ข้อแตกต่างหลักระหว่างอาร์เรย์สถิตกับอาร์เรย์พลวัตคืออะไร

  1. Aอาร์เรย์สถิตเข้าถึงด้วยดัชนีช้ากว่า
  2. Bอาร์เรย์พลวัตขยายได้โดยย้ายไปยังบล็อกหน่วยความจำที่ใหญ่กว่า
  3. Cอาร์เรย์พลวัตเก็บสมาชิกในโหนดที่เชื่อมกันจึงขยายได้ทีละหนึ่ง
  4. Dอาร์เรย์สถิตเก็บได้เฉพาะตัวเลข
แสดงคำใบ้
  1. list ของ Python และ ArrayList ของ Java เป็นตัวอย่างของแบบใดแบบหนึ่ง
  2. ตอนนี้ขีดฆ่าคำตอบที่ผิดสองข้อแล้ว หนึ่งในสองข้อที่เหลือเป็นคำตอบที่ถูก
แสดงคำตอบและคำอธิบาย

เหตุผลที่เป็นคำตอบนี้

อาร์เรย์สถิตมีขนาดคงที่ ส่วนอาร์เรย์พลวัตจัดสรรอาร์เรย์ที่ใหญ่กว่าและคัดลอกสมาชิกเมื่อเต็ม

คำตอบ

B · อาร์เรย์พลวัตขยายได้โดยย้ายไปยังบล็อกหน่วยความจำที่ใหญ่กว่า
ตัวอย่างที่ 2ปานกลาง

extract-min ใน min-heap ทวิภาคทำงานอย่างไร

  1. Aลบสมาชิกสุดท้ายของอาร์เรย์
  2. Bย้ายสมาชิกสุดท้ายไปที่รากและเลื่อนลง (sift down)
  3. Cลบรากและเลื่อนสมาชิกทั้งหมดไปทางซ้ายหนึ่งตำแหน่ง
  4. Dค้นหาใบทั้งหมดเพื่อหาค่าต่ำสุดใหม่
แสดงคำใบ้
  1. รักษาต้นไม้ให้สมบูรณ์ แล้วซ่อมลำดับ
  2. ตอนนี้ขีดฆ่าคำตอบที่ผิดสองข้อแล้ว หนึ่งในสองข้อที่เหลือเป็นคำตอบที่ถูก
แสดงคำตอบและคำอธิบาย

เหตุผลที่เป็นคำตอบนี้

สมาชิกสุดท้ายเติมช่องว่างที่ราก และสลับกับลูกที่เล็กกว่าจนคุณสมบัติฮีปเป็นจริง ใช้ O(log n)

คำตอบ

B · ย้ายสมาชิกสุดท้ายไปที่รากและเลื่อนลง (sift down)
ตัวอย่างที่ 3ยาก

หากไม่มี union by rank หรือ path compression ต้นทุนในกรณีเลวร้ายที่สุดของ find หนึ่งครั้งในโครงสร้าง union-find ที่มี n สมาชิกคือเท่าใด

  1. AO(1)
  2. BO(α(n))
  3. CO(log n)
  4. DO(n)
แสดงคำใบ้
  1. ต้นไม้อาจเสื่อม
  2. ตอนนี้ขีดฆ่าคำตอบที่ผิดสองข้อแล้ว หนึ่งในสองข้อที่เหลือเป็นคำตอบที่ถูก
แสดงคำตอบและคำอธิบาย

เหตุผลที่เป็นคำตอบนี้

การรวมอย่างไร้เดียงสาเชื่อมต้นไม้เป็นโซ่ยาวได้ find จึงอาจตามตัวชี้แม่ n − 1 ตัว ทั้งสองฮิวริสติกทำให้ใกล้ค่าคงที่

คำตอบ

D · O(n)

คำถามและคำตอบ

โครงสร้างข้อมูล คืออะไร

ไม่มีโครงสร้างใดเร็วในทุกอย่าง การเลือกโครงสร้างคือการเลือกว่าการดำเนินการใดควรมีต้นทุนต่ำ ต้นทุนเขียนด้วยบิ๊กโอ โดย n คือจำนวนรายการ

องค์ประกอบพื้นฐานสองอย่างคืออาร์เรย์และลิงก์ลิสต์

จะเรียน โครงสร้างข้อมูล ทีละขั้นได้อย่างไร
  1. โครงสร้างข้อมูลคืออะไร
  2. สแตกและคิว
  3. ต้นไม้ ฮีป ตารางแฮช และกราฟ
  4. วิธีทำทีละขั้น
  5. ตัวอย่างที่แก้ให้ดู
  6. ข้อผิดพลาดที่พบบ่อย
  7. ข้อสอบมีหน้าตาอย่างไร
แบบฝึกหัด โครงสร้างข้อมูล ครอบคลุมเรื่องอะไรบ้าง
  • ง่าย: ศัพท์สำคัญและข้อเท็จจริง
  • ปานกลาง: การประยุกต์ใช้แนวคิด
  • ยาก: กรณีศึกษาและการวิเคราะห์

ทุกคำถามมีสี่ตัวเลือก และถูกเพียงข้อเดียว ติดขัดใช่ไหม เปิดคำใบ้เล็ก ๆ ก่อน และเปิดคำอธิบายฉบับเต็มเมื่อจำเป็นเท่านั้น

การฝึกทำงานอย่างไร

  • ทุกคำถามมีสี่ตัวเลือก และถูกเพียงข้อเดียว
  • ติดขัดใช่ไหม เปิดคำใบ้เล็ก ๆ ก่อน และเปิดคำอธิบายฉบับเต็มเมื่อจำเป็นเท่านั้น
  • ความก้าวหน้า ข้อที่ผิด และโจทย์ที่บันทึกไว้จะถูกเก็บไว้ เพื่อให้คุณทบทวนก่อนสอบได้

หัวข้อก่อนและหลังหัวข้อนี้

ควรเรียนก่อน

รายวิชาที่มีหัวข้อนี้

หัวข้ออื่นในวิทยาการคอมพิวเตอร์

ใบงานสำหรับพิมพ์

ฝึก โครงสร้างข้อมูล ฟรีฝึก โครงสร้างข้อมูล เลยโจทย์ฟรีวันละ 5 ข้อ ไม่ต้องใช้บัตร