ความแตกต่างระหว่างสิ่งที่เป็นBig-Oสัญกรณ์O(n)
และลิตเติ้ล-Oสัญกรณ์o(n)
?
ความแตกต่างระหว่างสิ่งที่เป็นBig-Oสัญกรณ์O(n)
และลิตเติ้ล-Oสัญกรณ์o(n)
?
คำตอบ:
f ∈ O (g) พูดโดยหลักแล้ว
สำหรับอย่างน้อยหนึ่งทางเลือกของค่าคงที่k > 0 คุณสามารถค้นหาค่าคงที่เช่นว่าความไม่เท่าเทียมกัน 0 <= f (x) <= kg (x) ถือทั้งหมด x> a
โปรดทราบว่า O (g) เป็นชุดของฟังก์ชั่นทั้งหมดที่มีเงื่อนไขนี้
f ∈ o (g) พูดโดยหลักแล้ว
สำหรับทุกทางเลือกของการคงที่k > 0 คุณสามารถหาคงดังกล่าวที่ไม่เท่าเทียมกัน 0 <= f (x) <กก. (x) ถือสำหรับทุก x> a
อีกครั้งโปรดทราบว่า o (g) เป็นชุด
ใน Big-O มันเป็นสิ่งที่จำเป็นเท่านั้นที่คุณพบว่าตัวคูณโดยเฉพาะอย่างยิ่งkซึ่งความไม่เท่าเทียมกันถือหุ้นเกินกว่าขั้นต่ำบางx
ใน Little-o ต้องมีxอย่างน้อยหลังจากนั้นความไม่เสมอภาคจะถือกำเนิดไม่ว่าคุณจะสร้างkน้อยแค่ไหนตราบใดที่มันไม่ได้เป็นลบหรือเป็นศูนย์
ทั้งสองอธิบายขอบเขตบนแม้ว่าจะค่อนข้างตอบโต้สังหรณ์ใจ Little-o เป็นคำสั่งที่แข็งแกร่ง มีช่องว่างขนาดใหญ่กว่าระหว่างอัตราการเติบโตของ f และ g หาก f ∈ o (g) มากกว่าถ้า f ∈ O (g)
ตัวอย่างหนึ่งของความไม่เสมอภาคคือ: f ∈ O (f) เป็นจริง แต่ f ∈ o (f) เป็นเท็จ ดังนั้น Big-O จึงสามารถอ่านได้ว่า "f ∈ O (g) หมายความว่าการเจริญเติบโตของ asymptotic นั้นไม่เร็วกว่า g's" ในขณะที่ "f ∈ o (g) หมายความว่า f ของการเจริญเติบโตเชิงซีกขวานั้นช้ากว่าของ g อย่างแน่นอน" มันเหมือนเมื่อเทียบกับ<=
<
หากค่าของ g (x) เป็นค่าคงที่หลายค่าของ f (x) ดังนั้น f ∈ O (g) จะเป็นจริง นี่คือเหตุผลที่คุณสามารถปล่อยค่าคงที่เมื่อทำงานกับสัญกรณ์ใหญ่
อย่างไรก็ตามสำหรับ f ∈ o (g) เป็นจริงแล้ว g จะต้องรวมพลังที่สูงขึ้นของ x ในสูตรของมันและดังนั้นการแยกความสัมพันธ์ระหว่าง f (x) และ g (x) จะต้องเพิ่มขึ้นตามจริงเมื่อ x ใหญ่ขึ้น
หากต้องการใช้ตัวอย่างคณิตศาสตร์อย่างหมดจด (แทนที่จะอ้างถึงอัลกอริธึม):
ต่อไปนี้เป็นจริงสำหรับ Big-O แต่จะไม่เป็นจริงถ้าคุณใช้ little-o:
ต่อไปนี้เป็นจริงสำหรับ little-o:
โปรดทราบว่าถ้า f ∈ o (g) นี่หมายถึง f ∈ O (g) เช่นx²∈ o (x³) ดังนั้นมันจึงเป็นความจริงที่x²∈ O (x³), (อีกครั้งให้คิดถึง O as <=
และ o as <
)
a
สิ่งk
นั่น: ... " มันคือ "สำหรับทุก ๆk
สิ่งa
นั่น: ... "
Big-O คือการน้อย o เป็นคือการ≤
<
Big-O เป็นขอบเขตบนที่รวมในขณะที่ Little-ขอบเขตบนนั้นเข้มงวด
ตัวอย่างเช่นฟังก์ชั่นf(n) = 3n
คือ:
O(n²)
, o(n²)
และO(n)
O(lg n)
, o(lg n)
หรือo(n)
อะนาล็อกตัวเลข1
คือ:
≤ 2
, < 2
และ≤ 1
≤ 0
, < 0
หรือ< 1
นี่คือตารางที่แสดงแนวคิดทั่วไป:
(หมายเหตุ: ตารางเป็นแนวทางที่ดี แต่นิยามขีด จำกัด ควรอยู่ในรูปของขีด จำกัด ที่เหนือกว่าแทนที่จะเป็นขีด จำกัด ปกติตัวอย่างเช่น3 + (n mod 2)
แกว่งระหว่าง 3 ถึง 4 ตลอดไปมันอยู่ในO(1)
แม้จะไม่มีขีด จำกัด ปกติ เป็นlim sup
: 4. )
ฉันขอแนะนำให้จำว่าสัญลักษณ์ Big-O แปลงเป็นการเปรียบเทียบเชิงสัญลักษณ์อย่างไร การเปรียบเทียบนั้นง่ายต่อการจดจำ แต่มีความยืดหยุ่นน้อยกว่าเพราะคุณไม่สามารถพูดสิ่งต่าง ๆ เช่น n O (1) = P
ฉันพบว่าเมื่อฉันไม่สามารถเข้าใจแนวคิดอะไรบางอย่างการคิดว่าทำไมใครจะใช้ Xมีประโยชน์ในการเข้าใจ X (ไม่ได้บอกว่าคุณไม่ได้ลองสิ่งนั้นฉันแค่ตั้งเวที)
[สิ่งที่คุณรู้] วิธีการทั่วไปในการจำแนกอัลกอริธึมคือโดยการใช้งานจริงและโดยการอ้างถึงความซับซ้อนที่ยิ่งใหญ่ของอัลกอริทึมคุณจะได้การประมาณที่ดีพอสมควรว่าอันไหนที่ "ดีกว่า" - ใน O! แม้ในโลกแห่งความเป็นจริง O (N) ก็คือ "ดีกว่า" กว่า O (N²) ยกเว้นสิ่งที่โง่เช่นค่าคงที่ที่สูงมากและไม่ชอบ [/ สิ่งที่คุณรู้]
สมมติว่ามีอัลกอริทึมที่ทำงานใน O (N) ค่อนข้างดีใช่มั้ย แต่สมมติว่าคุณ (คุณเป็นคนที่ยอดเยี่ยมคุณ) มาพร้อมกับอัลกอริทึมที่ทำงานใน O ( N ⁄ loglogloglogN ) เย้! มันเร็วขึ้น! แต่คุณจะรู้สึกงี่เง่าที่เขียนซ้ำแล้วซ้ำอีกเมื่อคุณเขียนวิทยานิพนธ์ของคุณ คุณเขียนหนึ่งครั้งและคุณสามารถพูดว่า "ในบทความนี้ฉันได้พิสูจน์แล้วว่าอัลกอริธึม X ซึ่งคำนวณได้ก่อนหน้านี้ในเวลา O (N) ในความเป็นจริงก็คำนวณได้ใน o (n)"
ดังนั้นทุกคนรู้ว่าอัลกอริทึมของคุณเร็วขึ้น --- โดยไม่ชัดเจนเท่าไหร่ แต่พวกเขารู้เร็วกว่า ตามหลักวิชา :)