คิดแบบคอมพิวเตอร์ EP3: หาคำในพจนานุกรม ทำไมเราไม่เปิดไล่ทีละหน้า?

หาคำในพจนานุกรม ทำไมเราไม่เปิดไล่ทีละหน้า?

เพราะเรารู้ว่าคำเรียงตามตัวอักษร ถ้าเปิดไปแล้วเลยคำที่หา เราก็ย้อนกลับ ไม่ต้องเสียเวลาอ่านหน้าที่อยู่ถัดไปทั้งหมด

คอมพิวเตอร์ก็ใช้ประโยชน์จาก “ข้อมูลที่เรียงแล้ว” ได้เหมือนกัน

ลองเล่นเกมทายเลข 1–100 โดยแต่ละครั้งถามได้ว่า “ใช่ไหม?” และถ้าไม่ใช่ อีกฝ่ายจะบอกว่าเลขที่คิดมากกว่าหรือน้อยกว่า

ถ้าไล่ทาย 1, 2, 3 ไปเรื่อย ๆ อาจต้องทายถึง 100 ครั้ง

แต่ถ้าเริ่มที่ 50 ล่ะ?
ถ้าคำตอบคือ “มากกว่า” เราก็ตัดเลข 1–50 ทิ้งได้ทันที แล้วไปทายค่ากลางของช่วงที่เหลือ

สมมติเลขที่คิดคือ 73:
50 → มากกว่า
75 → น้อยกว่า
62 → มากกว่า
68 → มากกว่า
71 → มากกว่า
73 → ถูกต้อง!

แต่ละครั้งไม่ได้พาเราเข้าใกล้แค่หนึ่งช่อง แต่ตัดตัวเลือกทิ้งได้ประมาณครึ่งหนึ่ง วิธีนี้เรียกว่า Binary Search หรือการค้นหาแบบแบ่งครึ่ง

สำหรับเลข 1–100 ถ้าเลือกค่ากลางทุกครั้ง จะทายถูกภายในไม่เกิน 7 ครั้ง ต่อให้เพิ่มเป็นเลข 1–1,000,000 ก็ใช้ไม่เกิน 20 ครั้ง

หัวใจไม่ใช่การเดาเก่ง แต่คือการใช้คำตอบแต่ละครั้งลดพื้นที่ที่ต้องค้นหา

มีเงื่อนไขสำคัญ: ข้อมูลต้องเรียงตามสิ่งที่ใช้ค้นหา หรือมีเงื่อนไขที่แบ่งได้ชัดว่าควรไปฝั่งไหน ถ้าชื่อในรายชื่อกระจัดกระจาย การเปิดดูชื่อกลางไม่ได้บอกว่าชื่อที่เราหาอยู่ก่อนหรือหลัง

ถ้าต้องจัดเรียงข้อมูลใหม่ ก็มีต้นทุนเพิ่มด้วย วิธีนี้จึงเหมาะเป็นพิเศษเมื่อข้อมูลเรียงอยู่แล้ว หรือเราต้องค้นหาซ้ำหลายครั้ง

ลองคิดดูครับ ในงานของเรา มีคำถามอะไรที่ถามครั้งเดียวแล้วช่วยตัดตัวเลือกที่ไม่ใช่ออกไปได้เยอะ ๆ บ้าง?

ครูโจ๊ก ณัฐพล บัวอุไร
#คิดแบบคอมพิวเตอร์ #BinarySearch #แนวคิดการแก้ปัญหา #Algorithm

Related Posts

ทำไมเราต้องคิดก่อนโค้ด?

ทำไมเราต้องคิดก่อนโค้ด? เพราะ “โปรแกรมทำงานได้” กับ “โปรแกรมแก้ปัญหาได้” อาจเป็นคนละเรื่องกัน สมมติเราจะทำระบบเรียกคิวให้ร้านอาหาร แล้วเริ่มเขียนทันทีว่า “ใครมาก่อน ได้โต๊ะก่อน” ฟังดูตรงไปตรงมา แต่ถ้าคิวแรกมา 6 คน และตอนนี้ว่างแค่โต๊ะ 2 ที่นั่งล่ะ? เราจะปล่อยโต๊ะว่างไว้รอ หรือเรียกคิวถัดไปที่มา 2 คนก่อน? ถ้าเรียกข้าม คนกลุ่มใหญ่จะต้องรอนานแค่ไหน? เรื่องนี้ไม่ได้ติดที่เขียน Python หรือ C++…

คิดแบบคอมพิวเตอร์ EP2 : ทำงานเร็วขึ้น อาจไม่ต้องทำให้เร็วกว่าเดิม

ทำงานเร็วขึ้น อาจไม่ต้องทำให้เร็วกว่าเดิม แค่เปลี่ยนวิธี ก็ลดงานไปได้เยอะ ลองนึกว่าเรามีรายชื่อผู้สมัคร 100 คน แล้วอยากรู้ว่า “มีใครกรอกชื่อซ้ำไหม?” วิธีแรก หยิบชื่อคนแรกไปเทียบกับอีก 99 ชื่อ จากนั้นหยิบชื่อคนที่สองไปเทียบกับชื่อที่เหลือ ทำแบบนี้จนครบ ถ้าไม่มีชื่อซ้ำเลย เราต้องเทียบถึง 4,950 คู่ อีกวิธี อ่านรายชื่อทีละคน แล้วเก็บชื่อที่เคยเห็นไว้ในตัวช่วยค้นหา ถ้าชื่อใหม่อยู่ในนั้นแล้ว ก็รู้ทันทีว่าเจอชื่อซ้ำ ถ้ายังไม่มี ก็เพิ่มชื่อนั้นไว้แล้วอ่านคนถัดไป วิธีนี้อ่านรายชื่อหลักเพียง…

คิดแบบคอมพิวเตอร์ EP1 : เริ่มจากคิดให้เป็นขั้นตอน

คิดแบบคอมพิวเตอร์ เริ่มจากคิดให้เป็นขั้นตอน เวลาเราบอกเพื่อนว่า “คิดราคารวมให้หน่อย” เพื่อนอาจถามต่อได้ว่าซื้ออะไร กี่ชิ้น แต่เวลาเขียนโปรแกรม เราต้องระบุให้ชัดว่ามีข้อมูลอะไร และต้องทำอะไรกับข้อมูลนั้น ลองคิดตามโจทย์นี้: สมุดเล่มละ 20 บาท ซื้อ 3 เล่ม ต้องจ่ายเท่าไร? เราแยกวิธีทำได้ 3 ขั้น 1. กำหนดข้อมูล: ราคา 20 บาท จำนวน 3…

เขียนโปรแกรมอย่างไรให้เข้าใจอย่างถ่องแท้ : ทำไมต้อง…

“ทำไมต้อง?” ก่อนจะเรียนรู้การเขียนโปรแกรมภาษา C/C++ ให้ไกลไปกว่านี้ ลองย้อนกลับมามองโครงสร้างพื้นฐานที่หลายคนเขียนจนคุ้นมือ #include <iostream> using namespace std; int main() { return 0; } หลายคนจำเพียงว่า “เขียนตามนี้แล้วโปรแกรมจะทำงาน” แต่เคยถามไหมว่า…ทำไมต้องเขียน? ทำไมต้อง #include <iostream> เพราะเรากำลังบอกให้โปรแกรมนำเครื่องมือสำหรับรับและแสดงผลข้อมูล เช่น cin และ cout…

คณิตศาสตร์สำหรับสอบ สอวน.คอมพิวเตอร์ ค่าย 1

ไม่ได้ยากเพราะสูตรเยอะ แต่ยากเพราะ “เลือกใช้ความรู้ให้ถูก” ถ้าพูดถึงการเตรียมตัวสอบ สอวน.คอมพิวเตอร์ ค่าย 1 หลายคนอาจนึกถึง Python, Algorithm หรือการเขียนโปรแกรมเป็นเรื่องแรก ๆ แต่มีอีกส่วนหนึ่งที่ไม่ควรมองข้ามเลย นั่นก็คือ คณิตศาสตร์ และจากที่ผมลองย้อนกลับไปวิเคราะห์ข้อสอบคัดเลือก สอวน.คอมพิวเตอร์ในช่วง 3 ปีล่าสุด ตั้งแต่ พ.ศ. 2567–2569 ผมพบเรื่องหนึ่งที่น่าสนใจมาก ข้อสอบคณิตศาสตร์ไม่ได้เน้นเพียงว่า “จำสูตรได้หรือไม่?” แต่เน้นว่า “เมื่อเจอโจทย์แล้ว…

Python สำหรับสอบ สอวน.คอมพิวเตอร์ ค่าย 1 (วิเคราะห์ข้อสอบ 2567-2569)

เด็กไม่ได้ต้อง “เขียนโปรแกรมเก่ง” อย่างเดียว แต่ต้อง “อ่านโปรแกรมเป็น” ถ้าพูดถึงการเตรียมตัวสอบ สอวน.คอมพิวเตอร์ ค่าย 1 หนึ่งในเรื่องที่นักเรียนแทบทุกคนต้องเจอแน่นอนก็คือ Python แต่จากการย้อนกลับไปดูข้อสอบคัดเลือกในช่วง 3 ปีที่ผ่านมา สิ่งหนึ่งที่เห็นค่อนข้างชัดคือ ข้อสอบไม่ได้ต้องการวัดว่าเด็กจำคำสั่ง Python ได้มากแค่ไหน แต่กำลังวัดว่า “เมื่อเห็นโปรแกรมแล้ว สามารถคิดตามการทำงานของโปรแกรมได้หรือไม่” นี่เป็นคนละเรื่องกันเลยครับ เด็กบางคนเขียน Python ได้หลายบรรทัด รู้จักคำสั่งต่าง ๆ…

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.