418531 ภาคต้น 2552/โจทย์ปัญหาอัลกอริทึมแบบตะกละ I/เฉลยข้อ 2
อัลกอริทึม
ให้สตริงใน จับคู่กับสตริงใน ตัวแรกสุดที่เหมือนกัน ถ้าสตริงทุกตัวใน ถูกจับคู่ได้หมดให้ตอบ "ใช่" ไม่เช่นั้นให้ตอบ "ไม่ใช่"
ให้ เป็นตัวแปรที่ชี้ไปยังสตริงที่กำลังพิจารณาในสตริง
ให้ เป็นตัวแปรที่ชี้ไปยังสตริงที่กำลังพิจารณาในสตริง
<geshi lang="c"> FindSubString(S,m,S',n)
{ j = 1 for i = 1 to m do { if S[i] = S'[j] then j = j + 1 } if j > n then return 1 else return 0 }
</geshi>
การพิสูจน์ความถูกต้องของอัลกอริทึม
จะทำการพิสูจน์โดยใช้เทคนิค greedy algorithm นำหน้าเสมอ ดังนี้ ให้ คือตำแหน่งของสตริงใน ที่ถูกจับคู่กับสตริงตัวที่ ของ ให้ คือ ตำแหน่งของสตริงใน ที่ถูกจับคู่กับสตริงตัวที่ ของ ที่ถูกจับคู่ตาม greedy algorithm ข้างต้น ส่วน คือ ตำแหน่งของสตริงใน ที่ถูกจับคู่กับสตริงตัวที่ ของ ที่ถูกจับคู่ตาม algorithm อื่น ๆ จะพิสูจน์ว่า เสมอ นั่นคือถ้ามีสตริงใน ที่เหมือนกับสตริงใน ตำแหน่งที่เรากำลังพิจารณาแล้ว greedy algorithm จะสามารถจับคู่ได้เสมอ จะพิสูจน์โดยใช้ strong induction กรณี base case ให้ เนื่องจาก greedy algorithm จะจับคู่สตริงใน ตัวแรกสุดที่เหมือนกัน ดังนั้นถ้ามีสตริงใน ที่เหมือนกับสตริงตัวแรกใน แล้ว เสมอ กรณี indutive step สมมติให้ สำหรับ พิจารณากรณีที่กำลังจับคู่ให้กับสตริงตัวที่ ใน ถ้ามีสตริงใน ที่เหมือนกับสตริงใน ตำแหน่งที่ แล้ว เนื่องจาก greedy algorithm จะจับตัวแรกที่เหมือนกัน ซึ่ง ถ้ามีแค่ตัวเดียวจะได้ว่า แต่ถ้ามีตัวที่เหมือนกันมากกว่าหนึ่งตัวแล้ว เนื่องจาก สำหรับ และ ดังนั้น สำหรับ จะได้ว่าสำหรับสตริง ตัวใน ถ้ามีสตริงที่เหมือนกันในสตริง แล้ว greedy algorithm จะตอบ "ใช่" เสมอ