Notes & software courses · Free to learn
Aph's Blog
On this page

คิดเป็นขั้นตอน (Algorithmic Thinking)

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

อัลกอริทึมคืออะไร, แตกปัญหาเป็นขั้นตอน, เขียน pseudocode ก่อนลงโค้ดจริง

อัลกอริทึม (algorithm) คือลำดับขั้นตอนในการแก้ปัญหา เหมือนสูตรอาหารที่บอกทำทีละขั้นจนได้ผลลัพธ์ ก่อนจะเรียนอัลกอริทึมสำเร็จรูป สิ่งสำคัญกว่าคือ "วิธีคิด" — แตกปัญหาใหญ่เป็นขั้นเล็ก ๆ ที่คอมพิวเตอร์ทำได้

ปัญหาเดียว แก้ได้หลายวิธี

ลองดูปัญหาง่าย: หาผลรวมเลข 1 ถึง n สองวิธีนี้ให้ผลเท่ากัน แต่ประสิทธิภาพต่างกันลิบลับ

python
# วิธีที่ 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 คำนวณครั้งเดียวจบ การเลือกอัลกอริทึมที่ดีจึงสำคัญกว่าเครื่องเร็ว ๆ เสียอีก

ขั้นตอนการแก้ปัญหา

เวลาเจอโจทย์ อย่าเพิ่งรีบเขียนโค้ด ทำตามขั้นตอนนี้จะคิดออกเป็นระบบและพลาดน้อยลง

  1. เข้าใจโจทย์ — input คืออะไร, output ที่ต้องการคืออะไร, มีเงื่อนไขพิเศษไหม
  2. ยกตัวอย่างด้วยมือ — ลองทำกับข้อมูลเล็ก ๆ ดูว่าคำตอบควรเป็นอะไร
  3. วางแผนเป็นขั้นตอน (pseudocode) — เขียนเป็นภาษาคนก่อน
  4. เขียนโค้ดตามแผน
  5. ทดสอบกับ edge case — ค่าว่าง, ค่าเดียว, ค่าซ้ำ, ค่าติดลบ

Pseudocode — วางแผนก่อนเขียนจริง

pseudocode คือการเขียนขั้นตอนเป็นภาษาคน (กึ่งโค้ด) ก่อนลงโค้ดจริง ช่วยให้คิดตรรกะได้ชัดโดยไม่ติดเรื่องไวยากรณ์ภาษา

ปัญหา: หาค่ามากที่สุดในลิสต์

pseudocode:
  กำหนด biggest = สมาชิกตัวแรก
  สำหรับสมาชิกแต่ละตัวในลิสต์:
      ถ้าตัวนั้น > biggest:
          biggest = ตัวนั้น
  คืนค่า biggest
python
# แปลง 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 ของการเช็คว่าเลขเป็นจำนวนเฉพาะไหม