On this page
คิดเป็นขั้นตอน (Algorithmic Thinking)
อัลกอริทึมคืออะไร, แตกปัญหาเป็นขั้นตอน, เขียน pseudocode ก่อนลงโค้ดจริง
อัลกอริทึม (algorithm) คือลำดับขั้นตอนในการแก้ปัญหา เหมือนสูตรอาหารที่บอกทำทีละขั้นจนได้ผลลัพธ์ ก่อนจะเรียนอัลกอริทึมสำเร็จรูป สิ่งสำคัญกว่าคือ "วิธีคิด" — แตกปัญหาใหญ่เป็นขั้นเล็ก ๆ ที่คอมพิวเตอร์ทำได้
ปัญหาเดียว แก้ได้หลายวิธี
ลองดูปัญหาง่าย: หาผลรวมเลข 1 ถึง n สองวิธีนี้ให้ผลเท่ากัน แต่ประสิทธิภาพต่างกันลิบลับ
# วิธีที่ 1: วนบวกทีละตัว (ทำ n รอบ)
def sum_loop(n):
total = 0
for i in range(1, n + 1):
total += i
return total
# วิธีที่ 2: ใช้สูตรคณิตศาสตร์ (คำนวณครั้งเดียว!)
def sum_formula(n):
return n * (n + 1) // 2
print(sum_loop(100), sum_formula(100)) # 5050 5050ถ้า n = 1,000,000,000 วิธีที่ 1 ต้องวนพันล้านรอบ ส่วนวิธีที่ 2 คำนวณครั้งเดียวจบ การเลือกอัลกอริทึมที่ดีจึงสำคัญกว่าเครื่องเร็ว ๆ เสียอีก
ขั้นตอนการแก้ปัญหา
เวลาเจอโจทย์ อย่าเพิ่งรีบเขียนโค้ด ทำตามขั้นตอนนี้จะคิดออกเป็นระบบและพลาดน้อยลง
- เข้าใจโจทย์ — input คืออะไร, output ที่ต้องการคืออะไร, มีเงื่อนไขพิเศษไหม
- ยกตัวอย่างด้วยมือ — ลองทำกับข้อมูลเล็ก ๆ ดูว่าคำตอบควรเป็นอะไร
- วางแผนเป็นขั้นตอน (pseudocode) — เขียนเป็นภาษาคนก่อน
- เขียนโค้ดตามแผน
- ทดสอบกับ edge case — ค่าว่าง, ค่าเดียว, ค่าซ้ำ, ค่าติดลบ
Pseudocode — วางแผนก่อนเขียนจริง
pseudocode คือการเขียนขั้นตอนเป็นภาษาคน (กึ่งโค้ด) ก่อนลงโค้ดจริง ช่วยให้คิดตรรกะได้ชัดโดยไม่ติดเรื่องไวยากรณ์ภาษา
ปัญหา: หาค่ามากที่สุดในลิสต์
pseudocode:
กำหนด biggest = สมาชิกตัวแรก
สำหรับสมาชิกแต่ละตัวในลิสต์:
ถ้าตัวนั้น > biggest:
biggest = ตัวนั้น
คืนค่า biggest# แปลง pseudocode เป็นโค้ดจริง
def find_max(nums):
biggest = nums[0]
for n in nums:
if n > biggest:
biggest = n
return biggest
print(find_max([3, 7, 2, 9, 4])) # 9อย่าลืม Edge Case
โค้ดที่ทำงานกับข้อมูลปกติได้ อาจพังกับกรณีสุดขอบ การคิดถึง edge case ตั้งแต่ต้นคือสิ่งที่ทำให้โค้ดแข็งแรงและเป็นจุดที่กรรมการสัมภาษณ์ชอบถาม
- ลิสต์ว่าง [] — find_max จะ error เพราะไม่มี nums[0]
- สมาชิกตัวเดียว [5] — ต้องคืน 5 ได้
- ค่าซ้ำกันทั้งหมด [3, 3, 3]
- ค่าติดลบ [-1, -5, -2] — biggest = nums[0] รองรับได้ แต่ถ้าตั้ง biggest = 0 จะผิด!
1) เขียนวิธีที่ "ได้คำตอบถูกก่อน" (brute force) ไม่ต้องเร็วก็ได้ — มีคำตอบดีกว่าไม่มี 2) แล้วค่อยถามตัวเองว่า "ตรงไหนช้า ทำให้เร็วขึ้นได้ไหม" (เช่นเปลี่ยน list เป็น dict) 3) ตอนสัมภาษณ์ให้พูดความคิดออกมาดัง ๆ — กรรมการดูวิธีคิด ไม่ใช่แค่คำตอบ 4) ทดสอบ edge case ให้กรรมการเห็นว่าคุณรอบคอบ
สรุปหัวข้อนี้
- อัลกอริทึมคือลำดับขั้นตอนแก้ปัญหา — ปัญหาเดียวมีได้หลายวิธี ประสิทธิภาพต่างกัน
- ขั้นตอน: เข้าใจโจทย์ → ยกตัวอย่าง → วางแผน (pseudocode) → เขียน → ทดสอบ
- pseudocode ช่วยคิดตรรกะก่อนติดไวยากรณ์
- คิดถึง edge case เสมอ: ว่าง, ตัวเดียว, ซ้ำ, ติดลบ
1) เขียน pseudocode + โค้ดหาค่าน้อยที่สุดในลิสต์ 2) เขียนขั้นตอนนับจำนวนเลขคู่ในลิสต์ 3) คิด edge case ของโจทย์ "หาค่าเฉลี่ย" (ลิสต์ว่างทำอย่างไร?) 4) เขียน pseudocode ของการเช็คว่าเลขเป็นจำนวนเฉพาะไหม