ผลต่างระหว่างรุ่นของ "ขั้นตอนวิธีของเฮิร์ชเบิร์ก"

เนื้อหาที่ลบ เนื้อหาที่เพิ่ม
Guraadonz (คุย | ส่วนร่วม)
ไม่มีความย่อการแก้ไข
Guraadonz (คุย | ส่วนร่วม)
ไม่มีความย่อการแก้ไข
บรรทัด 14:
 
==ข้อมูลขั้นตอนวิธี==
[[ขั้นตอนวิธีของเฮิร์ชเบิร์ก]] (Hirschberg's algorithm) เป็นอัลกอริทึมที่ใช้ในการหาการจัดเรียงของลำดับสายอักขระที่ดีที่สุด สมมติว่าให้ ''x'' และ ''y'' เป็นสายอักขระซึ่ง ''n'' เป็นความยาวของสายอักขระ ''x'' และ ''m'' เป็นความยาวของสายอักขระ ''y'' เราสามารถใช้[[ขั้นตอนวิธีของนีดเดิ้ลแมน – วันช์]] (Needleman – Wunsch algorithm) หาการจัดเรียงที่ดีที่สุดได้โดยใช้เวลา [[สัญกรณ์โอใหญ่| O]](''nm'') และใช้เนื้อที่ [[สัญกรณ์โอใหญ่| O]](''nm'') แต่หากเราใช้ขั้นตอนวิธีของเฮิร์ชเบิร์กซึ่งดีกว่า[[ขั้นตอนวิธีของนีดเดิ้ลแมน – วันช์]]เราจะหาการจัดเรียงที่ดีที่สุดภายในเวลา [[สัญกรณ์โอใหญ่| O]](''nm'') และใช้เนื้อที่เพียง [[สัญกรณ์โอใหญ่| O]](min{''n'',''m''})<ref>http://www.cs.tau.ac.il/~rshamir/algmb/98/scribe/html/lec02/node10.html</ref>
 
ประโยชน์สำคัญอันหนึ่งของอัลกอริทึมนี้ คือ การหาการลำดับเรียงตัวของสาย DNA และสายโปรตีน ซึ่งมันเป็นวิธีที่มีประสิทธิภาพในการคำนวณ[[ลำดับย่อยร่วมยาวสุด]] (Longest summon subsequence) ระหว่างกลุ่มข้อมูล 2 กลุ่มที่แตกต่างกัน
บรรทัด 23:
โดยนิยามสัญลักษณ์ต่างๆดังนี้ Ins(''a'') คือ ต้นทุนในการแทรกสัญลักษณ์ ''a'' ลงสายอักขระ Sub(''a'',''b'') ต้นทุนครั้งของการแทนที่สัญลักษณ์ ''a'' ด้วยสัญลักษณ์ ''b'' ในสายอักขระ และ Del(''a'') ต้นทุนของการลบสัญลักษณ์ ''a'' ในสายอักขระซึ่งโดยทั่วไปแล้วต้นทุนของการเปลี่ยนแปลงต่างๆจะเป็นดังนี้ Ins(''a'') และ Del(''a'') ต้นทุนเท่ากับ 1 สำหรับทุกๆสัญลักษณ์ ''a'' ใดๆ รวมทั้ง Sub(''a'',''a'') เท่ากับ 0 และ Sub(''a'',''b'') เท่ากับ 1 ในกรณีที่สัญลักษณ์ ''a'' ไม่เท่ากับ ''b''
 
[[ขั้นตอนวิธีของนีดเดิ้ลแมน – วันช์]] (Needleman – Wunsch algorithm) จะคำนวณ Edit(Prefix[''x'',''i''],Prefix[''y'',''j'']) สำหรับทุกๆ ''i'' และ ''j'' ที่ซึ่ง Prefix[''x'',''i''] หมายถึง คำนำหน้า(prefix) ของสายอักขระ ''x'' ที่ความยาว ''i'' อัลกอริทึมนี้ต้องใช้เวลา [[สัญกรณ์โอใหญ่| O]](''nm'') และใช้เนื้อที่ [[สัญกรณ์โอใหญ่| O]](''nm'') โดย ''n'' เท่ากับความยาวของสายอักขระ ''x'' และ ''m'' เท่ากับความยาวของสายอักขระ ''y''
 
==การจัดการขั้นตอนวิธี==
เพื่อที่จะเข้าใจ[[ขั้นตอนวิธีของเฮิร์ชเบิร์ก]] (Hirschberg's algorithm) มันสำคัญมากที่จะต้องเข้าใจระยะทางที่ถูกแก้ไขสามารถคำนวณโดยใช้วิธีการ[[ปริภูมิเชิงเส้น]] (Linear space)
 
เราจะนิยาม[[โปรแกรมย่อยไปข้างหน้า]](Forward subprogram) ซึ่งคำนวณค่าของ Edit(Prefix[''x'',''i''],Prefix[''y'',''j'']) สำหรับทุกๆ ''i'' และ ''j'' คล้าย[[ขั้นตอนวิธีของนีดเดิ้ลแมน – วันช์]] และคืนค่า array{Edit(''x'',Prefix[''y'',''j''])}<sub>0 ≤ ''j'' ≤ ''m''</sub> อีกส่วนหนึ่งที่เราจะนิยามคือ[[โปรแกรมย่อยถอยหลัง]](Backward subprogram) ซึ่งคล้ายกับโปรแกรมย่อยไปข้างหน้าแต่จะทำ[[โปรแกรมแบบพลวัติ]] (dynamic program) จะสลับทิศทางกัน โดยจะเริ่มจากซ้ายไปขวาและล่างขึ้นบนแทน ซึ่งโปรแกรมนี้จะคืนค่า array {Edit(''x'',Suffix[''y'',''j''])}<sub>0 ≤ ''j'' ≤ ''m''</sub> โดย Suffix[''y'',''j''] คือ คำเสริมท้าย(suffix) ของสายอักขระ ''y'' ของความยาว ''j''
 
[[โปรแกรมย่อยไปข้างหน้า]] (Forward subprogram) และ[[โปรแกรมย่อยถอยหลัง]] (Backward subprogram) จะคำนวณค่าใน[[เมทริกซ์]](matrix) โดยใช้ค่าที่ถูกคำนวณไว้ก่อนหน้านี้ แต่จะบันทึกช่องว่างโดยการลบค่าที่ไม่จำเป็นต้องใช้อีกต่อไประหว่างการทำงานของ[[โปรแกรมย่อย]] (subprogram) แต่น่าเสียดายที่บางครั้งค่าที่ถูกลบไปอาจจะต้องนำมาใช้ในการคำนวณทีหลัง [[ขั้นตอนวิธีของเฮิร์ชเบิร์ก]] (Hirschberg's algorithm) จะใช้เวลาในการทำงานเป็น 2 เท่าของ[[ขั้นตอนวิธีของนีดเดิ้ลแมน – วันช์]] (Needleman-Wunsch algorithm) แต่ก็ยังถือว่าอยู่ในเวลา [[สัญกรณ์โอใหญ่| O]](''nm'')
 
==รหัสเทียม==