การวิเคราะห์ค่าตัดจำหน่าย? (การรับประกันประสิทธิภาพที่แย่ที่สุด)


13

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

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

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

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

คำตอบ:


14

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

การสังเกตที่สำคัญที่คุณต้องทำคือการดำเนินการที่มีราคาแพงไม่สามารถเกิดขึ้นได้ตลอดเวลา

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

เพื่อตรวจสอบรันไทม์สำหรับการแทรกnรายการคุณสามารถคูณnกับการดำเนินการที่แพงที่สุดซึ่งส่งผลให้เกิดพฤติกรรมรันไทม์โดยรวมของO(n)O(n^2)

อย่างไรก็ตามนี่ไม่ถูกต้องเนื่องจากการปรับขนาดไม่สามารถเกิดขึ้นได้บ่อยนัก

เมื่อพูดถึงเรื่องเงินคุณจะต้องตัดค่าใช้จ่ายเมื่อคุณชำระหนี้ด้วยการจ่ายเงินจำนวนเล็กน้อยเมื่อเวลาผ่านไป

เราสามารถใช้โมเดลนี้เพื่อคิดเกี่ยวกับอัลกอริทึมได้เช่นกัน เราเพียงแค่แทนที่ "เวลา" ด้วย "เงิน" เพื่อหลีกเลี่ยงการทำแผนที่จิต

เมื่ออาร์เรย์เต็มไปตามความยาวnเราสามารถเพิ่มขนาดเป็นสองเท่าได้ เราจำเป็นต้องดำเนินการดังต่อไปนี้:

  • จัดสรร2nหน่วยความจำ
  • คัดลอกnรายการ

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

สิ่งนี้มีความหมายดังนี้

  • การแทรกnรายการถัดไปจะครอบคลุมค่าใช้จ่ายในการปรับขนาดและคัดลอก (เราnใช้ช่องและช่องที่nไม่ได้ใช้แล้ว ')

ตอนนี้เราสามารถคิดได้ว่าการแทรกทุกครั้งจะต้องจ่ายเป็นจำนวนเท่าใด:

  • ใบมีด
  • ค่าใช้จ่ายในการจัดสรรหนึ่งหน่วยความจำ
  • ค่าใช้จ่ายในการย้ายไปยังหน่วยความจำที่จัดสรรใหม่

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

เราแจกจ่ายค่าใช้จ่ายของnองค์ประกอบเก่าของเราไปยังองค์ประกอบใหม่ (ยังไม่ได้ใส่) nองค์ประกอบใหม่:

  • ค่าใช้จ่ายในการจัดสรรหนึ่งหน่วยความจำ
  • ค่าใช้จ่ายในการย้ายไปยังหน่วยความจำที่จัดสรรใหม่

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

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

ดังนั้นการแทรกnองค์ประกอบต้องใช้O(n)เวลา

เทคนิคอื่น ๆ สำหรับการวิเคราะห์ตัดจำหน่ายจะอธิบายที่นี่


1

ประการแรก: มันเป็นเทคนิคสำหรับการวิเคราะห์รันไทม์ของโปรแกรมไม่ใช่เทคนิคการใช้งานสำหรับอัลกอริทึม

ตัวอย่างที่กล่าวถึงในรายการของคุณเป็นสิ่งที่ดี: การผนวกรายการเดียวกับโครงสร้างข้อมูลที่สำรองไว้โดยอาร์เรย์ สำหรับการดำเนินการผนวกทุกครั้งกรณีที่แย่ที่สุดคือต้องคัดลอกรายการที่มีอยู่ทั้งหมด การวิเคราะห์แบบนั้นเป็นสิ่งที่มองโลกในแง่ร้ายเกินไปเนื่องจากคุณไม่จำเป็นต้องทำเช่นนั้นหากคุณใช้กลยุทธ์การปรับขนาดสติ (คูณขนาดด้วย x> 1.0) การวิเคราะห์บอกว่าคุณมีขอบเขต O (n ^ 2) - O (n) ต่อรายการคูณ n รายการ - ในขณะที่รันไทม์ที่แท้จริงคือเพียง O (n)

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

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