ความแตกต่างระหว่างสิ่งที่เป็น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)"
ดังนั้นทุกคนรู้ว่าอัลกอริทึมของคุณเร็วขึ้น --- โดยไม่ชัดเจนเท่าไหร่ แต่พวกเขารู้เร็วกว่า ตามหลักวิชา :)