Big O: ขอบบน
“ บิ๊กโอ” ( ) เป็นสิ่งที่พบได้บ่อยที่สุด เมื่อคุณวิเคราะห์ความซับซ้อนของอัลกอริทึมส่วนใหญ่สิ่งที่สำคัญคือการมีขอบเขตบนที่ว่าเวลารันไทม์จะเติบโตเร็วแค่ไหนเมื่อขนาดของอินพุตเพิ่มขึ้น โดยพื้นฐานแล้วเราต้องการทราบว่าการรันอัลกอริทึมจะไม่“ ใช้เวลานานเกินไป” เราไม่สามารถแสดงสิ่งนี้ในหน่วยเวลาตามจริง (วินาที) เพราะนั่นจะขึ้นอยู่กับการใช้งานที่แม่นยำ (วิธีที่โปรแกรมเขียนไว้คอมไพเลอร์ดีแค่ไหนหน่วยประมวลผลของเครื่องคือเท่าใด ... ) ดังนั้นเราประเมินสิ่งที่ไม่ขึ้นอยู่กับรายละเอียดดังกล่าวซึ่งใช้เวลานานกว่าในการเรียกใช้อัลกอริทึมเมื่อเราป้อนข้อมูลให้ใหญ่ขึ้น และเราใส่ใจเป็นหลักเมื่อเรามั่นใจได้ว่าโปรแกรมจะเสร็จสิ้นดังนั้นเรามักจะต้องการทราบว่าจะใช้เวลาหรือน้อยกว่านั้นO
จะบอกว่าอัลกอริทึมมีเวลาทำงานของสำหรับขนาดอินพุตหมายความว่ามีค่าคงที่บางอย่างเช่นอัลกอริทึมเสร็จสมบูรณ์ในขั้นตอนมากที่สุดขั้นตอนคือเวลาทำงาน ของอัลกอริธึมเติบโตเร็วที่สุดเท่า (สูงถึงปัจจัยการปรับสเกล) การสังเกตเวลาทำงานของอัลกอริทึมสำหรับขนาดอินพุต ,อย่างไม่เป็นทางการหมายความว่าขึ้นอยู่กับปัจจัยการปรับขนาดn K KO(f(n))nKf T ( n ) n O ( n ) T ( n ) ≤ f ( n )Kf(n)fT(n)nO(n)T(n)≤f(n)
ขอบเขตล่าง
บางครั้งมันมีประโยชน์ที่จะมีข้อมูลมากกว่าขอบเขตบน คือการสนทนาของ : มันเป็นการแสดงออกว่าฟังก์ชั่นเติบโตอย่างน้อยเร็วกว่าอีกฟังก์ชันหนึ่ง หมายถึงสำหรับค่าคงที่บางส่วนหรือใส่อย่างไม่เป็นทางการขึ้น ถึงปัจจัยการปรับขนาดO T ( n ) = Ω ( g ( n ) ) T ( N ) ≥ K ′ g ( n ) K ′ T ( n ) ≥ g ( n )ΩOT(n)=Ω(g(n))T(N)≥K′g(n)K′T(n)≥g(n)
เมื่อเวลาในการทำงานของอัลกอริธึมสามารถระบุได้อย่างแม่นยำรวมและ : มันเป็นการแสดงออกถึงอัตราการเติบโตของฟังก์ชั่นที่เป็นที่รู้จักจนถึงระดับการขยาย หมายความว่าสำหรับค่าคงที่บางและK'การพูดอย่างไม่เป็นทางการถึงปัจจัยการปรับขนาดO Ω T ( n ) = Θ ( h ( n ) ) K h ( n ) ≥ T ( n ) ≥ K ′ h ( n ) K K ′ T ( n ) ≈ h ( n )ΘOΩT(n)=Θ(h(n))Kh(n)≥T(n)≥K′h(n)KK′T(n)≈h(n)
ข้อควรพิจารณาเพิ่มเติม
"น้อย"และใช้น้อยกว่ามากในการวิเคราะห์ความซับซ้อน ลิตเติ้ลแข็งแรงกว่าใหญ่ ; เมื่อแสดงถึงการเติบโตที่ไม่เร็วขึ้นบ่งชี้ว่าการเติบโตนั้นช้ากว่าอย่างเคร่งครัด ในทางกลับกันหมายถึงการเติบโตที่เร็วขึ้นอย่างเคร่งครัดω o O O o ωoωoOOoω
ฉันไม่เป็นทางการเล็กน้อยในการสนทนาด้านบน Wikipediaมีคำจำกัดความที่เป็นรูปแบบและวิธีการทางคณิตศาสตร์ที่มากขึ้น
โปรดทราบว่าการใช้เครื่องหมายเท่ากับในและสิ่งที่คล้ายกันคือเรียกชื่อผิด พูดอย่างเคร่งครัดเป็นชุดของฟังก์ชั่นของตัวแปรและเราควรจะเขียน(ฉ)T(n)=O(f(n))O(f(n))nT∈O(f)
ตัวอย่าง: อัลกอริทึมการเรียงลำดับบางอย่าง
เนื่องจากที่นี่ค่อนข้างแห้งขอผมยกตัวอย่าง ขั้นตอนวิธีการเรียงลำดับส่วนใหญ่จะมีกรณีที่เลวร้ายกำลังสองเวลาทำงานเช่นสำหรับการป้อนข้อมูลของขนาดเวลาการทำงานของอัลกอริทึมคือ2) ยกตัวอย่างเช่นการจัดเรียงตัวเลือกมีเวลาทำงานเพราะการเลือก TH องค์ประกอบต้องเปรียบเทียบสำหรับจำนวนเปรียบเทียบ ความเป็นจริงในจำนวนของการเปรียบเทียบอยู่เสมอว่าซึ่งเติบโตเป็น 2 ดังนั้นเราจึงสามารถจะแม่นยำมากขึ้นเกี่ยวกับความซับซ้อนเวลาของการจัดเรียงตัวเลือก: มันเป็น2)nO(n2)O(n2)kn−kn(n−1)/2n(n−1)/2n2Θ(n2)
ตอนนี้ใช้เวลารวมการจัดเรียง การเรียงลำดับผสานยังเป็นกำลังสอง ( ) นี่เป็นเรื่องจริง แต่ไม่แม่นยำมาก การเรียงลำดับที่จริงแล้วมีเวลาทำงานของในกรณีที่เลวร้ายที่สุด เช่นเดียวกับการเลือกการเรียงลำดับการเรียงลำดับของการผสานนั้นเป็นอิสระจากรูปร่างของอินพุตและเวลาในการทำงานของมันคือถึงค่าคูณคูณคงที่นั่นคือ(n))O(n2)O(nlg(n))nlg(n)Θ(nlg(n))
ถัดไปพิจารณาquicksort Quicksort ซับซ้อนกว่า เป็นอย่างแน่นอน นอกจากนี้กรณีที่เลวร้ายที่สุดของ quicksort เป็นกำลังสองคือกรณีที่เลวร้ายที่สุดคือ2) อย่างไรก็ตามกรณีที่ดีที่สุดของ quicksort (เมื่อมีการป้อนข้อมูลจะถูกจัดเรียงแล้ว) เป็นเส้นตรง: ดีที่สุดที่เราสามารถพูดได้ผูกพันลดการ quicksort ในทั่วไป(n) ฉันจะไม่ทำซ้ำหลักฐานนี่ แต่เฉลี่ยความซับซ้อนของ quicksort (ค่าเฉลี่ยเอาไปพีชคณิตเป็นไปได้ของการป้อนข้อมูล) เป็น(n))O(n2)Θ(n2)Ω(n)Θ(nlg(n))
มีผลลัพธ์ทั่วไปเกี่ยวกับความซับซ้อนของการเรียงลำดับอัลกอริทึมในการตั้งค่าทั่วไป สมมติว่าอัลกอริทึมการเรียงลำดับสามารถเปรียบเทียบสององค์ประกอบต่อครั้งพร้อมกับผลลัพธ์ใช่หรือไม่ (ทั้งหรือ ) จากนั้นจะเห็นได้ชัดว่าเวลาการทำงานของอัลกอริธึมการเรียงลำดับใด ๆ คือ (โดยที่คือจำนวนองค์ประกอบที่จะเรียงลำดับ) เนื่องจากอัลกอริทึมต้องเปรียบเทียบทุกองค์ประกอบอย่างน้อยหนึ่งครั้งเพื่อให้รู้ว่าเหมาะสม ขอบเขตที่ต่ำกว่านี้สามารถพบได้ตัวอย่างเช่นหากอินพุตได้รับการจัดเรียงแล้วและอัลกอริทึมจะเปรียบเทียบแต่ละองค์ประกอบกับองค์ประกอบถัดไปและทำให้เป็นระเบียบ (นั่นคือการเปรียบเทียบ ) สิ่งที่ชัดเจนน้อยกว่าก็คือจำเป็นต้องใช้เวลาสูงสุดในการทำงานx≤yx>yΩ(n)nn−1Ω(nlg(n))(n)) เป็นไปได้ว่าบางครั้งอัลกอริทึมจะทำการเปรียบเทียบน้อยลง แต่จะต้องมีค่าคงที่เช่นนั้นสำหรับขนาดอินพุตใด ๆมีอย่างน้อยหนึ่งอินพุตที่อัลกอริทึมทำมากกว่าเปรียบเทียบ แนวคิดของการพิสูจน์คือการสร้างแผนภูมิการตัดสินใจของอัลกอริทึมนั่นคือการติดตามการตัดสินใจของอัลกอริทึมที่ได้จากผลลัพธ์ของการเปรียบเทียบแต่ละครั้ง เนื่องจากการเปรียบเทียบแต่ละรายการส่งคืนผลลัพธ์ที่ใช่หรือไม่โครงสร้างการตัดสินใจจึงเป็นแผนภูมิแบบทวิภาค มีการเรียงสับเปลี่ยนที่เป็นไปได้ของอินพุตและอัลกอริทึมจำเป็นต้องแยกแยะระหว่างทั้งหมดดังนั้นขนาดของแผนภูมิการตัดสินใจคือKnKnlg(n)n!n!. เนื่องจากต้นไม้เป็นต้นไม้ไบนารีมันใช้ความลึกของเพื่อให้พอดีกับโหนดเหล่านี้ทั้งหมด ความลึกเป็นจำนวนสูงสุดของการตัดสินใจว่าวิธีจะใช้เวลาดังนั้นการเรียกใช้อัลกอริทึมที่เกี่ยวข้องอย่างน้อยนี้เปรียบเทียบหลายครั้งการทำงานสูงสุด(n))Θ(lg(n!))=Θ(nlg(n))Ω(nlg(n))
¹ หรือการใช้ทรัพยากรอื่น ๆ เช่นพื้นที่หน่วยความจำ ในคำตอบนี้ฉันพิจารณาใช้เวลาเท่านั้น