Page 53 - โครงสร้างข้อมูลและขั้นตอนวิธี
P. 53

การวัดประสิทธิภาพและความซับซ้อนของขั้นตอนวิธี 2-43

        จาก​รหัส​เทียม​ของ​ข้ัน​ตอน​วิธี​ที่ 3 จะ​มี 2 โพร​ซี​เยอ​ร์​ใน​การ​ท�ำงาน โดย​โพร​ซี​เยอ​ร์​แรก MaxSubSequence-

Sum() จะ​รับ​ข้อมูล​เข้ามา​โดยตรง แล้ว​เรียก​ใช้​โพร​ซี​เยอ​ร์​ท่ี 2 คือ MaxSubSum() ท่ี​มี​การ​ระบุ​ต�ำแหน่ง​เร่ิม​ต้น​และ​

สุดท้าย​ของ​ล�ำดับ​เพ่ือ​พิจารณา​หา​ค่า​ผล​รวม ที่​ท�ำเ​ช่น​น้ี​เนื่องจาก​จะ​มี​การ​เรียก​ใช้​การ​ท�ำงาน​ใน​ลักษณะ​เดิม​กับ​ข้อมูล​

ในล​ �ำดับเ​ดิม​แต่​ต่างต​ �ำแหน่ง​กัน จึงต​ ้องเ​พิ่มก​ าร​ระบุต​ �ำแหน่งเ​ร่ิมต​ ้น​และ​สุดท้าย​ของ​ล�ำดับย​ ่อย​ที่​ก�ำลังจ​ ะค​ �ำน​ วณด​ ้วย

        โพร​ซี​เยอ​ร์ MaxSubSum() จะ​เร่ิม​ต้น​โดย​การ​พิจารณา​ว่า​จุด​เร่ิม​ต้น​และ​สุดท้าย​ของ​ล�ำดับ​ย่อย (ในท​ ่ี​น่ี​แทน​

ด้วย Left และ Right ตาม​ล�ำดับ) เป็น​จุด​เดียวกัน​หรือ​ไม่ ถ้า​ใช่​ให้​คืน​ค่าที่​มากกว่า 0 เพราะต​ ้องการ​หา​ผล​รวม​ท่ี​มาก​

ท่ีสุด

        แต่​ถ้าไ​ม่ใช่ต​ �ำแหน่ง​เดียวกัน จะ​สามารถ​ท�ำงาน​แบ่ง​ข้อมูล​ออกเ​ป็น 2 ส่วนไ​ด้ โดยห​ า​จุด​ก่ึงกลาง​จาก Center

:= ⎣(Left + Right)/2⎦ เป็นการป​ ัดเศษ​จากก​ ารห​ าร​ลง แล้ว​เรียกใ​ช้ MaxSubSum() เพ่ือ​ค�ำนวณ​หาผ​ ลร​ วม​ล�ำดับย​ ่อย​

ที่ม​ าก​สุด​ของ​ทั้ง 2 ส่วน

        จากน​ ั้นค​ �ำน​ วณ​ค่า​ผลร​ วมท​ ีม่​ าก​ทีส่ ดุ ​ของ​ล�ำดบั ย​ อ่ ย​ท​อ่ี ยร่​ู ะหว่าง​คร่ึง​ซา้ ยแ​ ละ​ครึ่ง​ขวา จะ​ไดเ​้ ท่ากับ (MaxLeft-

BorderSum + MaxRightBorderSum) แล้ว​พิจารณาห​ าค​ ่าม​ ากส​ ุดร​ ะหว่าง ค่า​มาก​ท่ีสุด​ของ​ผล​รวม​ล�ำดับ​ย่อย​ท่ีม​ าก​

ที่สุด​ใน​ครึ่ง​ซ้าย (MaxLeftSum) ผล​รวม​ล�ำดับ​ย่อย​ที่​มาก​ที่สุด​ใน​คร่ึง​ขวา (MaxRightSum) และ​ผล​รวม​

ล�ำดับ​ย่อย​ที่​อยู่​ตรง​กลาง​ระหว่าง​ครึ่ง​ซ้าย​และ​คร่ึง​ขวา (MaxLeftBorderSum + MaxRightBorderSum) ใน​ค�ำส​ ่ัง​

สุดท้ายค​ ือค�ำส​ ั่ง RETURN ค�ำต​ อบท​ ี่​หาไ​ด้​นั่นเอง
        การ​วิเคราะห์​หา​เวลา​ที​่ใช้​ใน​การ​ประมวล​ผล ​ท�ำได้​ใน​ลักษณะ​เดียวกัน​กับ​การ​ค�ำน​ วณฟิ​โบ​นัก​ซี โดย​ให้ T(n)
เป็น​เวลา​ท่ีข​ ้ัน​ตอนว​ ิธี​ใช้แ​ ก้ป​ ัญหา​ขนาด n

        ถ้า n = 1 แล้วโ​ปรแกรม​จะใ​ช้เ​วลาเ​ป็นค​ ่า​คงตัว​คือ T(1) = 1 หน่วยเ​วลา

       ส�ำหรับ n > 1 โปรแกรม​จะ​ประมวล​ผล​การ​เวียน​เกิด 2 ครั้ง (จาก​รหัส​เทียม คือ เพ่ือ​หา MaxLeftSum และ
Mจ​ทะี่​มa​ใีx​ชจR้​เ�ำวiนgลวhานt2SเTuต(m็มn2​ต)โ ด ัวแย​สล​กุดะา​มทรี​เ​ก้ารยาียร​กแ​ใ​ฟชล้​ลังะกูป​ผ์ชลfันo​รrMว2มaคx​มรSา้ังuกbโ​ทดSี่สยuุด​ไmม​ใ(่​นใ)ชแ​ค้ บfรoบึ่งr​ข​เวซวีย้อาน​นทเ​​ี่ก​มกันิดี​จ)�เำนพซวึ่ง่ือ​ตน​ห่าเาตง​คใ​็มช่า​ต​เ้​เรวัว่ิมล​แา​ตร​เป้นก็น​ผ(จลTา​ร(กวn2​รม)ห​มหัสาน​กเ่วท​ทยียี่ส​เมวุดล​ใคานือร​ควเรพมึ่ง่ือ​แ​ซล​ห้าย้วา​

MaxLeftBorderSum และ MaxRightBorderSum) ซึ่งใ​ ช้​เวลา​มาก​ที่สุด​เป็น O(n) ดัง​นั้น ขั้น​ตอน​วิธี​น้ี​จะ​ใช้​เวลา
ท​ ั้งหมด เป็น 2TT((n21))  =+1O(n) ซึ่ง​ได้แก่ส​ มการ ดังต​ ่อไ​ป​นี้
        เพื่อง​ ่าTย(​แnก)่ก​=าร2ค​T�ำ(นn2ว)ณ+
                        12Tแ(ลn2้ว)             O(n)        O(n)  ในส​ มการ​ข้างบ​ น​ด้วย  n  เพื่อ​อธิบาย  T(n)  จะ​ได้
                                                ให้​แทนที่

               T(n)  =               +          n
               T(1)  =
        ซึ่ง	

        	 T(2) = 4 = 2*2

        	 T(4) = 12 = 4*3

        	 T(8) = 32 = 8*4

        	 T(16) = 80 = 16*5
        ไปเ​รื่อยๆ จะเ​ห็นว​ ่า​มี​รูป​แบบ​ท่ี​สัมพันธ์ก​ ับ n โดยที่​เม่ือ n = 2k จะไ​ด้ log2 n = k
   48   49   50   51   52   53   54   55   56   57   58