เหตุผลสำหรับการละเลยปัจจัยคงที่ใน Big O


20

หลายครั้งถ้าความซับซ้อนมีค่าคงที่เช่น 3n เราจะละเลยค่าคงที่นี้และพูดว่า O (n) ไม่ใช่ O (3n) ฉันไม่สามารถเข้าใจได้ว่าเราจะเพิกเฉยต่อการเปลี่ยนแปลงทั้งสามนี้ได้อย่างไร บางสิ่งบางอย่างเปลี่ยนแปลงอย่างรวดเร็ว 3 เท่ามากกว่าสิ่งอื่น! เหตุใดเราจึงละเลยข้อเท็จจริงนี้


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

คำตอบ:


22

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

ตัวอย่างเช่นเราบอกว่าฟังก์ชั่นที่ใช้ก้าวคือเพราะพูดอย่างคร่าว ๆ สำหรับอินพุตที่มีขนาดใหญ่พอการเพิ่มขนาดอินพุตเป็นสองเท่าจะไม่เพิ่มจำนวนของขั้นตอนที่เพิ่มขึ้นเป็นสองเท่า ในทำนองเดียวกันหมายความว่าการเพิ่มขนาดอินพุตเป็นสองเท่าจะเพิ่มจำนวนของขั้นตอนเป็นสองเท่าและหมายความว่าการเพิ่มขนาดอินพุตเป็นสองเท่าจะเพิ่มจำนวนขั้นตอนมากขึ้นอย่างต่อเนื่อง3nO(n)O(n2)O(logn)

มันเป็นเครื่องมือสำหรับบอกว่าอัลกอริธึมใดที่ปรับขนาดได้ดีกว่า


11

ก่อนอื่นตามที่คำตอบอื่น ๆ ได้อธิบายไว้แล้วหรือใช้คำพูดฟังก์ชั่นคือถ้าหากเป็นเท่านั้น หมายถึงว่ามีอยู่จุดและปัจจัยเช่นว่าทุก ,3n ตอนนี้รับ : สำหรับทุก ,ดังนั้น(n) หลักฐานของการสนทนานั้นคล้ายกันO ( 3 n ) O ( n ) f = O ( 3 n ) N C 3 n N f ( n ) C 33 n C 1 = 3 C 3 n N f ( n ) C 1n fO(3n)=O(n)O(3n)O(n)f=O(3n)NC3nNf(n)C33nC1=3C3nNf(n)C1nf=O(n)

ตอนนี้ถึงสาเหตุที่เป็นเครื่องมือที่เหมาะสม สังเกตว่าเมื่อเราวัดความซับซ้อนของอัลกอริทึมเราจะไม่ให้หน่วย เราไม่นับวินาทีหรือคำสั่งเครื่อง: เรานับขั้นตอนเบื้องต้นที่ไม่ระบุจำนวนที่แต่ละอันใช้เวลา จำกัด เราทำอย่างนั้นเพราะการดำเนินการขั้นตอนวิธีการเดียวกันบนเครื่องที่แตกต่างกันจะเปลี่ยนเวลาที่จำเป็นต่อการเรียนการสอน - คูณความถี่สัญญาณนาฬิกาโดยและเวลาดำเนินการไปจากเพื่อ 3 หากเราใช้อัลกอริทึมเดียวกันในภาษาที่แตกต่างกันหรือในระบบที่แตกต่างกันเวลาที่ใช้ในแต่ละขั้นตอนขั้นต้นอาจแตกต่างกัน แต่อีกครั้งนั่นคือรายละเอียดมากเกินไป: เราแทบจะไม่สนใจความแตกต่างดังกล่าวf ( n ) f ( n ) / 33f(n)f(n)/3

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


o(g)limng(n)T(n)=1

2
@ vonbrand Sedgewick พูดอย่างนั้นจริงๆเหรอ? คำจำกัดความตามปกติของคือ (เช่นเศษส่วนวิธีอื่น ๆ รอบ ๆ และ ขีด จำกัด คือศูนย์ไม่ใช่ความเป็นเอกภาพ)ลิมn →การ ( T ( n ) /กรัม( n ) ) = 0T(n)o(g(n)limn(T(n)/g(n))=0
เดวิด Richerby

3

เรียกคืนคำจำกัดความของ Big-O:

c > 0 f ( n ) c g ( n ) nf(n)O(g(n)) IFF มีอยู่เช่นที่สำหรับทุกnc>0f(n)cg(n)n

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


2
นี่เป็นคำอธิบายที่ดีของ Big-O แต่ไม่มีคำอธิบายว่าทำไมเราจึงใช้คำจำกัดความนี้
jmite

อย่างที่ฉันเขียน - จุดประสงค์คือทำให้ชีวิตของเราง่ายขึ้น ไม่ว่าจะเป็นเพราะเราไม่ทราบค่าใช้จ่ายที่แน่นอนของการปฏิบัติการปรมาณูหรือเพราะเราสนใจสัญกรณ์เชิงซีมโทติค ฉันไม่พบว่าทำไมคำถามคณิตศาสตร์ที่น่าสนใจ แต่เป็นคำถามเชิงปรัชญา ในทางเทคนิคเราสามารถทำได้โดยไม่มีมัน มันจะทำให้สิ่งที่น่าเกลียดจริงๆและยากที่จะทำงานด้วย
Shaull

3

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

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

ข้อสังเกตแรกคือว่าคำถามของคุณไม่ได้ระบุไว้อย่างถูกต้อง เมื่อคุณละเลยค่าคงที่ในมี "การเปลี่ยนแปลงสามเท่า" แต่ทั้งคู่แตกต่างกันในอัตราเดียวกันและคุณไม่สามารถยืนยันได้ว่า "[หนึ่ง] สิ่งต่าง ๆ เปลี่ยนแปลงเร็วกว่า 3 เท่า"3 n33n

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

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

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

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

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

อย่างไรก็ตามมีเพียงโปรแกรมเมอร์ที่ไร้เดียงสาเท่านั้นที่ต้องพึ่งพาความซับซ้อนแบบซีมโทติคเพื่อเลือกอัลกอริทึม มีเกณฑ์อื่น ๆ อีกมากมายรวมถึงค่าคงที่ที่บอกเล่าและค่าใช้จ่ายจริงของการดำเนินงานเบื้องต้น ยิ่งกว่านั้นความซับซ้อนของกรณีที่เลวร้ายที่สุดอาจเป็นตัวบ่งชี้ที่แย่ได้เนื่องจากแหล่งที่มาของความซับซ้อนของกรณีที่เลวร้ายที่สุดอาจเกิดขึ้นได้ไม่บ่อยนัก ตัวอย่างเช่นparsersทั่วไปสำหรับ Tree Adjoining Grammarsมีความซับซ้อนทางทฤษฎีและค่อนข้างใช้งานได้จริงในทางปฏิบัติ กรณีที่เลวร้ายที่สุดที่ฉันรู้คือการ อนุมานชนิดโพลีมอร์ฟิค Damas-Hindley-MilnerO(n6)อัลกอริธึมที่ใช้สำหรับ ML ซึ่งมีความซับซ้อนของตัวพิมพ์ใหญ่และเลวร้ายที่สุด แต่ดูเหมือนจะไม่รบกวนผู้ใช้ ML หรือป้องกันการเขียนโปรแกรมที่มีขนาดใหญ่มากใน ML มีมากกว่าค่าคงที่ที่สำคัญ ที่จริงแล้วการวิเคราะห์เชิงความสัมพันธ์นั้นเกี่ยวข้องกับการวัดค่าใช้จ่ายในการคำนวณกับการวัดความซับซ้อนของอินพุต แต่ขนาดดิบอาจไม่ถูกต้อง

ความซับซ้อนเป็นเหมือน decidability มันอาจจะไม่ดีในทางทฤษฎี แต่นั่นอาจไม่เกี่ยวข้องกับพื้นที่ข้อมูลส่วนใหญ่ ... บางครั้ง การวิเคราะห์ความซับซ้อนเชิงซีมโทติคเป็นเครื่องมือที่ดีและออกแบบมาอย่างดีโดยมีข้อดีและข้อ จำกัด เช่นเดียวกับเครื่องมือทั้งหมด มีหรือไม่มีการอธิบายค่าคงที่ซึ่งอาจไม่มีความหมายจำเป็นต้องใช้วิจารณญาณ


2

คำตอบอื่น ๆ ให้คำอธิบายที่ดีของเหตุผลตามความหมายของ Big-O,(3n)O(n)=O(3n)

สำหรับเหตุผลที่เราทำสิ่งนี้จริง ๆ ใน CS มันจึงมีคำอธิบายที่กระชับเกี่ยวกับประสิทธิภาพของอัลกอริทึม ตัวอย่างเช่นอาจมีอัลกอริทึมที่มีคำสั่ง if ที่หนึ่งสาขาดำเนินการคำสั่งและอื่น ๆ ดำเนินการคำแนะนำซึ่งหมายความว่าจำนวนที่แน่นอนเปลี่ยนไปสำหรับแต่ละอินพุตแม้กระทั่งสำหรับอินพุตที่มีความยาวเท่ากัน เราสามารถหาตัวเลขสำหรับแต่ละอินพุตได้ แต่การใช้สัญลักษณ์ขนาดใหญ่ช่วยให้เราสามารถวัดความซับซ้อนของเวลาที่มีอยู่สำหรับอินพุตทั้งหมด3 nn3n

สิ่งนี้มีประโยชน์มากกว่าในการคาดเดาว่าอัลกอริทึมจะเร็วแค่ไหน ไม่เช่นนั้นเราจะต้องดูฟังก์ชั่นชิ้นใหญ่ซึ่งจะยากที่จะเข้าใจ

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


1

lim sup n f ( n )f(n)=O(g(n))หมายความว่า\lim supnf(n)g(n)<+

หากนี่เป็นความจริงสำหรับนี่จะเป็นจริงสำหรับเช่นกันและในทางกลับกันg(n)=ng(n)=3n

ในทำนองเดียวกัน{46803}) นี่คือความเท่าเทียมกันหมายความว่าเป็นของ LHS ถ้ามันเป็นของ RHS สัญญาณนี่คือการละเมิดที่ร้ายแรงของสัญกรณ์ที่ผมเองเกลียดเพราะมันจะทำให้เกิดความสับสนO(n2)=O(.00005321n2+1000000000n+1046803)f=


2
อันที่จริงแรกคือการใช้สัญลักษณ์ เข้าท่าเป็นชุดของฟังก์ชั่นซึ่งในกรณีแรกที่ควรจะใช้ , แต่อันที่สองก็โอเคเพราะมันหมายถึงความเท่าเทียมมาตรฐานของเซต =O(...)
Jan Hudec

@Jan ใช่ แต่แล้วคุณควรเขียนหรือ2) มันทำให้รู้สึกว่าเขียนเพราะคุณสามารถประเมินอนุพันธ์ในทุก ๆแยก (สามารถพิจารณาภายนอกเพื่อเครื่องหมาย ) แต่ที่นี่คุณพิจารณาฟังก์ชันทั้งหมดดังนั้นเป็น interne ไป /การเข้าสู่ระบบ f O ( n n 2 ) f ( x ) = h ( x ) x x = n = fO(g)fO(nn2)f(x)=h(x)xx=n=
yo '20

ฉันมักจะพิจารณาเป็นเพียงชัดเจนเกี่ยวกับเป็นฟังก์ชันของอาร์กิวเมนต์หนึ่ง ff(n)f
Jan Hudec

ฉันมักจะทำเช่นนั้นโดยรู้ว่ามันเป็นการละเมิดของสัญกรณ์ด้วยเช่นกัน)
yo '

-1

ผมขออธิบายให้คุณง่ายๆ ให้เราเอาn = 100000ทีนี้ 3n คืออะไร? มันคือ 300000 ( ใช่แล้วมันคือ 3 เท่าของ n ) แต่n ^ 2คืออะไร? 10000000000 ( มันคือ 1 แสนแสนเท่าของ n ) .. เปรียบเทียบ n ^ 2 กับ n 3 นั้นเล็กน้อยเมื่อเราเปรียบเทียบกับ 1 แสน ดังนั้นเราสามารถลบได้

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


2
สามปียังคงเป็นเวลานานกว่าหนึ่งปี
Yuval Filmus

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