เราจะรู้ได้อย่างไรว่าจะใช้การวิเคราะห์ความซับซ้อนของเวลาแบบใด


90

ในชั้นเรียนอัลกอริทึมเบื้องต้นส่วนใหญ่จะมีการแนะนำสัญลักษณ์เช่น (Big O) และและนักเรียนมักจะเรียนรู้ที่จะใช้สิ่งเหล่านี้เพื่อค้นหาความซับซ้อนของเวลาΘOΘ

แต่มีสัญลักษณ์อื่น ๆ เช่น ,และ\มีสถานการณ์เฉพาะใดบ้างที่จะให้สัญกรณ์หนึ่งเป็นที่นิยมมากกว่าอีกรูปแบบหนึ่ง?โอห์มโอห์มoΩω


2
ไม่มากของมันที่นิยมเป็นบังคับ ...
vzn

คำตอบ:


76

คุณกำลังหมายถึงสัญกรณ์กุ๊บ พวกเขาไม่ได้เป็นสัญลักษณ์ที่แตกต่างกันสำหรับสิ่งเดียวกัน แต่มีความหมายที่แตกต่างกันโดยสิ้นเชิง อันไหนที่ "ดีกว่า" ขึ้นอยู่กับข้อความที่ต้องการทั้งหมด

f g f o ( g ) <fO(g)หมายความว่าเติบโตเร็วที่สุดเท่าที่ , asymptotically และขึ้นอยู่กับปัจจัยคงที่; คิดว่ามันเป็น\เป็นรูปแบบที่เข้มงวดเช่น<fgfo(g)<

กรัมω โอห์ม( กรัม)fΩ(g)มีความหมายสมมาตร:เติบโตอย่างน้อยให้เร็วที่สุดเท่ากรัมเป็นลูกพี่ลูกน้องที่เข้มงวดกว่า คุณจะเห็นว่าเทียบเท่ากับ(ฉ)fgωfΩ(g)gO(f)

กรัมO ( กรัม) โอห์ม( กรัม) f ~ กรัมΘ OfΘ(g)หมายความว่าโตเร็วเท่ากับ ; อย่างเป็นทางการ(g) (asymptotic equality) เป็นรูปแบบที่แข็งแกร่ง เรามักจะหมายถึงเมื่อเราใช้{O}fgfO(g)Ω(g)fgΘO

สังเกตว่าและพี่น้องของมันเป็นคลาสฟังก์ชันได้อย่างไร มันเป็นสิ่งสำคัญที่จะต้องตระหนักถึงสิ่งนี้และคำจำกัดความที่แม่นยำของพวกเขา - ซึ่งอาจแตกต่างกันไปขึ้นอยู่กับว่าใครเป็นคนพูด - เมื่อทำ "arithmetics" กับพวกเขาO(g)

เมื่อพิสูจน์สิ่งต่าง ๆ ระวังที่จะทำงานกับคำจำกัดความที่แม่นยำของคุณ มีคำจำกัดความมากมายสำหรับสัญลักษณ์รถม้าสี่ล้อ (ทั้งหมดที่มีสัญชาตญาณพื้นฐานเดียวกัน) ซึ่งบางส่วนนั้นเทียบเท่ากับบางชุดในฟังก์ชั่น แต่ไม่ใช่ในสัญลักษณ์อื่น ๆ

การอ่านที่แนะนำ:

หากคุณสนใจที่จะใช้สัญกรณ์ Landau ในลักษณะที่เข้มงวดและเข้มงวดคุณอาจสนใจงานล่าสุดของ Rutanen et al [1] พวกเขากำหนดเกณฑ์ที่จำเป็นและเพียงพอสำหรับการแสดงสัญลักษณ์แบบอะซิมโทติคตามที่เราใช้ในอัลกอริทึมแสดงให้เห็นว่าคำจำกัดความทั่วไปไม่สามารถตอบสนองพวกเขาได้และให้คำจำกัดความที่สามารถใช้งานได้


  1. นิยามทั่วไปของ O-สัญกรณ์สำหรับการวิเคราะห์อัลกอริทึมโดย K. Rutanen และคณะ (2015)

5
ฉันแค่ต้องการชี้ให้เห็นว่าถึงแม้ว่าทำหน้าที่เหมือนและทำหน้าที่เหมือนแต่ก็มีความแตกต่างกัน มันไม่ยากที่จะหาฟังก์ชั่นและดังกล่าวว่าและ(g) โอห์มกรัมO ( กรัม) โอห์ม( กรัม)OΩgffO(g)fΩ(g)
Zach Langley

1
+1 สำหรับการกล่าวถึงคลาสฟังก์ชั่น สิ่งต่าง ๆ เช่นและปรากฏขึ้นทุกหนทุกแห่งในเอกสารและหนังสือซึ่งอาจสร้างความสับสนให้กับผู้ที่ต้องเผชิญกับสัญลักษณ์เหล่านี้เป็นครั้งแรก Ω ( 2 n )o(1)Ω(2n)
Janoma

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

42

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)Kg(n)KT(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)Kh(n)KKT(n)h(n)

ข้อควรพิจารณาเพิ่มเติม

"น้อย"และใช้น้อยกว่ามากในการวิเคราะห์ความซับซ้อน ลิตเติ้ลแข็งแรงกว่าใหญ่ ; เมื่อแสดงถึงการเติบโตที่ไม่เร็วขึ้นบ่งชี้ว่าการเติบโตนั้นช้ากว่าอย่างเคร่งครัด ในทางกลับกันหมายถึงการเติบโตที่เร็วขึ้นอย่างเคร่งครัดω o O O o ωoωoOOoω

ฉันไม่เป็นทางการเล็กน้อยในการสนทนาด้านบน Wikipediaมีคำจำกัดความที่เป็นรูปแบบและวิธีการทางคณิตศาสตร์ที่มากขึ้น

โปรดทราบว่าการใช้เครื่องหมายเท่ากับในและสิ่งที่คล้ายกันคือเรียกชื่อผิด พูดอย่างเคร่งครัดเป็นชุดของฟังก์ชั่นของตัวแปรและเราควรจะเขียน(ฉ)T(n)=O(f(n))O(f(n))nTO(f)

ตัวอย่าง: อัลกอริทึมการเรียงลำดับบางอย่าง

เนื่องจากที่นี่ค่อนข้างแห้งขอผมยกตัวอย่าง ขั้นตอนวิธีการเรียงลำดับส่วนใหญ่จะมีกรณีที่เลวร้ายกำลังสองเวลาทำงานเช่นสำหรับการป้อนข้อมูลของขนาดเวลาการทำงานของอัลกอริทึมคือ2) ยกตัวอย่างเช่นการจัดเรียงตัวเลือกมีเวลาทำงานเพราะการเลือก TH องค์ประกอบต้องเปรียบเทียบสำหรับจำนวนเปรียบเทียบ ความเป็นจริงในจำนวนของการเปรียบเทียบอยู่เสมอว่าซึ่งเติบโตเป็น 2 ดังนั้นเราจึงสามารถจะแม่นยำมากขึ้นเกี่ยวกับความซับซ้อนเวลาของการจัดเรียงตัวเลือก: มันเป็น2)nO(n2)O(n2)knkn(n1)/2n(n1)/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))

มีผลลัพธ์ทั่วไปเกี่ยวกับความซับซ้อนของการเรียงลำดับอัลกอริทึมในการตั้งค่าทั่วไป สมมติว่าอัลกอริทึมการเรียงลำดับสามารถเปรียบเทียบสององค์ประกอบต่อครั้งพร้อมกับผลลัพธ์ใช่หรือไม่ (ทั้งหรือ ) จากนั้นจะเห็นได้ชัดว่าเวลาการทำงานของอัลกอริธึมการเรียงลำดับใด ๆ คือ (โดยที่คือจำนวนองค์ประกอบที่จะเรียงลำดับ) เนื่องจากอัลกอริทึมต้องเปรียบเทียบทุกองค์ประกอบอย่างน้อยหนึ่งครั้งเพื่อให้รู้ว่าเหมาะสม ขอบเขตที่ต่ำกว่านี้สามารถพบได้ตัวอย่างเช่นหากอินพุตได้รับการจัดเรียงแล้วและอัลกอริทึมจะเปรียบเทียบแต่ละองค์ประกอบกับองค์ประกอบถัดไปและทำให้เป็นระเบียบ (นั่นคือการเปรียบเทียบ ) สิ่งที่ชัดเจนน้อยกว่าก็คือจำเป็นต้องใช้เวลาสูงสุดในการทำงานxyx>yΩ(n)nn1Ω(nlg(n))(n)) เป็นไปได้ว่าบางครั้งอัลกอริทึมจะทำการเปรียบเทียบน้อยลง แต่จะต้องมีค่าคงที่เช่นนั้นสำหรับขนาดอินพุตใด ๆมีอย่างน้อยหนึ่งอินพุตที่อัลกอริทึมทำมากกว่าเปรียบเทียบ แนวคิดของการพิสูจน์คือการสร้างแผนภูมิการตัดสินใจของอัลกอริทึมนั่นคือการติดตามการตัดสินใจของอัลกอริทึมที่ได้จากผลลัพธ์ของการเปรียบเทียบแต่ละครั้ง เนื่องจากการเปรียบเทียบแต่ละรายการส่งคืนผลลัพธ์ที่ใช่หรือไม่โครงสร้างการตัดสินใจจึงเป็นแผนภูมิแบบทวิภาค มีการเรียงสับเปลี่ยนที่เป็นไปได้ของอินพุตและอัลกอริทึมจำเป็นต้องแยกแยะระหว่างทั้งหมดดังนั้นขนาดของแผนภูมิการตัดสินใจคือKnKnlg(n)n!n!. เนื่องจากต้นไม้เป็นต้นไม้ไบนารีมันใช้ความลึกของเพื่อให้พอดีกับโหนดเหล่านี้ทั้งหมด ความลึกเป็นจำนวนสูงสุดของการตัดสินใจว่าวิธีจะใช้เวลาดังนั้นการเรียกใช้อัลกอริทึมที่เกี่ยวข้องอย่างน้อยนี้เปรียบเทียบหลายครั้งการทำงานสูงสุด(n))Θ(lg(n!))=Θ(nlg(n))Ω(nlg(n))

¹ หรือการใช้ทรัพยากรอื่น ๆ เช่นพื้นที่หน่วยความจำ ในคำตอบนี้ฉันพิจารณาใช้เวลาเท่านั้น


1
"อย่างไรก็ตามกรณีที่ดีที่สุดของ quicksort (เมื่ออินพุตถูกจัดเรียงแล้ว) คือ linear" นี่เป็นกรณีที่แย่ที่สุด !!
user5507

@ user5507: จริง ๆ แล้วมันขึ้นอยู่กับกลยุทธ์เดือย หากองค์ประกอบแรก (หรือสุดท้าย) ถูกเลือกเป็น pivot แสดงว่าคุณถูกต้อง แต่ถ้าคุณเลือกองค์ประกอบกลางหรือค่ามัธยฐานของค่ากลาง, ค่ากลาง, ค่าสุดท้ายการเรียงลำดับนั้นเป็นกรณีที่ดีที่สุด
chirlu

"o และ little ตัวเล็ก ๆ น้อย ๆ ถูกนำมาใช้บ่อยครั้งกว่าในการวิเคราะห์ความซับซ้อน" นี่ไม่เป็นความจริงในการวิเคราะห์ความซับซ้อนของอวกาศ ในการวิเคราะห์ความซับซ้อนของเวลาคุณมักใช้ o และωเมื่อคุณนับการดำเนินการเฉพาะ (การเปรียบเทียบการค้นหาดิสก์แคชที่หายไปสิ่งที่คุณมี) แต่เนื่องจากคุณสามารถรอและซื้อคอมพิวเตอร์ที่เร็วกว่าได้เสมอ "ระยะเวลาติดผนัง" จึงเป็น "ถึงปัจจัยคงที่" เสมอดังนั้น big-O จึงเป็นเรื่องธรรมดามาก ในการวิเคราะห์อวกาศมักมีขอบเขตล่างที่ยากเนื่องจากทฤษฎีข้อมูลดังนั้นมันเป็นเรื่องธรรมดามากที่จะเห็นขนาดรายงานว่า "f (n) + o (f (n)) บิต" โดยที่ f (n) เป็นขอบเขตล่าง
นามแฝง

ในขณะที่ฉันคิดว่ามัน: ถ้า f (n) เป็นขอบเขตทางทฤษฎีที่ลดลงตามขนาดของโครงสร้างข้อมูลบางส่วนจากนั้นหนึ่งที่ใช้ f (n) + O (1) (ค่าใช้จ่ายคงที่) เรียกว่า "implicit" หนึ่งที่ใช้ f (n) + O (f (n)) (ค่าคงที่ของค่าคงที่สัมพัทธ์) เรียกว่า "compact" และอีกอันหนึ่งที่ใช้ f (n) + o (f (n)) (ค่าใช้จ่ายสัมพัทธ์กลายเป็นสิ่งสำคัญในที่สุด) เรียกว่า "รวบรัด " คำศัพท์ที่ดีที่ควรรู้หากคุณจำเป็นต้องทำงานในพื้นที่นั้น
นามแฝง

17

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


3
“โดยปกติ”? พวกเขาสามารถนำไปใช้อย่างอื่นได้หรือไม่
svick

1
@svick, ใช่เช่นซึ่งไม่ใช่คำสั่งที่มีขอบเขต ตามคำสั่งบนผูกผมหมายถึงบางสิ่งบางอย่างเช่นซึ่งเป็นการแสดงออกถึงบนที่ถูกผูกไว้บนฉP=DTime(nO(1))f=O(g)f
Kaveh

4
อันที่จริง Kaveh นั่นคือคำสั่งที่ถูกผูกไว้ ผู้แปลภาษาอังกฤษของ " " คือ "P คือชุดของปัญหาที่สามารถแก้ไขได้โดยใช้ AT จำนวนมากที่สุดของการดำเนินการพหุนาม" หากคุณไม่ได้หมายความว่า "ในที่สุด" คุณควรที่จะเขียน(1)}) (ข้อความทั้งสองถูกต้องแน่นอน)P=DTime(nO(1))P=DTime(nΘ(1))
JeffE

@JeffE ฉันคิดว่ามันเป็นความเท่าเทียมกันระหว่างชุดฟังก์ชั่น แต่คุณพูดถูกคุณสามารถคิดได้ว่ามันเป็นขอบเขตบนในแง่ทั่วไป
Kaveh

@JeffE จริงตั้งแต่แต่n)) D T ฉันM E ( Θ ( n log n ) ) P D T ฉันM E ( Θ ( n log n ) ) D T ฉันM E ( n Θ ( 1 ) ) = PDTIME(nΘ(1))DTIME(Θ(nlogn))PDTIME(Θ(nlogn))DTIME(nΘ(1))=
David Richerby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.