Skip to main content

string-matching-algorithms

การทำความเข้าใจเกี่ยวกับ String Matching Algorithms​

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

1. แนวคิดหลักในการค้นหา String Matching​

ในการค้นหาคำ (หรือ pattern) ภายในข้อความ (text), อัลกอริธึมที่ใช้ต้องการให้:

  • Pattern: ชุดของตัวอักษรที่ต้องการค้นหาภายในข้อความ
  • Text: ข้อความที่มีตัวอักษรที่เราต้องการค้นหาคำ (หรือ pattern) ภายใน
  • การจับคู่: การหาตำแหน่งที่ pattern ปรากฏใน text

2. ประเภทของ String Matching Algorithms​

1. Naive String Matching​

Naive String Matching คืออัลกอริธึมที่ง่ายที่สุดในการค้นหาคำในข้อความ โดยการเปรียบเทียบ pattern กับส่วนหนึ่งของข้อความในทุกๆ ตำแหน่ง ตั้งแต่เริ่มต้นของข้อความไปจนถึงตำแหน่งสุดท้ายที่อาจจะมีความยาวพอสมควรสำหรับการจับคู่ pattern

ขั้นตอนการทำงาน:

  1. เริ่มจากตำแหน่งที่ 0 ของข้อความ
  2. เปรียบเทียบแต่ละตัวอักษรในข้อความกับตัวอักษรใน pattern
  3. ถ้าทุกตัวใน pattern ตรงกับข้อความที่ตำแหน่งปัจจุบัน, บันทึกตำแหน่งนั้นเป็นการจับคู่ที่พบ
  4. ทำซ้ำจนถึงตำแหน่งสุดท้ายที่อาจจะมีการจับคู่ pattern ได้

Complexity: ( O((n-m+1) \cdot m) ), โดยที่ ( n ) คือความยาวของข้อความ และ ( m ) คือความยาวของ pattern

ข้อดี:

  • ง่ายต่อการเข้าใจและใช้งาน
  • ไม่มีความซับซ้อนในการ implement

ข้อเสีย:

  • ช้าเมื่อข้อความมีขนาดใหญ่ เพราะต้องเปรียบเทียบทุกตำแหน่งในข้อความ

2. Knuth-Morris-Pratt (KMP) Algorithm​

Knuth-Morris-Pratt (KMP) คืออัลกอริธึมที่ปรับปรุงจาก Naive Algorithm โดยใช้แนวคิด การเลื่อน pattern เพื่อลดจำนวนการเปรียบเทียบที่ไม่จำเป็นหลังจากพบความไม่ตรงกันใน pattern

ขั้นตอนการทำงาน:

  1. สร้าง partial match table หรือ prefix table สำหรับ pattern โดยการคำนวณความยาวของ prefix ที่ตรงกับ suffix ของ pattern
  2. เมื่อมีการไม่ตรงกันระหว่าง pattern และข้อความ, อัลกอริธึมจะใช้ข้อมูลในตารางนี้เพื่อเลื่อนไปยังตำแหน่งที่สามารถทดสอบได้โดยไม่ต้องย้อนกลับไปเริ่มใหม่

Complexity: ( O(n + m) ), โดยที่ ( n ) คือความยาวของข้อความ และ ( m ) คือความยาวของ pattern

ข้อดี:

  • มีประสิทธิภาพสูงกว่า Naive Algorithm ในกรณีที่ข้อความยาว
  • ลดจำนวนการเปรียบเทียบที่ไม่จำเป็น

ข้อเสีย:

  • ต้องการการคำนวณตาราง prefix ที่อาจจะซับซ้อนในการ implement

3. Boyer-Moore Algorithm​

Boyer-Moore Algorithm เป็นหนึ่งในอัลกอริธึมการค้นหาที่เร็วที่สุดในการค้นหาคำในข้อความ โดยการเปรียบเทียบ pattern กับข้อความจากขวาไปซ้าย และใช้เทคนิคการเลื่อนที่มีประสิทธิภาพสูง โดยพิจารณา bad character rule และ good suffix rule

  • Bad Character Rule: เมื่อพบความไม่ตรงกัน, pattern จะถูกเลื่อนไปในตำแหน่งที่เหมาะสมที่สุดตามตัวอักษรที่พบในข้อความ
  • Good Suffix Rule: เมื่อพบความไม่ตรงกันใน suffix ของ pattern, จะเลื่อน pattern เพื่อใช้ข้อมูลจากตำแหน่งที่ตรงกับ suffix ที่พบ

ขั้นตอนการทำงาน:

  1. เริ่มต้นที่ตำแหน่งสุดท้ายของ pattern และเปรียบเทียบกับตัวอักษรในข้อความ
  2. หากพบความไม่ตรงกัน, ใช้ bad character rule หรือ good suffix rule เพื่อเลื่อน pattern ไปยังตำแหน่งที่เหมาะสมที่สุด
  3. ทำซ้ำจนเจอการจับคู่หรือหมดข้อความ

Complexity:

  • Best Case: ( O(n/m) )
  • Worst Case: ( O(nm) )

ข้อดี:

  • มีประสิทธิภาพสูงในการค้นหาคำในข้อความที่ยาว
  • มีความสามารถในการเลื่อน pattern ได้อย่างมีประสิทธิภาพ

ข้อเสีย:

  • อาจจะยากในการ implement เมื่อเทียบกับอัลกอริธึมอื่นๆ

4. Rabin-Karp Algorithm​

Rabin-Karp คืออัลกอริธึมที่ใช้เทคนิคการแฮช (hashing) เพื่อเปรียบเทียบส่วนต่างๆ ของข้อความกับ pattern โดยการแปลง pattern และข้อความเป็นค่าแฮช แล้วเปรียบเทียบค่าของแฮชเหล่านี้

ขั้นตอนการทำงาน:

  1. คำนวณค่าแฮชของ pattern
  2. คำนวณค่าแฮชสำหรับทุกส่วนของข้อความที่มีขนาดเท่ากับ pattern
  3. ถ้าค่าแฮชของส่วนในข้อความตรงกับ pattern, เปรียบเทียบตัวอักษรจริงเพื่อยืนยันการจับคู่

Complexity:

  • Average Case: ( O(n + m) )
  • Worst Case: ( O(nm) )

ข้อดี:

  • สามารถใช้ในการค้นหาหลายๆ pattern ในข้อความเดียว
  • ใช้ hashing ซึ่งอาจทำให้การเปรียบเทียบเร็วขึ้น

ข้อเสีย:

  • มีความเสี่ยงที่จะเกิด collision (การชนกันของค่าแฮช) ที่อาจทำให้ประสิทธิภาพลดลง

3. ตัวอย่างการใช้งาน String Matching Algorithms​

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

4. สรุป​

String Matching Algorithms มีความสำคัญในการแก้ปัญหาการค้นหาข้อความในข้อมูลที่มีขนาดใหญ่ โดยแต่ละอัลกอริธึมมีข้อดีข้อเสียที่แตกต่างกัน เช่น Naive Algorithm ที่ง่ายแต่ช้า, KMP ที่ประสิทธิภาพสูงกว่า, Boyer-Moore ที่เร็วที่สุดในหลายกรณี, และ Rabin-Karp ที่ใช้ hashing เพื่อเพิ่มความเร็วในการค้นหา. การเลือกใช้อัลกอริธึมจะขึ้นอยู่กับลักษณะของปัญหาและขนาดของข้อมูลที่ต้องการค้นหา