สัญกรณ์บิ๊กโอ้ไม่ได้พูดถึงค่าคงที่


13

ฉันเป็นโปรแกรมเมอร์และเพิ่งเริ่มอ่านอัลกอริทึม ฉันไม่มั่นใจอย่างสมบูรณ์กับสัญลักษณ์คือ Bog Oh, Big Omega และ Big Theta เหตุผลก็คือโดยนิยามของบิ๊กโอ้มันระบุว่าควรมีฟังก์ชั่น g (x) เพื่อให้มันมากกว่าหรือเท่ากับ f (x) เสมอ หรือ f (x) <= cn สำหรับค่าทั้งหมดของ n> n0

ทำไมเราไม่พูดถึงค่าคงที่ในคำนิยาม? ตัวอย่างเช่นสมมุติว่าฟังก์ชัน 6n + 4 เราแสดงว่าเป็น O (n) แต่มันไม่เป็นความจริงที่คำจำกัดความนั้นดีสำหรับค่าคงที่ทั้งหมด สิ่งนี้จะถือว่าดีเมื่อ c> = 10 และ n> = 1 สำหรับค่าที่น้อยกว่าของ c มากกว่า 6 ค่าของ n0 จะเพิ่มขึ้น ดังนั้นทำไมเราไม่พูดถึงค่าคงที่เป็นส่วนหนึ่งของคำนิยาม?


4
คุณเสนอให้แสดงค่าคงที่อย่างไร
Daniel B

1
เมื่อนำจุดของคุณไปอีกขั้นหนึ่งฟังก์ชันการยกเลิกใด ๆ คือ O (1) หากคุณผูก n
Brian

คำตอบ:


23

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

โดยปกติแล้วรันไทม์ของquicksort ที่แท้จริงจะเปลี่ยนไปถ้ามันถูกใช้ใน C หรือ Python หรือ Scala หรือ Postscript เช่นเดียวกับการเรียงลำดับฟอง - รันไทม์จะแตกต่างกันอย่างกว้างขวางขึ้นอยู่กับการใช้งาน

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

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


22

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

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


3
ตัวอย่างเช่นการสร้างปิรามิดคือ O (n) การเรียงลำดับรูปภาพของพวกเขาคือ O (n log n) - ในบางจุดคุณอาจมีปิรามิดเพียงพอที่จะใช้เวลาในการเรียงลำดับรูปภาพนานกว่าการสร้างใหม่! แต่สำหรับปิรามิดจำนวนมากเท่านั้น!
Martin Beckett

คำตอบที่ดี แต่สำหรับ N ที่กำหนดและอัลกอริธึมสองตัวที่โดยทั่วไปแล้วตกอยู่ใน "ตระกูล" เดียวกันของความซับซ้อนอาจมีข้อดีในการทำสิ่งที่ OP แนะนำและรวมถึงสัมประสิทธิ์สัมพัทธ์อย่างน้อย ขั้นตอนวิธีเชิงเส้นที่มีจำนวนคำสั่งต่อองค์ประกอบเป็นสองเท่าเป็นอีกวิธีหนึ่งอาจถูกเรียกว่า * O * (2N) เป็น * O * (N) ของ alg ที่สองเพื่อแสดงความแตกต่างสัมพัทธ์เพราะสำหรับ N ใด ๆ อัลกอริทึมแรกจะเป็นสองเท่าเสมอ เวลาดำเนินการของวินาที อย่างไรก็ตามเมื่อเปรียบเทียบกับฟังก์ชันของตระกูลความซับซ้อนที่แตกต่างกันเช่น * O * (NlogN) สัมประสิทธิ์ไม่สำคัญ
KeithS

10

สัญลักษณ์บิ๊กโอตามคำจำกัดความระบุว่า: สัญกรณ์บิ๊กโอถูกสร้างขึ้นบนสัญชาตญาณว่าสำหรับค่าทั้งหมด n ที่และไปทางขวาของ n 'ค่าของ f (n) อยู่บนหรือต่ำกว่า cg (n) ค่าคงที่ยังไม่สำคัญเมื่อคุณไปที่ปัจจัย (ตัวแปร) ที่มีมูลค่าสูง (เช่น n-square หรือ n-cube) เนื่องจากพวกมันเป็นเพียงค่าคงที่และไม่ใช่ปริมาณที่แตกต่างกันซึ่งอาจกลายเป็นปัจจัยใหญ่ได้ รับด้านล่างเป็นกราฟของสัญกรณ์ Big-O
For a given function g(n), we denote by O(g(n)) the set of functions:
O(g(n)) = {f(n): there exist positive constants c and n' such that 0<=f(n)<=c.g(n) for all n > n'}




ป้อนคำอธิบายรูปภาพที่นี่

สาระสำคัญของสัญกรณ์นี้คือความจริง " how lower is f(n) from c.g(n) and not when it starts becoming lower"


ในกรณีนั้นสำหรับทุก ๆ O (n) ก็คือบิ๊กทีต้าของ n เนื่องจากตามนิยามสำหรับค่าคงที่บางค่ามันจะเป็นขอบเขตที่ต่ำกว่าและสำหรับค่าคงที่บางส่วนนั้นจะเป็นขอบเขตบน ตัวอย่างเช่น 6n + 4 ยังเป็นทีต้าขนาดใหญ่ (n) เนื่องจากเมื่อ c น้อยกว่า 10 มันจะเป็นขอบเขตล่างเสมอ และเมื่อ c มากกว่า 10 มันคือขอบเขตสูงสุด เราสามารถพูดได้ไหมว่าสำหรับสัญลักษณ์บิ๊กโอ๋ใด ๆ ก็เป็นบิ๊กทีต้าด้วย?
Pradeep

1
คุณกำลังบอกว่ามันเป็นอีกทางหนึ่ง: "Big Theta หมายถึง Big Oh" และ Big -Oh สามารถถูกแทนที่ด้วย Big-Theta สำหรับขอบเขตที่ไม่ จำกัด
Vaibhav Agarwal

9

ในการวิเคราะห์อัลกอริทึมOrder of Growthเป็นนามธรรมที่สำคัญและให้อัตราที่เวลาทำงานเปลี่ยนแปลงตามขนาดอินพุตที่เปลี่ยนแปลง f(n) = 2n + 3สมมติว่าอัลกอริทึมที่มีเวลาในการทำงาน ตอนนี้เราเสียบขนาดอินพุตบางส่วน

n = 10: 2 * 10 + 3 = 23

n = 100: 2 * 100 + 3 = 203

n = 10000: 2 * 10000 + 3 = 20003

n = 1000000: 2 * 1000000 + 3 = 2000003

n = 100000000 : 2 * 100000000 + 3 = 200000003

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


1

ความคิดทั้งหมดของสัญกรณ์ Big-Oh นั้นมีจุดประสงค์เพื่อละเว้นค่าคงที่และนำเสนอส่วนที่สำคัญที่สุดของฟังก์ชั่นที่อธิบายเวลาทำงานของอัลกอริทึม

ลืมความหมายอย่างเป็นทางการสักครู่ ซึ่งเป็นที่เลวร้าย (การเจริญเติบโตเร็ว) ฟังก์ชั่นn^2 - 5000หรือ5000 n + 60000? สำหรับnน้อยกว่า 5,000 รอบฟังก์ชันเชิงเส้นจะยิ่งใหญ่กว่า นอกเหนือจากนั้น (ค่าที่แน่นอน 5013?) สมการกำลังสองนั้นใหญ่กว่า

เนื่องจากมีจำนวนบวกมากกว่า (น้อยกว่า) มากกว่า 5,000 น้อยกว่าเราจึงใช้กำลังสองเป็นฟังก์ชั่น 'ใหญ่กว่า' (แย่กว่า) โดยทั่วไป สัญกรณ์สั่งซื้อ (Big-Oh ฯลฯ ) บังคับใช้ (คุณสามารถกำจัดค่าคงที่การบวกและการคูณโดยใช้คำจำกัดความเหล่านั้น)

แน่นอนว่าสิ่งต่าง ๆ ไม่ง่ายเสมอไป บางครั้งคุณไม่ต้องการที่จะทราบค่าคงที่เหล่านั้น การเรียงลำดับการแทรกหรือการเรียงลำดับแบบไหนที่ดีกว่า O(n^2)ทั้งสองเป็น แต่อย่างใดอย่างหนึ่งดีกว่าอีก ด้วยการวิเคราะห์ที่ซับซ้อนยิ่งขึ้นคุณสามารถรับค่าคงที่ได้อย่างที่คุณสงสัย โดยทั่วไปแล้วการคำนวณฟังก์ชั่น Big-Oh ง่ายกว่าฟังก์ชั่นที่แน่นอนมากขึ้น

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


1

(เนื่องจากนี่เป็นคำตอบที่นานอ่านตัวหนาสำหรับการสรุป )

ลองมาเป็นตัวอย่างของคุณและทำมันทีละขั้นตอนทำความเข้าใจกับวัตถุประสงค์ที่อยู่เบื้องหลังสิ่งที่เรากำลังทำ เราเริ่มต้นด้วยฟังก์ชั่นของคุณและเป้าหมายในการค้นหาสัญลักษณ์ Big Oh:

f(n) = 6n+4

ขั้นแรกให้O(g(n))เป็นบิ๊กโอ้สัญกรณ์f(n)ที่เรากำลังพยายามที่จะหา จากความหมายของบิ๊กโอ้ที่เราต้องการที่จะหาง่าย g(n)ที่มีอยู่คงที่บางcและn0ที่c*g(n) >= f(n)เป็นจริงสำหรับทุกn's n0มากกว่า

อันดับแรกให้เลือกg(n) = 6n + 4(ซึ่งจะให้ผลO(6n+4)ใน Big Oh) ในกรณีนี้เราจะเห็นว่าc = 1และค่าใด ๆ ของn0จะเป็นไปตามข้อกำหนดทางคณิตศาสตร์จากคำนิยามของ Big Oh เนื่องจากg(n)เท่ากับf(n):

c*g(n)      >=  f(n)    
1*(6n + 4)  >=  6n + 4    //True for all n's, so we don't need to pick an n0

ณ จุดนี้เราได้ปฏิบัติตามข้อกำหนดทางคณิตศาสตร์แล้ว ถ้าเราหยุดที่O(6n+4)จะเห็นได้ชัดว่ามันไม่มีประโยชน์อะไรมากกว่าการเขียนf(n)ดังนั้นมันจะพลาดจุดประสงค์ที่แท้จริงของสัญกรณ์ Big Oh: เพื่อทำความเข้าใจกับความซับซ้อนของเวลาทั่วไปของอัลกอริทึม! ดังนั้นให้ทำตามขั้นตอนต่อไป: การทำให้เข้าใจง่าย

ก่อนอื่นเราจะทำให้6nBig Oh ง่ายขึ้นได้O(4)หรือไม่? No! (ออกกำลังกายสำหรับผู้อ่านหากพวกเขาไม่เข้าใจว่าทำไม)

ประการที่สองเราสามารถลดความซับซ้อน4ของ Big Oh ได้O(6n)หรือไม่? ใช่ ในกรณีg(n) = 6nนั้นดังนั้น:

c*g(n)    >=  f(n)
c*6n      >=  6n + 4     

ณ จุดนี้ให้เลือกc = 2ตั้งแต่นั้นทางด้านซ้ายจะเพิ่มเร็วขึ้น (12) กว่าด้านขวา (6) สำหรับการเพิ่มขึ้นของแต่ละnครั้ง

2*6n      >=  6n + 4

ตอนนี้เราต้องหาค่าบวกn0ที่สมการข้างต้นนั้นเป็นจริงสำหรับทุกnค่ามากกว่าค่านั้น เนื่องจากเรารู้แล้วว่าด้านซ้ายนั้นเพิ่มขึ้นเร็วกว่าทางด้านขวาสิ่งที่เราต้องทำคือหาทางออกที่ดี ดังนั้นตั้งแต่n0 = 2ทำให้ดังกล่าวข้างต้นเป็นความจริงเรารู้ว่าg(n)=6nหรือเป็นสัญกรณ์บิ๊กโอ้ที่มีศักยภาพสำหรับ O(6n)f(n)

ทีนี้เราสามารถทำให้6Big Oh เป็นเรื่องง่ายขึ้นได้O(n)ไหม? ใช่ ในกรณีg(n) = nนั้นดังนั้น:

c*g(n)      >=  f(n)    
c*n         >=  6n + 4    

ลองเลือกc = 7ตั้งแต่ซ้ายจะเพิ่มเร็วกว่าทางขวา

7*n         >=  6n + 4

เราจะเห็นว่าด้านบนจะเป็นจริงสำหรับทุกท่านที่มากกว่าหรือเท่ากับn n0 = 4ดังนั้นศักยภาพสัญกรณ์บิ๊กโอ้สำหรับO(n) f(n)เราลดความซับซ้อนได้g(n)อีกหรือไม่ Nope!

สุดท้ายเราได้พบว่าง่ายสัญกรณ์บิ๊กโอ้สำหรับเป็นf(n) O(n) ทำไมเราต้องผ่านสิ่งเหล่านี้ทั้งหมด? เพราะตอนนี้เรารู้ว่าf(n)เป็นเส้นตรงO(n)ตั้งแต่มันสัญกรณ์บิ๊กโอ้เป็นความซับซ้อนเชิงเส้น สิ่งที่ดีคือตอนนี้เราสามารถเปรียบเทียบความซับซ้อนของเวลาf(n)กับอัลกอริธึมอื่น ๆ ! ยกตัวอย่างเช่นตอนนี้เรารู้ว่าf(n)เป็นของเทียบเคียงเวลาซับซ้อนฟังก์ชั่นh(n) = 123n + 72, i(n) = n, j(n) = .0002n + 1234ฯลฯ ; O(n)เพราะความเรียบง่ายโดยใช้กระบวนการเดียวกันระบุไว้ข้างต้นพวกเขาทั้งหมดมีเส้นตรงเวลาความซับซ้อนของ

หวาน!!!


สวัสดีคำอธิบายที่ดี ฉันยังมีข้อสงสัยเล็กน้อย 1. เราไม่สามารถสร้าง 6n + 4 เป็น O (4) เนื่องจากมีค่าตัวแปร 'n' นี่คือคำตอบหรือไม่ 2. ในขณะที่ทำให้เข้าใจง่ายคุณเลือก c = 7 และคำนวณอย่างสอดคล้องกัน n0 ถึง 4 อะไรที่ทำให้การตัดสินใจ c = 7 และไม่น้อยกว่า 7 เพราะขึ้นอยู่กับค่าของ c ที่ n0 จะเปลี่ยน
Pradeep

@Pradeep: สำหรับ 1 คุณถูกต้อง สำหรับคำอธิบายที่ลึกกว่านี้: ถ้าเราลองO(4)นั่นจะทำให้สมการความไม่เท่าเทียมของเราc*4 >= 6n+4และสำหรับสิ่งที่cเราเลือกเราสามารถหาค่าที่ค่าทั้งหมดnข้างต้นที่จะทำให้ความไม่เท่าเทียมเป็นเท็จเสมอ
Briguy37

@Pradeep: สำหรับ 2 ค่าจริงของcและn0ไม่สำคัญ สิ่งที่สำคัญคือn0มีอยู่สำหรับcเราเลือก nในการสั่งซื้อสำหรับที่จะเป็นจริงทางด้านซ้ายของความไม่เท่าเทียมกันจะต้องเพิ่มขึ้นเร็วกว่าด้านขวาสำหรับค่ามาก c=6ไม่ดีสำหรับการนี้ ( 6n >= 6n+4ไม่จริง) c=7ดังนั้นฉันเลือก ฉันจะได้หยิบได้อย่างง่ายดายเพียงc=10, c=734หรือc=6.0000001และจะยังคงได้รับสามารถที่จะเห็นว่ามีบางn0ที่มีอยู่จะทำให้ความไม่สมดุลกันจริงสำหรับn >= n0ซึ่งหมายความว่าโอ้บิ๊กเรากำลังทดสอบที่ถูกต้อง
Briguy37

ขอบคุณสำหรับคำอธิบายที่ชัดเจน นี่คือสิ่งที่ฉันกำลังมองหาอย่างแม่นยำ ขอบคุณอีกครั้ง
Pradeep

@Pradeep: ดีใจที่ฉันสามารถช่วย :)
Briguy37

1

หากคุณมีฟังก์ชันประสิทธิภาพ6n + 4คำถามที่เกี่ยวข้องคือ "6 อะไร?" ในขณะที่ความคิดเห็นหนึ่งถาม: ค่าคงที่ของคุณคืออะไร ในแง่ฟิสิกส์หน่วยของปัจจัยคงที่ของคุณคืออะไร?

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

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

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

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