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