บางครั้งฉันเห็นΘ (n) ที่มีสัญลักษณ์แปลก ๆ with มีบางอย่างอยู่ตรงกลางและบางครั้งก็แค่ O (n) มันเป็นความขี้เกียจในการพิมพ์เพราะไม่มีใครรู้วิธีพิมพ์สัญลักษณ์นี้หรือว่ามันมีความแตกต่างกันบ้าง?
บางครั้งฉันเห็นΘ (n) ที่มีสัญลักษณ์แปลก ๆ with มีบางอย่างอยู่ตรงกลางและบางครั้งก็แค่ O (n) มันเป็นความขี้เกียจในการพิมพ์เพราะไม่มีใครรู้วิธีพิมพ์สัญลักษณ์นี้หรือว่ามันมีความแตกต่างกันบ้าง?
คำตอบ:
หากอัลกอริทึมเป็นΘ (g (n)) ก็หมายความว่าเวลาทำงานของอัลกอริทึมเมื่อ n (ขนาดอินพุต) มีขนาดใหญ่ขึ้นจะเป็นสัดส่วนกับ g (n)
ถ้าอัลกอริทึมของ O (g (n)) ก็หมายความว่าเวลาทำงานของอัลกอริทึมเป็น n ขนาดใหญ่ได้รับเป็นอย่างมากตามสัดส่วนกรัม (n)
โดยปกติแม้ว่าผู้คนจะพูดถึง O (g (n)) พวกเขาหมายถึงΘ (g (n)) แต่ในทางเทคนิคแล้วมีความแตกต่าง
O (n) หมายถึงขอบเขตบน Θ (n) หมายถึงขอบเขตที่ จำกัด Ω (n) หมายถึงขอบเขตล่าง
f (x) = Θ (g (x)) iff f (x) = O (g (x)) และ f (x) = Ω (g (x))
โดยทั่วไปเมื่อเราพูดถึงอัลกอริธึมคือ O (n) มันก็เป็น O (n 2 ), O (n 1000000 ), O (2 n ), ... แต่อัลกอริทึมΘ (n) ไม่ใช่ Θ (n 2 ) .
ในความเป็นจริงเนื่องจาก f (n) = Θ (g (n)) หมายถึงค่าที่มากพอของ n, f (n) สามารถถูกผูกไว้ภายใน c 1 g (n) และ c 2 g (n) สำหรับบางค่าของ c 1และ c 2คืออัตราการเติบโตของ f เท่ากับ asymptotically เท่ากับ g: g สามารถเป็นขอบเขตล่างและและขอบเขตบนของ f นี่หมายถึง f โดยตรงอาจเป็นขอบเขตล่างและขอบเขตบนของ g เช่นกัน ดังนั้น
f (x) = Θ (g (x)) iff g (x) = Θ (f (x))
ในทำนองเดียวกันเมื่อต้องการแสดง f (n) = Θ (g (n)) ก็เพียงพอที่จะแสดงว่า g เป็นขอบเขตสูงสุดของ f (เช่น f (n) = O (g (n))) และ f เป็นขอบเขตล่างของ g (เช่น f (n) = Ω (g (n)) ซึ่งเป็นสิ่งเดียวกันกับ g (n) = O (f (n)) รัดกุม
f (x) = Θ (g (x)) iff f (x) = O (g (x)) และ g (x) = O (f (x))
นอกจากนี้ยังมีω
เครื่องหมาย- oh และ little-omega ( ) เล็ก ๆ น้อย ๆ ที่แสดงถึงส่วนบนและล่างของฟังก์ชันที่หลวม
เพื่อสรุป:
f(x) = O(g(x))
หมายความว่าอัตราการเติบโตของ (ใหญ่ OH)f(x)
เป็น asymptotically น้อยกว่าหรือเท่ากับg(x)
อัตราการเจริญเติบโตของ
f(x) = Ω(g(x))
(โอเมก้าใหญ่) หมายความว่าอัตราการเติบโตของf(x)
asymptotically มากกว่าหรือเท่ากับอัตราการเติบโตของg(x)
f(x) = o(g(x))
หมายถึง (เล็ก ๆ น้อย ๆ โอ้) ที่อัตราการเติบโตของf(x)
เป็น asymptotically น้อยกว่าg(x)
อัตราการเติบโตของ
f(x) = ω(g(x))
(โอเมก้าน้อย) หมายความว่าอัตราการเติบโตของf(x)
asymptotically มากกว่าอัตราการเติบโตของg(x)
f(x) = Θ(g(x))
(theta) หมายถึงอัตราการเติบโตของf(x)
asymptotically เท่ากับอัตราการเติบโตของg(x)
สำหรับการสนทนาที่ละเอียดยิ่งขึ้นคุณสามารถอ่านคำจำกัดความใน Wikipediaหรืออ่านหนังสือแบบคลาสสิกเช่น Introduction to Algorithms โดย Cormen et al
>= \Omega(...)
หมายถึง? ฉันเข้าใจว่าเราบอกว่ามันเป็นสมาชิก\Omega(...)
แต่ถ้ามันยิ่งใหญ่กว่านี้? มันทำให้รู้สึกอะไร
มีวิธีง่าย ๆ (เคล็ดลับฉันเดา) ที่ต้องจำว่าสัญลักษณ์หมายถึงอะไร
สัญลักษณ์ Big-O ทั้งหมดสามารถพิจารณาได้ว่ามีบาร์
เมื่อดูที่Ωแถบนั้นจะอยู่ที่ด้านล่างดังนั้นมันจึงเป็นขอบเขต (เชิงเส้นกำกับ)
เมื่อมองที่Θแถบนั้นจะอยู่ตรงกลาง ดังนั้นมันจึงเป็นขอบเขตที่ จำกัด (asymptotic)
เมื่อการเขียนด้วยลายมือ O คุณมักจะจบที่ด้านบนและวาด squiggle ดังนั้น O (n) คือขอบเขตบนของฟังก์ชัน เพื่อความเป็นธรรมอันนี้จะไม่ทำงานกับแบบอักษรส่วนใหญ่ แต่มันเป็นเหตุผลที่แท้จริงของชื่อ
หนึ่งคือบิ๊ก "O"
หนึ่งคือ Big Theta
http://en.wikipedia.org/wiki/Big_O_notation
Big O หมายถึงอัลกอริทึมของคุณจะดำเนินการในไม่เกินขั้นตอนในนิพจน์ที่กำหนด (n ^ 2)
Big Omega หมายความว่าอัลกอริทึมของคุณจะดำเนินการในไม่น้อยกว่าขั้นตอนในนิพจน์ที่กำหนด (n ^ 2)
เมื่อเงื่อนไขทั้งสองเป็นจริงสำหรับนิพจน์เดียวกันคุณสามารถใช้สัญกรณ์ theta ขนาดใหญ่ ....
แทนที่จะให้คำจำกัดความทางทฤษฎีซึ่งสรุปไว้อย่างสวยงามที่นี่แล้วฉันจะยกตัวอย่างง่ายๆ:
สมมติเวลาการทำงานของการมีf(i)
O(1)
ด้านล่างเป็นส่วนรหัสที่มีรันไทม์ asymptotic Θ(n)
คือ มันมักจะเรียกฟังก์ชั่นf(...)
n
ครั้ง ทั้งขอบล่างและขอบบนคือ n
for(int i=0; i<n; i++){
f(i);
}
ส่วนรหัสสองด้านล่างมีรันไทม์ asymptotic O(n)
ของ มันเรียกฟังก์ชั่นf(...)
ใน n
เวลาส่วนใหญ่ ผูกพันบนเป็น n แต่ลดผูกพันที่อาจจะΩ(1)
หรือขึ้นอยู่กับสิ่งที่เกิดขึ้นภายในΩ(log(n))
f2(i)
for(int i=0; i<n; i++){
if( f2(i) ) break;
f(i);
}
Θ(n)
จะเพิ่มขึ้นแบบเชิงเส้นเมื่อ n เพิ่มขึ้นเช่นรันไทม์ T สามารถแสดงเป็น T (n) = a * n + b สำหรับค่าเล็กน้อยของ n (เช่น n = 1 หรือ 2) นี่อาจไม่ใช่วิธีที่ดีที่สุดในการอธิบายพฤติกรรม - บางทีคุณอาจมีรหัสเริ่มต้นบางตัวที่ใช้เวลานานกว่า f (i)
Theta เป็นวิธีย่อของการอ้างอิงถึงคำบรรยายพิเศษที่ O และ Omega ตัวใหญ่เหมือนกัน
ดังนั้นหากมีการเรียกร้องThe Theta is expression q
จากนั้นพวกเขายังจำเป็นต้องอ้างว่าและBig O is expression q
Omega is expression q
การเปรียบเทียบหยาบ:
ถ้า: Theta อ้างว่า "สัตว์นั้นมี 5 ขา" จากนั้นจะเป็นดังนี้: บิ๊กโอเป็นความจริง ("สัตว์นั้นมีน้อยกว่าหรือเท่ากับ 5 ขา") และโอเมก้าเป็นจริง ("สัตว์นั้นมีมากกว่าหรือเท่ากับ 5 ขา")
มันเป็นเพียงการเปรียบเทียบคร่าวๆเพราะการแสดงออกไม่จำเป็นต้องใช้จำนวนเฉพาะ แต่แทนที่จะทำหน้าที่ของคำสั่งที่แตกต่างกันของขนาดเช่น log (n), n, n ^ 2, (ฯลฯ )
แผนภูมิจะทำให้คำตอบก่อนง่ายต่อการเข้าใจ:
เป็นภาษาอังกฤษ,
ทางด้านซ้ายโปรดทราบว่ามีขอบเขตบนและขอบเขตล่างที่มีขนาดเท่ากันทั้งคู่ (เช่นg (n) ) ไม่สนใจค่าคงที่และหากขอบเขตบนและขอบเขตล่างมีลำดับความสำคัญเท่ากันเราสามารถบอกได้ว่าf (n) = Θ (g (n))หรือf (n) อยู่ในทีทีใหญ่ของ g (n)(n)
เริ่มจากด้านขวาตัวอย่างที่ง่ายกว่าคือการบอกว่าขอบเขตg (n)นั้นเป็นเพียงลำดับของขนาดและไม่สนใจค่าคงที่c (เช่นเดียวกับสัญลักษณ์O ขนาดใหญ่ทั้งหมด)
f(n)
เป็นของO(n)
หากมีอยู่ในเชิงบวกk
เป็นf(n)<=k*n
f(n)
เป็นΘ(n)
ถ้ามีอยู่ในเชิงบวกk1
, k2
เป็นk1*n<=f(n)<=k2*n
ลองพิจารณาf(n) > 0
และสำหรับทุกg(n) > 0
n
มันโอเคที่จะพิจารณาเรื่องนี้เพราะอัลกอริทึมจริงที่เร็วที่สุดมีการดำเนินการอย่างน้อยหนึ่งครั้งและดำเนินการให้เสร็จสิ้นหลังจากเริ่มต้น สิ่งนี้จะทำให้แคลคูลัสง่ายขึ้นเพราะเราสามารถใช้ค่า ( f(n)
) แทนค่าสัมบูรณ์ ( |f(n)|
)
f(n) = O(g(n))
ทั่วไป:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ g(n)
สำหรับg(n) = n
:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ n
ตัวอย่าง:
Expression Value of the limit
------------------------------------------------
n = O(n) 1
1/2*n = O(n) 1/2
2*n = O(n) 2
n+log(n) = O(n) 1
n = O(n*log(n)) 0
n = O(n²) 0
n = O(nⁿ) 0
counterexamples:
Expression Value of the limit
-------------------------------------------------
n ≠ O(log(n)) ∞
1/2*n ≠ O(sqrt(n)) ∞
2*n ≠ O(1) ∞
n+log(n) ≠ O(log(n)) ∞
f(n) = Θ(g(n))
ทั่วไป:
f(n)
0 < lim ──────── < ∞
n➜∞ g(n)
สำหรับg(n) = n
:
f(n)
0 < lim ──────── < ∞
n➜∞ n
ตัวอย่าง:
Expression Value of the limit
------------------------------------------------
n = Θ(n) 1
1/2*n = Θ(n) 1/2
2*n = Θ(n) 2
n+log(n) = Θ(n) 1
counterexamples:
Expression Value of the limit
-------------------------------------------------
n ≠ Θ(log(n)) ∞
1/2*n ≠ Θ(sqrt(n)) ∞
2*n ≠ Θ(1) ∞
n+log(n) ≠ Θ(log(n)) ∞
n ≠ Θ(n*log(n)) 0
n ≠ Θ(n²) 0
n ≠ Θ(nⁿ) 0
สรุป: เราถือว่าโอใหญ่, ใหญ่และใหญ่เหมือนกัน
ทำไม? ฉันจะบอกเหตุผลด้านล่าง:
ประการแรกฉันจะชี้แจงอย่างผิด ๆ คำเดียวบางคนคิดว่าเราแค่ดูแลความซับซ้อนของเวลาที่เลวร้ายที่สุดดังนั้นเราจึงใช้ O ใหญ่แทนการใหญ่ big ฉันจะบอกว่าผู้ชายคนนี้กำลังพล่าม ขอบเขตบนและล่างใช้เพื่ออธิบายฟังก์ชันเดียวไม่ใช้เพื่ออธิบายความซับซ้อนของเวลา ฟังก์ชั่นเวลาที่เลวร้ายที่สุดมีขอบเขตบนและล่าง; ฟังก์ชั่นเวลาที่ดีที่สุดมีขอบเขตบนและล่างเช่นกัน
เพื่ออธิบายความสัมพันธ์ระหว่าง O และบิ๊ก and ได้อย่างชัดเจนฉันจะอธิบายความสัมพันธ์ระหว่างโอใหญ่และเล็กก่อน จากคำจำกัดความเราสามารถรู้ได้ง่ายว่า o ขนาดเล็กเป็นเซตย่อยของ O ขนาดใหญ่ตัวอย่างเช่น:
T (n) = n ^ 2 + n เราสามารถพูดได้ T (n) = O (n ^ 2), T (n) = O (n ^ 3), T (n) = O (n ^ 4) แต่สำหรับขนาดเล็ก o, T (n) = o (n ^ 2) ไม่ตรงกับคำจำกัดความของ o ขนาดเล็ก ดังนั้นแค่ T (n) = o (n ^ 3), T (n) = o (n ^ 4) ถูกต้องสำหรับ o ขนาดเล็ก ซ้ำซ้อน T (n) = O (n ^ 2) คืออะไร? มันใหญ่θ!
โดยทั่วไปเราบอกว่าใหญ่ O คือ O (n ^ 2) แทบจะไม่พูดว่า T (n) = O (n ^ 3), T (n) = O (n ^ 4) ทำไม? เพราะเราถือว่า O ใหญ่เป็นใหญ่โดยไม่รู้ตัว
ในทำนองเดียวกันเรายังถือว่า big ใหญ่เป็นจิตใต้สำนึก
ในคำเดียว O ใหญ่ใหญ่ big และใหญ่Ωนั้นไม่เหมือนกันจากคำจำกัดความ แต่มันเป็นสิ่งเดียวกันในปากและสมองของเรา