ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทย์ปัญหาการโปรแกรมพลวัต I/เฉลยข้อ 7"
ไปยังการนำทาง
ไปยังการค้นหา
Aoy (คุย | มีส่วนร่วม) |
|||
(ไม่แสดง 3 รุ่นระหว่างกลางโดยผู้ใช้ 2 คน) | |||
แถว 1: | แถว 1: | ||
− | ให้ <math> OPT(i,j) \,</math> เป็นความยาวที่มากที่สุดของ common | + | ให้ <math> OPT(i,j) \,</math> เป็นความยาวที่มากที่สุดของ common subsequence ของ <math> x[1...i] \,</math> และ <math> y[1...j] \,</math> |
− | แนวคิดจะทำการพิจารณาว่าตัวอักษร <math> y_j \,</math> ตรงกับตัวอักษร <math> x_i \,</math> หรือไม่ ถ้าตรงแสดงว่าเราได้ common | + | แนวคิดจะทำการพิจารณาว่าตัวอักษร <math> y_j \,</math> ตรงกับตัวอักษร <math> x_i \,</math> หรือไม่ ถ้าตรงแสดงว่าเราได้ common subsequence มาแล้วหนึ่งตัว แต่ถ้าไม่ตรง อาจเป็นไปได้ที่ตัวอักษร <math> y_j \,</math> นี้ไปตรงกับตัวอักษรที่ <math> x_{i-1} \,</math> หรือ ตัวอักษร <math> x_i \,</math> ไปตรงกับตัวอักษร <math> y_{j-1} \,</math> ซึ่งการที่เราจะเลือกกรณีไหน ก็ขึ้นอยู่กับว่ากรณีนั้นต้องมี common subsequence ยาวที่สุด ดังนั้นเราจะได้ว่า |
<math> OPT(i,j) = 0 \,</math> ถ้า <math> i= 0 \,</math> หรือ <math> j=0 \,</math> | <math> OPT(i,j) = 0 \,</math> ถ้า <math> i= 0 \,</math> หรือ <math> j=0 \,</math> | ||
− | <math> OPT(i,j)= max(OPT(i-1,j),OPT(i,j-1) \,</math> ถ้า <math> x_i != y_j \,</math> | + | <math> OPT(i,j)= max(OPT(i-1,j),OPT(i,j-1)) \,</math> ถ้า <math> x_i != y_j \,</math> |
− | <math> OPT(i,j) = 1+OPT(i-1,j-1 | + | <math> OPT(i,j) = 1+OPT(i-1,j-1)\,</math> ถ้า <math> x_i=y_j \,</math> |
เขียนเป็น pseudocode ได้ดังนี้ | เขียนเป็น pseudocode ได้ดังนี้ | ||
<geshi lang="c"> | <geshi lang="c"> | ||
− | LCS(x, | + | LCS(x,n,y,m) |
− | + | for i=1 to n do | |
− | + | M[i,0] = 0 | |
− | + | for j=1 to m do | |
− | if x[i] = y[j] then | + | M[0,j] = 0 |
− | + | for i = 1 to n do | |
− | + | for j = 1 to m do | |
− | + | if x[i] = y[j] then | |
− | return M[ | + | M[i,j] = 1+M[i-1,j-1] |
+ | else | ||
+ | M[i,j] = max(M[i-1,j],M[i,j-1]) | ||
+ | return M[n,m] | ||
</geshi> | </geshi> | ||
+ | |||
+ | เห็นได้ชัดว่าอัลกอริทึมข้างต้นใช้เวลาทำงานเป็น <math> O(n)+O(m)+O(nm)=O(nm) \,</math> |
รุ่นแก้ไขปัจจุบันเมื่อ 07:40, 22 ตุลาคม 2552
ให้ เป็นความยาวที่มากที่สุดของ common subsequence ของ และ
แนวคิดจะทำการพิจารณาว่าตัวอักษร ตรงกับตัวอักษร หรือไม่ ถ้าตรงแสดงว่าเราได้ common subsequence มาแล้วหนึ่งตัว แต่ถ้าไม่ตรง อาจเป็นไปได้ที่ตัวอักษร นี้ไปตรงกับตัวอักษรที่ หรือ ตัวอักษร ไปตรงกับตัวอักษร ซึ่งการที่เราจะเลือกกรณีไหน ก็ขึ้นอยู่กับว่ากรณีนั้นต้องมี common subsequence ยาวที่สุด ดังนั้นเราจะได้ว่า
ถ้า หรือ
ถ้า
ถ้า
เขียนเป็น pseudocode ได้ดังนี้
<geshi lang="c"> LCS(x,n,y,m)
for i=1 to n do M[i,0] = 0 for j=1 to m do M[0,j] = 0 for i = 1 to n do for j = 1 to m do if x[i] = y[j] then M[i,j] = 1+M[i-1,j-1] else M[i,j] = max(M[i-1,j],M[i,j-1]) return M[n,m]
</geshi>
เห็นได้ชัดว่าอัลกอริทึมข้างต้นใช้เวลาทำงานเป็น