(เนื่องจากนี่เป็นคำตอบที่นานอ่านตัวหนาสำหรับการสรุป )
ลองมาเป็นตัวอย่างของคุณและทำมันทีละขั้นตอนทำความเข้าใจกับวัตถุประสงค์ที่อยู่เบื้องหลังสิ่งที่เรากำลังทำ เราเริ่มต้นด้วยฟังก์ชั่นของคุณและเป้าหมายในการค้นหาสัญลักษณ์ 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)เพราะความเรียบง่ายโดยใช้กระบวนการเดียวกันระบุไว้ข้างต้นพวกเขาทั้งหมดมีเส้นตรงเวลาความซับซ้อนของ
หวาน!!!