การวิเคราะห์อัลกอริทึมแบบตัดจำหน่ายคืออะไร? [ปิด]


85

แตกต่างจากการวิเคราะห์แบบไม่แสดงอาการอย่างไร? คุณใช้เมื่อใดและเพราะเหตุใด

ฉันได้อ่านบทความที่ดูเหมือนว่าจะเขียนได้ดีเช่นนี้:

แต่ฉันยังไม่เข้าใจแนวคิดเหล่านี้ทั้งหมด

ใครช่วยทำให้มันง่ายขึ้นหน่อยได้ไหม


5
อาจเป็นของprogrammers.stackexchange.com
lanzz

2
@lanzz อาจจะเป็นของcs.stackexchange.com
nbro

ด้ายที่ดีในความหมายของการคงตัดบัญชีเวลา
RBT

คำตอบ:


88

การวิเคราะห์ค่าตัดจำหน่ายไม่ได้คูณจำนวนการเรียกใช้อย่างไร้เดียงสาด้วยกรณีที่เลวร้ายที่สุดสำหรับการเรียกหนึ่งครั้ง

ตัวอย่างเช่นสำหรับอาร์เรย์แบบไดนามิกที่มีขนาดเพิ่มขึ้นเป็นสองเท่าเมื่อจำเป็นการวิเคราะห์แบบไม่แสดงอาการแบบปกติจะสรุปได้ว่าการเพิ่มรายการเข้าไปมีค่าใช้จ่าย O (n) เนื่องจากอาจต้องขยายและคัดลอกองค์ประกอบทั้งหมดไปยังอาร์เรย์ใหม่ การวิเคราะห์ค่าตัดจำหน่ายคำนึงถึงว่าเพื่อให้มีการเติบโตต้องเพิ่ม n / 2 รายการโดยไม่ก่อให้เกิดการเติบโตตั้งแต่การเติบโตก่อนหน้านี้ดังนั้นการเพิ่มรายการใช้เวลาเพียง O (1) เท่านั้น (ต้นทุนของ O (n) คือตัดจำหน่ายมากกว่า n / 2 การกระทำ)

การวิเคราะห์ค่าตัดจำหน่ายไม่เหมือนกับ "ประสิทธิภาพโดยเฉลี่ย" - การวิเคราะห์แบบตัดจำหน่ายให้การรับประกันอย่างหนักว่าผลการดำเนินงานจะเป็นอย่างไรหากคุณดำเนินการมาก


1
"การวิเคราะห์ค่าตัดจำหน่ายคำนึงถึงว่าเพื่อให้มีการเติบโตต้องเพิ่ม n / 2 รายการโดยไม่ก่อให้เกิดการเติบโตตั้งแต่การเติบโตก่อนหน้านี้ดังนั้นการเพิ่มรายการจะใช้เพียง O (1) เท่านั้น (ต้นทุนของ O (n) ถูกตัดจำหน่ายมากกว่า n / 2 การดำเนินการ) " สิ่งนี้ค่อนข้างสับสนและไม่ชัดเจน
AleksandrH

@AleksandrH ส่วนใดส่วนหนึ่งของมัน?
harold

ใช่มันยากที่จะทำตามคณิตศาสตร์โดยไม่มีคำอธิบายว่าตัวเลขมาจากไหน
AleksandrH

44

มีคำตอบมากมายสำหรับ "อะไร" แต่ไม่มีคำตอบสำหรับ "ทำไม"

อย่างที่คนอื่น ๆ พูดกันการวิเคราะห์แบบไม่แสดงอาการเป็นเรื่องเกี่ยวกับประสิทธิภาพของการดำเนินการที่กำหนดให้เป็นชุดข้อมูลขนาดใหญ่ การวิเคราะห์ค่าตัดจำหน่ายเป็นเรื่องเกี่ยวกับค่าเฉลี่ยของประสิทธิภาพของการดำเนินการทั้งหมดในชุดข้อมูลขนาดใหญ่ การวิเคราะห์แบบตัดจำหน่ายไม่เคยให้ขอบเขตที่แย่ไปกว่าการวิเคราะห์แบบไม่แสดงอาการและบางครั้งก็ให้สิ่งที่ดีกว่ามาก

หากคุณกังวลกับเวลาทำงานทั้งหมดของงานที่ยาวขึ้นขอบเขตของการวิเคราะห์ค่าตัดจำหน่ายที่ดีกว่าอาจเป็นสิ่งที่คุณสนใจ ด้วยเหตุนี้ภาษาสคริปต์ (เช่น) มักมีความสุขในการเพิ่มอาร์เรย์และตารางแฮชด้วยปัจจัยบางประการแม้ว่าจะเป็นการดำเนินการที่มีราคาแพงก็ตาม (การเติบโตสามารถO(n)ดำเนินการได้ แต่การตัดจำหน่ายเป็นO(1)เพราะคุณไม่ค่อยทำ)

หากคุณกำลังเขียนโปรแกรมแบบเรียลไทม์ (การดำเนินการแต่ละรายการต้องเสร็จสิ้นในเวลาที่คาดเดาได้) ขอบเขตที่ดีกว่าจากการวิเคราะห์แบบตัดจำหน่ายก็ไม่สำคัญ ไม่สำคัญว่าการดำเนินการโดยเฉลี่ยจะเร็วหรือไม่หากคุณล้มเหลวในการดำเนินการให้เสร็จทันเวลาเพื่อกลับและปรับวงเลื่อยก่อนที่จะตัดไปไกลเกินไป ...

สิ่งที่สำคัญในกรณีของคุณขึ้นอยู่กับว่าปัญหาการเขียนโปรแกรมของคุณคืออะไร


1
"การดำเนินการ O (n) ที่เพิ่มขึ้นได้ แต่ค่าตัดจำหน่ายคือ O (1) เพราะคุณทำน้อยมาก" ฉันคิดว่าคำพูดนี้ต้องการการพิสูจน์ทางคณิตศาสตร์ที่เข้มงวดมาก
nbro

"ถ้าคุณกำลังเขียนโปรแกรมแบบเรียลไทม์ ... " คุณควรมีความแม่นยำมากขึ้นและอธิบายว่าเหตุใดย่อหน้านั้นจึงควรเป็น "จริง"
nbro

1
@nbro ทำไมคุณถึงคิดว่า "ควร"? คำถามถามว่าการวิเคราะห์แบบตัดจำหน่ายแตกต่างจาก asymptotic อย่างไรและเมื่อคุณต้องการใช้แต่ละข้อ ลิงก์ไปยังบทความที่อธิบายวิธีการทำ การวิเคราะห์ทางคณิตศาสตร์จึงดูเหมือนซ้ำซ้อน สำหรับการเขียนโปรแกรมแบบเรียลไทม์ฉันได้อธิบายไปแล้ว การเขียนโปรแกรมแบบเรียลไทม์คือการเขียนโปรแกรมที่การดำเนินการแต่ละอย่างต้องเสร็จสิ้นในเวลาที่คาดเดาได้ ตัวอย่างทั่วไปคือในการเขียนโปรแกรมแบบฝังที่คุณต้องตรวจสอบบางสิ่งเป็นระยะ ๆ เช่นควบคุมเครื่องจักร. สำหรับกรณีนี้การดำเนินการที่ช้าเป็นครั้งคราวไม่สามารถยอมรับได้
btilly

27

การวิเคราะห์ Asymptotic

คำนี้หมายถึงการวิเคราะห์ประสิทธิภาพของอัลกอริทึมภายใต้สมมติฐานว่าข้อมูลที่อัลกอริทึมทำงานบน ( อินพุต ) คือในแง่ของคนธรรมดา "ใหญ่พอที่จะทำให้ใหญ่ขึ้นจะไม่เปลี่ยนข้อสรุป" แม้ว่าขนาดที่แน่นอนของการป้อนข้อมูลที่ไม่จำเป็นต้องมีการระบุ (เราจะต้องผูกพันบน) ข้อมูลที่ตั้งตัวเองมีการระบุ

โปรดทราบว่าจนถึงตอนนี้เราได้พูดถึงวิธีการวิเคราะห์เท่านั้น เราไม่ได้ระบุว่าเรากำลังวิเคราะห์ปริมาณใด (ความซับซ้อนของเวลาความซับซ้อนของพื้นที่?) และเราไม่ได้ระบุว่าเราสนใจเมตริกใด (กรณีที่เลวร้ายที่สุดกรณีที่ดีที่สุดค่าเฉลี่ย?)

ในทางปฏิบัติคำว่า asymptotic analysis มักหมายถึงความซับซ้อนของเวลาขอบเขตบนของอัลกอริทึมนั่นคือประสิทธิภาพของกรณีที่เลวร้ายที่สุดที่วัดจากเวลาทำงานทั้งหมดซึ่งแสดงด้วยสัญกรณ์ขนาดใหญ่ - Oh (เช่นอัลกอริทึมการเรียงลำดับO(nlogn))

การวิเคราะห์ค่าตัดจำหน่าย

คำนี้หมายถึงการวิเคราะห์ประสิทธิภาพของอัลกอริทึมตามลำดับขั้นตอนเฉพาะของการดำเนินงานที่กำหนดเป้าหมายสถานการณ์กรณีที่เลวร้ายที่สุดนั่นคือการวิเคราะห์แบบตัดจำหน่ายหมายความว่าเมตริกเป็นผลการดำเนินงานกรณีที่เลวร้ายที่สุด (แม้ว่าจะยังไม่ได้บอกว่ากำลังวัดปริมาณใดก็ตาม ). ในการวิเคราะห์นี้เราจำเป็นต้องระบุขนาดของอินพุต แต่เราไม่จำเป็นต้องตั้งสมมติฐานใด ๆ เกี่ยวกับรูปแบบของมัน

ในแง่ของคนธรรมดาการวิเคราะห์แบบตัดจำหน่ายคือการเลือกขนาดโดยพลการสำหรับอินพุตจากนั้นจึง "เล่นผ่าน" อัลกอริทึม เมื่อใดก็ตามที่ต้องตัดสินใจซึ่งขึ้นอยู่กับข้อมูลที่ป้อนเข้าทางที่เลวร้ายที่สุดจะถูกยึด¹ หลังจากที่อัลกอริทึมทำงานจนเสร็จสมบูรณ์เราจะแบ่งความซับซ้อนที่คำนวณได้ตามขนาดของอินพุตเพื่อให้ได้ผลลัพธ์สุดท้าย

¹note: จะแม่นยำเส้นทางที่เลวร้ายที่สุดที่เป็นไปได้ในทางทฤษฎี หากคุณมีเวกเตอร์ที่เพิ่มขนาดแบบไดนามิกเป็นสองเท่าในแต่ละครั้งที่ความจุของมันหมด "กรณีที่เลวร้ายที่สุด" ไม่ได้หมายความว่าจะต้องเพิ่มเป็นสองเท่าในการแทรกทุกครั้งเนื่องจากการแทรกจะถูกประมวลผลเป็นลำดับ เราได้รับอนุญาตให้ (และต้อง) ใช้สถานะที่ทราบเพื่อกำจัดกรณีที่ "แย่กว่านั้น" ทางคณิตศาสตร์ให้ได้มากที่สุดเท่าที่จะทำได้แม้ว่าจะยังไม่ทราบข้อมูลที่ป้อนเข้าก็ตาม

ความแตกต่างที่สำคัญที่สุด

ความแตกต่างที่สำคัญระหว่างการวิเคราะห์แบบไม่แสดงอาการและการวิเคราะห์แบบตัดจำหน่ายคืออดีตขึ้นอยู่กับข้อมูลเข้าในขณะที่ส่วนหลังขึ้นอยู่กับลำดับของการดำเนินการที่อัลกอริทึมจะดำเนินการ

ดังนั้น:

  • การวิเคราะห์ asymptotic ช่วยให้เรายืนยันได้ว่าความซับซ้อนของอัลกอริทึมเมื่อได้รับอินพุตกรณีที่ดีที่สุด / แย่ที่สุด / ค่าเฉลี่ยของขนาดที่เข้าใกล้ Nนั้นถูกล้อมรอบด้วยฟังก์ชัน F (N) บางฟังก์ชันโดยที่ N เป็นตัวแปร
  • การวิเคราะห์ค่าตัดจำหน่ายช่วยให้เราสามารถยืนยันได้ว่าความซับซ้อนของอัลกอริทึมเมื่อได้รับอินพุตของลักษณะที่ไม่รู้จัก แต่ขนาดที่ทราบ N นั้นไม่เลวร้ายไปกว่าค่าของฟังก์ชัน F (N) - โดยที่ N เป็นค่าที่ทราบ

7
คำตอบข้างต้นแสดงให้เห็นว่าเหตุใดผู้คนจึงไม่ควรโหวตคำตอบยาว ๆ แบบสุ่มสี่สุ่มห้าจากบุคคลที่มีอันดับสูง
btilly

2
@btilly: ความคิดเห็นของคุณจะมีประโยชน์มากกว่านี้หากนำไปปฏิบัติได้นั่นคือคุณช่วยให้ฉันทราบได้ไหมว่าคำตอบนี้มีอะไรผิดปกติและจะปรับปรุงได้อย่างไร
จอน

7
จะเริ่มต้นที่ไหน? คุณกำหนดทั้งสองคำผิดและให้รายละเอียดที่ชัดเจนมากมายซึ่งก็ผิดเช่นกัน สำหรับตัวอย่างแบบสุ่มการวิเคราะห์ค่าตัดจำหน่ายไม่ใช่กรณีที่เลวร้ายที่สุดเสมอไป O(1)อื่นที่เราไม่สามารถพูดได้ว่าผลการดำเนินงานตัดจำหน่ายของใส่ลงในกัญชาปรับขนาดแบบไดนามิก
btilly

@btilly CLRS หน้า 451 กล่าวว่า "... การวิเคราะห์แบบตัดจำหน่ายรับประกันประสิทธิภาพโดยเฉลี่ยของการดำเนินการแต่ละครั้งในกรณีที่เลวร้ายที่สุด"
Glen Selle

1
@GlenSelle Amortized analysis เป็นเทคนิคทางคณิตศาสตร์ สามารถใช้เพื่อวัตถุประสงค์ต่างๆรวมถึงประสิทธิภาพในกรณีที่เลวร้ายที่สุด อย่างไรก็ตามมันไม่ได้เป็นกรณีที่เลวร้ายที่สุด ในกรณีของคุณเห็นได้ชัดว่าถูกใช้สำหรับกรณีที่เลวร้ายที่สุด ในกรณีของการแฮชมันไม่ใช่
btilly

14

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

ในการวิเคราะห์แบบตัดจำหน่ายเวลาที่ต้องใช้ในการดำเนินการตามลำดับของการดำเนินการโครงสร้างข้อมูลจะถูกนำมาเฉลี่ยจากการดำเนินการทั้งหมดที่ดำเนินการ

เราแสดงให้เห็นถึงความซับซ้อนของการเติบโตของโปรแกรมโดยการวิเคราะห์แบบ Asymptotic - ซึ่งกำหนดขอบเขตการเติบโตของโปรแกรมด้วยฟังก์ชันและกำหนดกรณีที่เลวร้ายที่สุดดีที่สุดหรือโดยเฉลี่ยของสิ่งนั้น

แต่อาจทำให้เข้าใจผิดได้ในกรณีที่มีเพียงกรณีเดียวที่ความซับซ้อนของโปรแกรมถึงจุดสูงสุด แต่โดยทั่วไปโปรแกรมจะไม่ใช้การคำนวณมากนัก

ดังนั้นจึงสมเหตุสมผลกว่าที่จะเฉลี่ยต้นทุนตามลำดับของการดำเนินการแม้ว่าการดำเนินการเพียงครั้งเดียวอาจมีราคาแพง นี่คือการวิเคราะห์ค่าตัดจำหน่าย!

การวิเคราะห์ค่าตัดจำหน่ายเป็นอีกทางเลือกหนึ่งของเทคนิค Asymptotic ที่ใช้ในการคำนวณความซับซ้อน ช่วยให้เราคำนวณความซับซ้อนที่แท้จริงมากขึ้นในแง่ของการปฏิบัติจริงเพื่อเปรียบเทียบและตัดสินใจระหว่างสองอัลกอริทึมขึ้นไป


5

ข้อมูลอ้างอิงที่ดีที่สุดที่ฉันพบในการทำความเข้าใจเกี่ยวกับการวิเคราะห์อัลกอริทึมแบบตัดจำหน่ายอยู่ในหนังสือบทนำสู่อัลกอริทึมฉบับที่สามบทที่ 17: "การวิเคราะห์ค่าตัดจำหน่าย" ทุกอย่างมีอธิบายได้ดีกว่าสิ่งที่พบในโพสต์ Stack Overflow คุณจะพบหนังสือในห้องสมุดของมหาวิทยาลัยที่เหมาะสม


ใช่. การอ่านเกี่ยวกับ Amortized algorithm จากหนังสือที่กล่าวถึงนั้นดีกว่าและให้ความชัดเจนในที่สุด
Rajesh Mappu

2

การวิเคราะห์แบบไม่แสดงอาการเป็นประจำจะพิจารณาถึงประสิทธิภาพของการดำเนินการแต่ละอย่างที่ไม่มีอาการซึ่งเป็นหน้าที่ของขนาดของปัญหา สัญกรณ์ O () คือสิ่งที่บ่งบอกถึงการวิเคราะห์แบบไม่แสดงอาการ

วิเคราะห์ตัดจำหน่าย (ซึ่งเป็นการวิเคราะห์ asymptotic) มีลักษณะที่รวมประสิทธิภาพของการดำเนินการหลายคนในdatastructure ที่ใช้ร่วมกัน

ความแตกต่างคือการวิเคราะห์ค่าตัดจำหน่ายโดยทั่วไปพิสูจน์ได้ว่าการคำนวณทั้งหมดที่จำเป็นสำหรับการดำเนินการ M มีการรับประกันประสิทธิภาพที่ดีกว่า M เท่าในกรณีที่เลวร้ายที่สุดสำหรับการดำเนินการส่วนบุคคล

ตัวอย่างเช่นการดำเนินการส่วนบุคคลบนต้นไม้สเปรย์ขนาด N อาจใช้เวลาถึง O (N) อย่างไรก็ตามลำดับของการดำเนินการ M บนต้นไม้ที่มีขนาด N ถูกล้อมรอบด้วยเวลา O (M (1 + log N) + N log N) ซึ่งมีค่าประมาณ O (log N) ต่อการดำเนินการ อย่างไรก็ตามโปรดทราบว่าการวิเคราะห์แบบตัดจำหน่ายมีความเข้มงวดกว่าการวิเคราะห์แบบ "กรณีเฉลี่ย" มากซึ่งเป็นการพิสูจน์ว่าลำดับการดำเนินการใด ๆ ที่เป็นไปได้จะเป็นไปตามกรณีที่เลวร้ายที่สุด


1

การวิเคราะห์ค่าตัดจำหน่ายเกี่ยวข้องกับต้นทุนรวมในการดำเนินการตามปกติจำนวนหนึ่งและผลประโยชน์ที่จะได้รับในนั้น ตัวอย่างเช่นการค้นหาอาร์เรย์ของ n รายการที่ไม่เรียงลำดับสำหรับการจับคู่ครั้งเดียวอาจใช้เวลาเปรียบเทียบถึง n และด้วยเหตุนี้จึงมีความซับซ้อน o (n) อย่างไรก็ตามหากเรารู้ว่าอาร์เรย์เดียวกันจะถูกค้นหาสำหรับรายการ m การทำซ้ำงานทั้งหมดจะมีความซับซ้อน O (m * n) อย่างไรก็ตามหากเราจัดเรียงอาร์เรย์ล่วงหน้าค่าใช้จ่ายคือ O (n log (n)) และการค้นหาต่อเนื่องจะใช้เพียง O (log (n)) สำหรับอาร์เรย์ที่เรียงลำดับ ดังนั้นต้นทุนตัดจำหน่ายทั้งหมดสำหรับองค์ประกอบ m ที่ใช้แนวทางนี้คือ O (n * log (n) + m * log (n)) ถ้า m> = n จะเท่ากับ O (n log (n)) โดยการเรียงลำดับล่วงหน้าเทียบกับ O (n ^ 2) สำหรับการไม่เรียงลำดับ ดังนั้นต้นทุนการตัดจำหน่ายจึงถูกกว่า

พูดง่ายๆโดยการใช้จ่ายเพิ่มเล็กน้อยในช่วงต้นเราสามารถประหยัดได้มากในภายหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.