อะไรคือความแตกต่างระหว่างΘ (n) และ O (n)


427

บางครั้งฉันเห็นΘ (n) ที่มีสัญลักษณ์แปลก ๆ with มีบางอย่างอยู่ตรงกลางและบางครั้งก็แค่ O (n) มันเป็นความขี้เกียจในการพิมพ์เพราะไม่มีใครรู้วิธีพิมพ์สัญลักษณ์นี้หรือว่ามันมีความแตกต่างกันบ้าง?


8
ไม่ชัดเจน แต่คำถามนี้ซ้ำซ้อนกับstackoverflow.com/questions/464078/…จากเมื่อวานนี้
บิล Lizard

คำตอบ:


600

คำอธิบายสั้น ๆ :

หากอัลกอริทึมเป็นΘ (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


1
หาก "หากอัลกอริทึมเป็น O (g (n)) ก็หมายความว่าเวลาทำงานของอัลกอริทึมเมื่อ n มีขนาดใหญ่ขึ้นจะเป็นสัดส่วนกับ g (n) มากที่สุด" แล้วคุณจะพูดอย่างไรว่า "โดยทั่วไปเมื่อเราพูดถึงอัลกอริธึมคือ O (n) มันก็เป็น O (n2), O (n1000000), O (2n)," ??
Andy897

@ Andy897 มันเป็นไปตามคำจำกัดความของ "สัดส่วน" จากวิกิพีเดีย: "ในคณิตศาสตร์ตัวแปรสองตัวมีสัดส่วนถ้าการเปลี่ยนแปลงในหนึ่งมาพร้อมกับการเปลี่ยนแปลงในอื่น ๆ เสมอและถ้าการเปลี่ยนแปลงนั้นสัมพันธ์กันเสมอโดยใช้ตัวคูณคงที่ค่าคงที่เรียกว่าสัมประสิทธิ์สัดส่วนหรือสัดส่วน อย่างต่อเนื่อง."
Mehrdad Afshari

อะไร>= \Omega(...)หมายถึง? ฉันเข้าใจว่าเราบอกว่ามันเป็นสมาชิก\Omega(...)แต่ถ้ามันยิ่งใหญ่กว่านี้? มันทำให้รู้สึกอะไร
Johannes Schaub - litb

328

มีวิธีง่าย ๆ (เคล็ดลับฉันเดา) ที่ต้องจำว่าสัญลักษณ์หมายถึงอะไร

สัญลักษณ์ Big-O ทั้งหมดสามารถพิจารณาได้ว่ามีบาร์

เมื่อดูที่Ωแถบนั้นจะอยู่ที่ด้านล่างดังนั้นมันจึงเป็นขอบเขต (เชิงเส้นกำกับ)

เมื่อมองที่Θแถบนั้นจะอยู่ตรงกลาง ดังนั้นมันจึงเป็นขอบเขตที่ จำกัด (asymptotic)

เมื่อการเขียนด้วยลายมือ O คุณมักจะจบที่ด้านบนและวาด squiggle ดังนั้น O (n) คือขอบเขตบนของฟังก์ชัน เพื่อความเป็นธรรมอันนี้จะไม่ทำงานกับแบบอักษรส่วนใหญ่ แต่มันเป็นเหตุผลที่แท้จริงของชื่อ


5
ฉันมักจะไม่ตอบคำถามใด ๆ ต่ำกว่า 3-4 ข้อ นี่มันคุ้มค่ากับการนั่ง ขอบคุณที่แบ่งปันเคล็ดลับ : D
เป็นไปไม่ได้

56

หนึ่งคือบิ๊ก "O"

หนึ่งคือ Big Theta

http://en.wikipedia.org/wiki/Big_O_notation

Big O หมายถึงอัลกอริทึมของคุณจะดำเนินการในไม่เกินขั้นตอนในนิพจน์ที่กำหนด (n ^ 2)

Big Omega หมายความว่าอัลกอริทึมของคุณจะดำเนินการในไม่น้อยกว่าขั้นตอนในนิพจน์ที่กำหนด (n ^ 2)

เมื่อเงื่อนไขทั้งสองเป็นจริงสำหรับนิพจน์เดียวกันคุณสามารถใช้สัญกรณ์ theta ขนาดใหญ่ ....


20
แต่ผิด! จำนวนขั้นบันไดถูกล้อมรอบด้วย n ^ 2 เมื่อ n มีขนาดใหญ่มาก อย่างไรก็ตามอัลกอริทึมที่ทำงานในขั้นตอน n ^ 2 + c นั้นมากกว่า n ^ 2 ขั้นตอน แต่ยังคงเป็น O (n ^ 2) สัญกรณ์ Big-O เพียงอธิบายbeahviour asymptotic
HenryR

1
นี่ไม่ใช่จุดจบทั้งหมดเป็นคำจำกัดความทั้งหมด มันเป็นเพียงจุดเริ่มต้น .... เนื่องจากเรากำลังพูดถึงสัญรูปแบบเชิงสัญลักษณ์เมื่อ n เข้าใกล้อนันต์ ค่าคงที่ C จะกลายเป็นตัวประกอบ
l_39217_l

1
ในขณะที่ฉันชอบความเรียบง่ายของคำตอบนี้ควรสังเกตว่าอัลกอริทึม O (n ^ 2) อาจใช้ขั้นตอน 1,000,000,000 * n ^ 2 ขั้นตอนในการดำเนินการได้เป็นอย่างดีซึ่งมีขนาดใหญ่กว่า n ^ 2 อย่างมาก อัลกอริทึมที่เป็น O (n ^ 2) เพียงหมายความว่ามันจะใช้เวลาไม่เกิน k * n ^ 2 ขั้นตอนในการดำเนินการโดยที่ k คือจำนวนจริงบวก
MarredCheese

38

แทนที่จะให้คำจำกัดความทางทฤษฎีซึ่งสรุปไว้อย่างสวยงามที่นี่แล้วฉันจะยกตัวอย่างง่ายๆ:

สมมติเวลาการทำงานของการมี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);
}

คุณหมายถึงอะไรโดย "asymptotic runtime"?
chopper วาด lion4

1
ซีมโทติคในบริบทนี้หมายถึง "มีขนาดใหญ่พอที่ n" รันไทม์ของส่วนของโค้ดที่รันไทม์แบบอะซิมโทติคΘ(n)จะเพิ่มขึ้นแบบเชิงเส้นเมื่อ n เพิ่มขึ้นเช่นรันไทม์ T สามารถแสดงเป็น T (n) = a * n + b สำหรับค่าเล็กน้อยของ n (เช่น n = 1 หรือ 2) นี่อาจไม่ใช่วิธีที่ดีที่สุดในการอธิบายพฤติกรรม - บางทีคุณอาจมีรหัสเริ่มต้นบางตัวที่ใช้เวลานานกว่า f (i)
kara deniz

11

Theta เป็นวิธีย่อของการอ้างอิงถึงคำบรรยายพิเศษที่ O และ Omega ตัวใหญ่เหมือนกัน

ดังนั้นหากมีการเรียกร้องThe Theta is expression qจากนั้นพวกเขายังจำเป็นต้องอ้างว่าและBig O is expression qOmega is expression q


การเปรียบเทียบหยาบ:

ถ้า: Theta อ้างว่า "สัตว์นั้นมี 5 ขา" จากนั้นจะเป็นดังนี้: บิ๊กโอเป็นความจริง ("สัตว์นั้นมีน้อยกว่าหรือเท่ากับ 5 ขา") และโอเมก้าเป็นจริง ("สัตว์นั้นมีมากกว่าหรือเท่ากับ 5 ขา")

มันเป็นเพียงการเปรียบเทียบคร่าวๆเพราะการแสดงออกไม่จำเป็นต้องใช้จำนวนเฉพาะ แต่แทนที่จะทำหน้าที่ของคำสั่งที่แตกต่างกันของขนาดเช่น log (n), n, n ^ 2, (ฯลฯ )


11

แผนภูมิจะทำให้คำตอบก่อนง่ายต่อการเข้าใจ:

Θ-Notation - ลำดับเดียวกัน | O-Notation - ขอบบน

Θ (n) - คำสั่งเดียวกัน O (n) - ขอบบน

เป็นภาษาอังกฤษ,

ทางด้านซ้ายโปรดทราบว่ามีขอบเขตบนและขอบเขตล่างที่มีขนาดเท่ากันทั้งคู่ (เช่นg (n) ) ไม่สนใจค่าคงที่และหากขอบเขตบนและขอบเขตล่างมีลำดับความสำคัญเท่ากันเราสามารถบอกได้ว่าf (n) = Θ (g (n))หรือf (n) อยู่ในทีทีใหญ่ของ g (n)(n)

เริ่มจากด้านขวาตัวอย่างที่ง่ายกว่าคือการบอกว่าขอบเขตg (n)นั้นเป็นเพียงลำดับของขนาดและไม่สนใจค่าคงที่c (เช่นเดียวกับสัญลักษณ์O ขนาดใหญ่ทั้งหมด)


คุณทำให้คำและกราฟสับสน
kushalvm

@ kushalvm ขอบคุณสำหรับความซื่อสัตย์ คุณช่วยอธิบายสิ่งที่คุณหมายถึงโดยเฉพาะอย่างยิ่ง? เพื่อการเรียนรู้ของฉันและคนอื่น ๆ ที่อาจสับสนกับคำตอบนี้ :-)
Ricardo

บรรทัดสุดท้ายของย่อหน้าสุดท้ายไม่ควรเป็น f (n) Theta of g (n) ใช่ไหม
kushalvm

@ kushalvm ขอบคุณสำหรับการชี้แจง ฉันเปลี่ยนข้อความของบรรทัดสุดท้ายของย่อหน้าก่อนหน้าสุดท้ายเพื่อแก้ไขข้อผิดพลาดภาษาอังกฤษของฉัน
Ricardo

ดูเพิ่มเติมเกี่ยวกับการออกเสียง
Ricardo

6

f(n)เป็นของO(n)หากมีอยู่ในเชิงบวกkเป็นf(n)<=k*n

f(n)เป็นΘ(n)ถ้ามีอยู่ในเชิงบวกk1, k2เป็นk1*n<=f(n)<=k2*n

บทความ Wikipedia เกี่ยวกับสัญลักษณ์ Big O


1
คุณพลาดจุดสำคัญ - สิ่งเหล่านี้เป็นจริงสำหรับ n> n1 ทั้งหมดเท่านั้นนั่นคือ asymptotically
HenryR

n> n1 หมายถึงอะไร
chopper วาด lion4

3

ใช้ข้อ จำกัด

ลองพิจารณาf(n) > 0และสำหรับทุกg(n) > 0 nมันโอเคที่จะพิจารณาเรื่องนี้เพราะอัลกอริทึมจริงที่เร็วที่สุดมีการดำเนินการอย่างน้อยหนึ่งครั้งและดำเนินการให้เสร็จสิ้นหลังจากเริ่มต้น สิ่งนี้จะทำให้แคลคูลัสง่ายขึ้นเพราะเราสามารถใช้ค่า ( f(n)) แทนค่าสัมบูรณ์ ( |f(n)|)

  1. 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))                 ∞
    
  2. 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
    

2

สรุป: เราถือว่าโอใหญ่, ใหญ่และใหญ่เหมือนกัน

ทำไม? ฉันจะบอกเหตุผลด้านล่าง:

ประการแรกฉันจะชี้แจงอย่างผิด ๆ คำเดียวบางคนคิดว่าเราแค่ดูแลความซับซ้อนของเวลาที่เลวร้ายที่สุดดังนั้นเราจึงใช้ 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 และใหญ่Ωนั้นไม่เหมือนกันจากคำจำกัดความ แต่มันเป็นสิ่งเดียวกันในปากและสมองของเรา


ทำไมเนื้อหานี้จึงถูกจัดรูปแบบเป็นเครื่องหมายคำพูด? คือมันอ้างจากแหล่งภายนอกหรือไม่? ถ้าเป็นเช่นนั้นแหล่งที่มาควรจะเชื่อมโยงหรือระบุเป็นอย่างอื่น หากไม่มีการฟอร์แมตใบเสนอราคาควรถูกลบออก
Mark Amery
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.