มีการแปรผันของรูทีนปกติของ Big-O-Notation หรือไม่?


9

มีการแจ้งเตือนหลายรายการเช่นหรือเป็นต้น ฉันสงสัยว่าถ้ามีความแตกต่างของความเป็นจริงเช่นหรือหรือถ้าสิ่งเหล่านั้นไม่ถูกต้องทางคณิตศาสตร์OO(n)O(n2)O(2n2)O(logn2)

หรือเป็นสิ่งที่ถูกต้องที่จะบอกว่าเป็นไปได้ที่จะปรับปรุงเป็น ? ฉันยังไม่สามารถและไม่จำเป็นต้องรู้ว่ารันไทม์ยังและฉันไม่จำเป็นต้องปรับปรุงอะไร แต่ฉันต้องรู้ว่านี่เป็นวิธีที่คุณอธิบายฟังก์ชั่นของคุณในความเป็นจริงหรือไม่O(5n2)O(3n2)


1
ไม่มีความแตกต่างอย่างมีนัยสำคัญระหว่าง O (5n ^ 2) ถึง O (3n ^ 2) ระหว่างการวิเคราะห์เชิงซีมโทติค พวกเขาทั้งสอง O (n ^ 2) และแตกต่างกันเพียงค่าคงที่ ในความเป็นจริงในการพิสูจน์คุณอาจลด O (5n ^ 2) เป็น O (3n ^ 2) หรือ O (n ^ 2) เพื่อให้ตัวคณิตศาสตร์สะอาดขึ้นเพราะมันเทียบเท่ากัน เมื่อเขียนหลักฐานของคุณคุณจดบันทึกลงในแถบด้านข้างที่เทียบเท่ากัน ในความเป็นจริงคุณอาจสลับ O (log n) กับ O (n) และสังเกตว่า O (log n) <= O (n) ในแถบด้านข้าง บันทึกย่อในแถบด้านข้างบอกผู้อ่านว่ามีเจตนาและไม่พิมพ์ผิด (อย่างน้อยนั่นคือวิธีที่ฉันทำเมื่อฉันทำการวิเคราะห์อัลกอริทึมในวิทยาลัย)
jww

2
หากคุณใช้สัญกรณ์เพื่อกำจัดปัจจัยเล็ก ๆ คุณสามารถเขียนอะไรบางอย่างเช่น "... ช่วยเพิ่มเวลาการทำงานจากลงไปที่ " ฯลฯ หรือค่าเท่ากันและ 2 ผู้เขียนบางคนชอบเขียนเป็นชวเลขสำหรับอดีต ดูตัวอย่างเช่นตำราเรียนโดย Trefethen และ Bau O()5n2+o(n2)3n2+o(n2)(5+o(1))n2(3+o(1))n25n2
Yonatan N

คำตอบ:


21

ฉันสงสัยว่าถ้ามีความแตกต่างของความเป็นจริงเช่นหรือหรือหากสิ่งนั้นไม่ถูกต้องทางคณิตศาสตร์O(2n2)O(log(n2))

ใช่หรือเป็นรูปแบบที่ถูกต้องO(2n2)O(log(n2))

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

มันจะเป็นสิ่งที่ถูกต้องที่จะบอกว่ามันเป็นไปได้ในการปรับปรุงกับ ?O(5n2)O(3n2)

มันไม่ได้เป็นการปรับปรุงเลยหากความซับซ้อนของเวลาของอัลกอริทึมเปลี่ยนจากเป็นหรือจากเป็น , เพราะเป็นในขณะที่เป็น2) ดังนั้นจึงเป็นสิ่งที่ไม่ถูกต้องที่จะบอกว่าเวลาที่ซับซ้อนจะดีขึ้นจากเพื่อ2) มันถูกต้องที่จะบอกว่าเวลาที่ซับซ้อนของอัลกอริทึมได้รับการปรับปรุงจากเป็นแน่นอนO(5n2)O(3n2)Ω(5n2)Ω(3n2)O(5n2)O(3n2)Ω(5n2)Ω(3n2)O(5n2)O(3n2)5n23n2


การออกกำลังกาย 1.แสดงให้เห็นว่า2)O(5n2)=O(3n2)=O(n2)

การออกกำลังกาย 2.แสดงให้เห็นว่า2))O(logn)=O(log(n2))

การออกกำลังกาย 3.แสดงให้เห็นว่า2)Ω(n2+n)=Ω(n2)


1
@bv_Martn ต่อไปนี้เป็นลิงก์ที่ดีที่จะเข้าใจว่าเครื่องหมายหมายถึงอะไร (แค่ขีด จำกัด แคลคูลัสที่ง่าย!): math.stackexchange.com/questions/925053/…O(n)
Akshat Mahajan

2
ครั้งเดียวที่ฉันเห็นปัจจัยคงที่ในเครื่องหมายใหญ่ -O คือเมื่อมีคนต้องการชี้ให้เห็นว่าถึงแม้ว่าอัลกอริธึมสองอันนั้นมีระดับความซับซ้อนเดียวกัน แต่หนึ่งในนั้นก็เร็วกว่าอีกอันหนึ่ง
Mark

7
@AkshatMahajan คำตอบเดียวสำหรับคำถามนั้น/math/925053ผิดอย่างชัดเจน แหล่งใหญ่ที่เชื่อถือได้มีมากมายO-notations
John L.

1
"ถูกต้องที่จะบอกว่าความซับซ้อนของเวลาของอัลกอริทึมได้รับการปรับปรุงจาก 5n ^ 2 เป็น 3n ^ 2" - แม้ว่าเวลาทำงานแน่นอนมักจะแตกต่างกันไปตามขนาดและค่าอินพุตที่แตกต่างกัน นอกจากนี้ยังเกี่ยวข้องกับการถ่วงน้ำหนักการดำเนินการทั้งหมด / การมุ่งเน้นไปที่การปฏิบัติงานเดียวซึ่งอาจไม่ได้กล่าวถึงปัจจัยคงที่ที่คุณจะได้รับในโลกแห่งความเป็นจริงหรือเทียบเคียงได้กับอัลกอริธึมอื่น ๆ ดังนั้นแม้ว่าอาจมีกรณีการใช้งานที่ไม่ถูกต้อง แต่การพูดถึงสิ่งที่กล่าวมาข้างต้นมีประโยชน์ จำกัด (ซึ่งอาจเป็นเหตุผลว่าทำไมมันไม่ค่อยเห็น)
Bernhard Barker

1
@ Mark: มันผิดปกติ
user21820

13

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

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


ฉันยังไม่ต้องการมันในทางปฏิบัติ หรือในทางทฤษฎีแล้วฉันแค่ต้องรู้ว่าคำนิยามที่กำหนดโดยวิกิพีเดีย O (1) -O (n!) เป็นคำเดียวที่มีอยู่หรือถ้าในความเป็นจริงคุณสามารถอธิบายพวกมันได้แตกต่างกันถ้าพวกมันแตกต่างกันเช่น O (7N) ความกลัวของฉันคือถ้าฉันใช้อาจารย์คณิตศาสตร์จะคลายปีกของเขา
bv_Martn

1
คำจำกัดความใด ๆ ที่ทำให้ทุกคนมีอยู่จริง คุณควรอ่านอย่างระมัดระวังสิ่งที่สัญกรณ์O(1) หรือ O(n!)หมายความว่าเพราะคำถามของคุณไม่สมเหตุสมผล ไม่มีทางลัด หากคุณต้องการเข้าใจความหมายของเนื้อหาทางคณิตศาสตร์คุณต้องยอมสละเวลา
Juho

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

7

แม้ว่าคำตอบที่ได้รับการยอมรับนั้นค่อนข้างดี แต่ก็ยังไม่ได้สัมผัสกับเหตุผลที่แท้จริงว่าทำไม O(n)=O(2n).

สัญลักษณ์ Big-O อธิบายความสามารถในการขยาย

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

ใช้การค้นหาแบบไบนารีเช่น รับรายการที่เรียงลำดับแล้วคุณจะหาค่าที่อยู่ภายในได้อย่างไร คุณเริ่มตรงกลางได้ เนื่องจากรายการจะถูกเรียงลำดับค่ากลางจะบอกคุณครึ่งหนึ่งของรายการค่าเป้าหมายของคุณอยู่ดังนั้นรายการที่คุณต้องค้นหาจึงแยกครึ่ง สิ่งนี้สามารถนำไปใช้ซ้ำแล้วไปที่ตรงกลางของรายการใหม่และอื่น ๆ จนกระทั่งขนาดรายการเป็น 1 และคุณได้พบค่าของคุณ (หรือไม่มีอยู่ในรายการ) การเพิ่มขนาดรายการเป็นสองเท่าเพิ่มขั้นตอนพิเศษหนึ่งขั้นตอนให้กับอัลกอริทึมซึ่งเป็นความสัมพันธ์แบบลอการิทึม ดังนั้นอัลกอริทึมนี้คือO(logn). ลอการิทึมนั้นเป็นฐาน 2 แต่ไม่สำคัญ - หลักของความสัมพันธ์คือการคูณรายการด้วยค่าคงที่เพียงเพิ่มค่าคงที่ให้กับเวลาเท่านั้น

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

ฉันขอขอบคุณที่คำตอบเหล่านี้ส่วนใหญ่บอกให้คุณมาสรุปด้วยตัวคุณเองโดยอ่านคำจำกัดความของ Big-O แต่ความเข้าใจที่หยั่งรู้นี้ทำให้ฉันใช้เวลาสักครู่หนึ่งในการก้มศีรษะไปรอบ ๆ และฉันก็วางมันไว้กับคุณเท่าที่จะทำได้


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

3
@Juho อาจารย์ผู้สอนบางที แต่ในที่สุดก็ไร้ประโยชน์สำหรับนักวิทยาศาสตร์คอมพิวเตอร์ส่วนใหญ่
กระจาย

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

3
ใช่. ฉันไม่คัดค้านนักโปรแกรมเมอร์ที่ไม่เข้าใจสิ่งนี้ แต่ถ้าคุณต้องการเรียกตัวเองว่าเป็นนักวิทยาศาสตร์คอมพิวเตอร์นี่เป็นเนื้อหาหลัก
David Richerby

2
@dkaeae ไม่ฉันหมายถึงคนที่ทำงานในสายอาชีพอื่นเช่นนักพัฒนาซอฟต์แวร์
กระจาย

5

คุณสามารถเขียน O(f)สำหรับฟังก์ชั่นใด ๆfและทำให้รู้สึกที่สมบูรณ์แบบ ตามคำจำกัดความg(n)=O(f(n)) หากมีบางอย่างคงที่ c ดังนั้น g(n)cf(n) สำหรับทั้งหมดมีขนาดใหญ่พอ n. ไม่มีสิ่งใดในคำจำกัดความที่กล่าวว่าf ต้องเป็นฟังก์ชัน "ดี" บางประเภท

แต่ดังที่คำตอบอื่น ๆ ชี้ให้เห็น g(n)=O(f(n)) และ g(n)=O(2f(n)) อธิบายถึงสถานการณ์เดียวกันทั้งหมด: ถ้า g(n)cf(n) สำหรับทั้งหมดมีขนาดใหญ่พอ nแล้วเราก็มี g(n)c22f(n)ดังนั้น g(n)=O(2f(n))ยังรับค่าคงที่ด้วย c/2)

ในฐานะที่เป็นปัญหาด้านอย่าเขียน "logn2"เพราะมันไม่ชัดเจน 100% ความหมายคุณสามารถบอกได้ว่ามันหมายถึงชัดเจน log(n2) แต่เกือบทุกคนจะเขียนว่าเป็น 2lognดังนั้นจึงเป็นที่สงสัยในความคิดของผู้อ่าน

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


4

ดูคำจำกัดความของ O (f (n)) และคุณเห็นว่าเช่น O (2n ^ 2) และ O (n ^ 2) เหมือนกันทุกประการ การเปลี่ยนอัลกอริทึมจากการทำงาน 5n ^ 2 เป็น 3n ^ 2 เป็นการปรับปรุง 40 เปอร์เซ็นต์ การเปลี่ยนจาก O (5n ^ 2) เป็น O (3n ^ 2) ไม่ใช่การเปลี่ยนแปลง แต่อย่างใด

อ่านคำนิยามของ O (f (n)) อีกครั้ง


4

มันอาจจะเป็นประโยชน์ที่จะเข้าใจว่า Big-O อธิบายชุดของฟังก์ชั่น นั่นคือO(f(n))={g(n)|n,c>0:m>n:c×g(m)f(m)}

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

นี่แสดงให้เห็นว่า O(n)=O(2n) หรือปัจจัยคงที่นั้นไม่สำคัญเมื่อกำหนดบิ๊กโอ


4
หลักการเท่าเทียมกันไม่ได้เกี่ยวกับการพิมพ์ เป็นเพราะประโยชน์ของการแสดงออกเช่นlog(n!)=nlognn+O(logn) สนับสนุนให้เราดู O(f)เป็นทั้ง "ชุดของฟังก์ชั่นดังกล่าวว่า [... ]" และ "ฟังก์ชั่นบางอย่างเช่น [... ]"
David Richerby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.