Big O คำถามเกี่ยวกับอัลกอริทึมที่มีอัตราการขยายตัว (n ^ 2 + n) / 2


16

ฉันถามคำถามนี้เพราะฉันสับสนในแง่มุมหนึ่งเกี่ยวกับสัญกรณ์ O ใหญ่

ฉันใช้หนังสือโครงสร้างข้อมูลและบทคัดย่อกับ Javaโดย Frank Carrano ในบทเกี่ยวกับ "ประสิทธิภาพของอัลกอริทึม" เขาแสดงอัลกอริทึมต่อไปนี้:

int sum = 0, i = 1, j = 1
for (i = 1 to n) {
    for (j = 1 to i)
        sum = sum + 1
}

สมัยก่อนเขาอธิบายขั้นตอนวิธีนี้มีอัตราการเติบโต(n 2  + n) / 2 ซึ่งดูง่าย

อย่างไรก็ตามมีการระบุไว้ว่า(n 2  + n) / 2จะทำงานเหมือนn 2เมื่อnมีขนาดใหญ่ ในวรรคเดียวกันเขากล่าว(n 2  + n) / 2นอกจากนี้ยังมีพฤติกรรมเหมือนn 2 / 2 เขาใช้นี้ที่จะจัดขั้นตอนวิธีการดังกล่าวข้างต้นเป็นO (n 2 )

ฉันได้รับที่(n 2  + n) / 2 มีความคล้ายคลึงกับn 2 / 2เพราะร้อยละฉลาดnที่ทำให้แตกต่างเล็ก ๆ น้อย ๆ สิ่งที่ฉันไม่ได้รับคือสาเหตุ(n 2  + n) / 2และn 2มีความคล้ายคลึงกันเมื่อnมีขนาดใหญ่

ตัวอย่างเช่นถ้าn = 1,000,000 :

(n^2 + n) / 2 =  500000500000 (5.000005e+11)
(n^2) / 2     =  500000000000 (5e+11)
(n^2)         = 1000000000000 (1e+12)

อันสุดท้ายไม่เหมือนกันเลย ในความเป็นจริงค่อนข้างชัดเจนว่ามันเป็นสองเท่าเท่ากลาง แล้วแฟรงค์คาร์ราโน่พูดได้อย่างไรว่าพวกเขาเหมือนกัน อัลกอริทึมจัดเป็นO (n 2 )อย่างไร เมื่อดูที่วงในฉันจะบอกว่ามันคือn 2 + n / 2


หากคุณสนใจฉันได้รับคำตอบสำหรับสามลูปซ้อนกับการดำเนินการตรวจสอบแผนภาพต้นไม้ปริศนาที่เกี่ยวข้องกับลูปซ้อน
Grijesh Chauhan



1
โดยพื้นฐานแล้วความคิดก็คือเมื่อnเติบโตขึ้นทั้งฟังก์ชั่น 'n ^ 2` และฟังก์ชั่นของคุณก็จะทำงานในทำนองเดียวกันนั่นคืออัตราการเติบโตที่คงที่ หากคุณมีการแสดงออกที่ซับซ้อนฟังก์ชั่นที่เติบโตได้เร็วขึ้นครอง
AK_

1
@MichaelT: ฉันไม่คิดว่านี่เป็นคำถามที่ซ้ำซ้อนเพราะอีกข้อหนึ่งเป็นเพียงการนับผิด นี่เป็นคำถามที่ละเอียดยิ่งขึ้นเกี่ยวกับสาเหตุที่ทำให้คำที่น้อยกว่า (โดยเฉพาะตัวคูณคงที่และพหุนามต่ำกว่า) ถูกละเว้น เห็นได้ชัดว่าผู้ถามที่นี่เข้าใจปัญหาที่เกิดขึ้นในคำถามอื่นแล้วและคำตอบที่เพียงพอสำหรับคำถามนั้นจะไม่ตอบคำถามนี้
sdenham

คำตอบ:


38

เมื่อคำนวณความซับซ้อน Big-O ของอัลกอริทึมสิ่งที่แสดงคือปัจจัยที่ให้การสนับสนุนมากที่สุดในการเพิ่มเวลาดำเนินการถ้าจำนวนองค์ประกอบที่คุณเรียกใช้อัลกอริทึมมากกว่าเพิ่มขึ้น

ถ้าคุณมีอัลกอริทึมที่มีความซับซ้อนของ(n^2 + n)/2และคุณสองเท่าของจำนวนขององค์ประกอบที่แล้วคง2ไม่ส่งผลต่อการเพิ่มขึ้นในเวลาที่ดำเนินการที่คำว่าnทำให้เกิดการเพิ่มขึ้นในเวลาดำเนินการและคำว่าn^2เป็นสาเหตุของการเพิ่มขึ้นสี่เท่าในการดำเนินการ เวลา.
ในฐานะที่เป็นn^2ระยะที่มีผลงานที่ใหญ่ที่สุดซับซ้อน Big-O O(n^2)คือ


2
ฉันชอบที่มันจะชัดเจนขึ้นเล็กน้อย
Andrew S

7
มือนี้เป็นลอนมาก อาจเป็นจริงหรืออาจเป็นเท็จ หากคุณสามารถใช้คณิตศาสตร์จำนวนเล็กน้อยดูคำตอบด้านล่าง
usr

2
เหตุผลนี้คลุมเครือเกินไป: หมายความว่าเราสามารถสรุปได้O(n * log n) = O(n)ซึ่งไม่เป็นความจริง
cfh

อาจไม่ใช่คำตอบที่แม่นยำที่สุดหรือถูกต้องที่สุดในเชิงความหมาย แต่สิ่งที่สำคัญที่นี่คือมันทำให้ฉันเริ่มเข้าใจจุดศูนย์กลางและฉันคิดว่านั่นเป็นเป้าหมายของผู้เขียน เป็นเรื่องที่คลุมเครืออย่างจงใจเนื่องจากรายละเอียดมักเบี่ยงเบนความสนใจไปจากหลักการสำคัญ มันเป็นสิ่งสำคัญที่จะเห็นไม้สำหรับต้นไม้
Andrew S

บาร์ตพูดถึงศัพท์จริงๆไม่ใช่ปัจจัย O(n * log n) = O(n)การทำความเข้าใจว่าเราไม่สามารถสรุปได้ว่า ฉันคิดว่านี่เป็นคำอธิบายที่ดีเกี่ยวกับเหตุผลเบื้องหลังคำจำกัดความ
ทำเครื่องหมาย Foskey

10

ความหมายคือ

f(n) = O(g(n))

หากมีค่าคงที่ C> 0 อยู่เช่นนั้นสำหรับ n ทั้งหมดมากกว่า n_0 ทั้งหมดเราก็มี

|f(n)| <= C * |g(n)|

นี่เป็นความจริงที่ชัดเจนสำหรับ f (n) = n ^ 2 และ g (n) = 1/2 n ^ 2 โดยที่ค่าคงที่ C ควรเป็น 2 นอกจากนี้ยังง่ายต่อการเห็นว่าเป็นจริงสำหรับ f (n) = n ^ 2 และ g (n) = 1/2 (n ^ 2 + n)


4
"ถ้ามีค่าคงที่ C> 0 เช่นนั้น, forr all n," ควรเป็น "ถ้ามีค่าคงที่บางค่า C, n_0 เช่นนั้น, สำหรับ n> n_0 ทั้งหมด,"
Taemyr

@Taemyr: ตราบใดที่ฟังก์ชั่นgไม่ใช่ศูนย์ที่จริงไม่จำเป็นต้องเป็นคุณก็สามารถเพิ่มอย่างต่อเนื่อง C เพื่อให้คำสั่งที่เป็นจริงสำหรับหลายขีดค่า n_0 แรก
cfh

ไม่เราตราบใดที่เรากำลังมองหาฟังก์ชั่นไม่มีจำนวนที่แน่นอนของค่า n_0 ที่อาจเกิดขึ้น
Taemyr

@Taemyr: n_0 เป็นจำนวน จำกัด เลือก C = สูงสุด {f (i) / g (i): i = 1, ... , n_0} จากนั้นคำสั่งจะเก็บค่า n_0 แรกเสมอเนื่องจากคุณสามารถตรวจสอบได้ง่าย
cfh

ใน CS นี่เป็นเรื่องที่น่ากังวลน้อยกว่าเพราะ n มักจะเป็นขนาดอินพุตดังนั้นจึงรอบคอบ ในกรณีใดใครสามารถเลือก C เพื่อให้ n_0 = 1 ทำงาน แต่คำจำกัดความที่เป็นทางการคือ n ที่ใหญ่กว่าขีด จำกัด บางตัวซึ่งจะลบ nitpicking จำนวนมากทั้งหมดในการใช้คำจำกัดความ
Taemyr

6

เมื่อพูดถึงความซับซ้อนคุณจะสนใจเฉพาะการเปลี่ยนแปลงตัวประกอบเวลาเท่านั้นตามจำนวนองค์ประกอบ ( n)

เช่นนี้คุณสามารถลบปัจจัยคงที่ (เช่นที่2นี่)

O(n^2 + n)ใบนี้คุณมี

ตอนนี้สำหรับขนาดใหญ่เหมาะสมnสินค้าคือn * nจะมีขนาดใหญ่กว่าอย่างมีนัยสำคัญเพียงซึ่งเป็นเหตุผลที่คุณได้รับอนุญาตให้ข้ามส่วนที่เช่นกันซึ่งใบคุณแน่นอนมีความซับซ้อนสุดท้ายของnO(n^2)

มันเป็นความจริงสำหรับตัวเลขขนาดเล็กจะมีความแตกต่างอย่างมีนัยสำคัญ แต่นี้จะกลายเป็นมากขึ้นเล็กน้อยที่ใหญ่กว่าของคุณnจะกลายเป็น


ต้องมีขนาดเท่าไหร่สำหรับความแตกต่างเพื่อกลายเป็นชายขอบ? นอกจากนี้ทำไม / 2 จึงถูกลบการมีอยู่ของมันจึงลดลงครึ่งหนึ่ง
แอนดรู S

6
@AndrewS เนื่องจาก Big O Notation พูดเกี่ยวกับการเติบโต การหารด้วย 2 นั้นไม่เกี่ยวข้องนอกบริบทของการวัดประสิทธิภาพและการประทับเวลาเพราะท้ายที่สุดมันจะไม่เปลี่ยนแปลงอัตราการเติบโต อย่างไรก็ตามองค์ประกอบที่ใหญ่ที่สุดทำและนั่นคือทั้งหมดที่คุณเก็บไว้
Neil

2
@ นีแอลสดใสมาก ๆ ฉันหวังว่าหนังสือจะเป็นแบบนั้น บางครั้งฉันคิดว่าผู้เขียนรู้มากเกินไปว่าพวกเขาลืมไปว่ามนุษย์ปุถุชนไม่ได้มีความรู้ในการใช้งานและดังนั้นจึงไม่ได้ให้ความสำคัญในจุดที่ชัดเจน แต่แทนที่จะฝังไว้ในคำอธิบายทางคณิตศาสตร์อย่างเป็นทางการ
แอนดรู S

ฉันหวังว่าฉันจะเอาชนะคำตอบนี้ได้มากกว่าหนึ่งครั้ง! @ Neil คุณควรจะเขียนหนังสือ Big O
Tersosauros

3

มันไม่ได้ว่า "(n² + n) / 2 พฤติกรรมเช่นn²เมื่อ n เป็นใหญ่" ก็ว่า (n² + n) / 2 เติบโตเช่นเป็น n เพิ่มขึ้น

ตัวอย่างเช่นเมื่อ n เพิ่มขึ้นจาก 1,000 เป็น 1,000,000

(n² + n) / 2  increases from  500500 to  500000500000
(n²) / 2      increases from  500000 to  500000000000
(n²)          increases from 1000000 to 1000000000000

ในทำนองเดียวกันเมื่อ n เพิ่มขึ้นจาก 1,000,000 เป็น 1,000,000,000

(n² + n) / 2  increases from  500000500000 to  500000000500000000
(n²) / 2      increases from  500000000000 to  500000000000000000
(n²)          increases from 1000000000000 to 1000000000000000000

พวกเขาเติบโตในทำนองเดียวกันซึ่งเป็นสัญกรณ์บิ๊กโอเป็นเรื่องเกี่ยวกับ

หากคุณพล็อต (n² + n) / 2 และn² / 2 บน Wolfram Alphaพวกมันคล้ายกันมากจนแยกแยะได้ยากโดย n = 100 หากคุณพล็อตทั้งสามใน Wolfram Alphaคุณจะเห็นเส้นสองเส้นคั่นด้วยค่าคงที่เท่ากับ 2


นี่เป็นสิ่งที่ดีมันทำให้ฉันชัดเจนมาก ขอบคุณที่ตอบกลับ
Andrew S

2

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

ดังที่คุณทราบสัญกรณ์นี้แสดงถึงการเปรียบเทียบฟังก์ชั่นแบบซีมโทติคและการเขียนf = O (g)หมายความว่าf (n)เติบโตขึ้นอย่างรวดเร็วที่สุดเท่าที่g (n)เมื่อnไปไม่มีที่สิ้นสุด วิธีง่ายๆในการแปลสิ่งนี้คือการพูดว่าฟังก์ชั่นf / gมีขอบเขต แต่แน่นอนเราต้องดูแลในสถานที่ที่ก.เป็นศูนย์และเราจบลงด้วยคำนิยามที่แข็งแกร่งมากขึ้นที่คุณสามารถอ่านเกือบทุกที่

สัญลักษณ์นี้จะเปิดออกจะสะดวกมากสำหรับการคำนวณ - นี่คือเหตุผลที่มันเป็นที่แพร่หลายดังนั้น - แต่มันควรจะจัดการกับการดูแลเป็นเครื่องหมายเท่ากับที่เราเห็นมีไม่แสดงถึงความเท่าเทียมกันของฟังก์ชั่น นี่เหมือนกับการบอกว่า2 = 5 mod 3ไม่ได้แปลว่า2 = 5และถ้าคุณกระตือรือร้นกับพีชคณิตคุณสามารถเข้าใจสัญกรณ์ O ขนาดใหญ่ในฐานะที่เป็นโมดูโลที่เท่าเทียมกัน

ตอนนี้เพื่อย้อนกลับไปยังคำถามเฉพาะของคุณมันไม่มีประโยชน์โดยสิ้นเชิงในการคำนวณค่าตัวเลขสองสามค่าและเปรียบเทียบกับค่าเหล่านั้น: อย่างไรก็ตามหนึ่งล้านตัวที่มีขนาดใหญ่จะไม่นับรวมถึงพฤติกรรมเชิงซีโมติก มันจะมีประโยชน์มากกว่าในการวางแผนอัตราส่วนของฟังก์ชั่นf (n) = n (n-1) / 2และg (n) = n² - แต่ในกรณีพิเศษนี้เราสามารถเห็นว่าf (n) / g (n)มีขนาดเล็กกว่า1/2ถ้าn> 0ซึ่งหมายความว่าf = O (g)

เพื่อปรับปรุงความเข้าใจในสัญกรณ์ของคุณคุณควร

  • ทำงานกับคำจำกัดความที่สะอาดไม่ใช่ความประทับใจที่คลุมเครือตามสิ่งที่คล้ายกัน - เมื่อคุณเพิ่งสัมผัสกับมันความประทับใจที่คลุมเครือนั้นใช้งานไม่ได้

  • ใช้เวลาในการหาตัวอย่างโดยละเอียด หากคุณออกกำลังกายอย่างน้อยห้าตัวอย่างภายในหนึ่งสัปดาห์มันจะเพียงพอที่จะปรับปรุงความมั่นใจของคุณ นี่คือความพยายามที่คุ้มค่าแน่นอน


Algebraic note noteถ้าAเป็นพีชคณิตของฟังก์ชันทั้งหมดΝ→ΝและC subalgebra ของฟังก์ชันที่มีขอบเขต, ให้ฟังก์ชันfชุดฟังก์ชันที่เป็นของO (f)คือC -submodule ของA , และกฎการคำนวณขนาดใหญ่ สัญกรณ์ O เพียงอธิบายว่าAทำงานกับซับโดเดลเหล่านี้ได้อย่างไร ดังนั้นความเท่าเทียมที่เราเห็นคือความเท่าเทียมกันของC -submodules ของAนี่เป็นมอดุลัสอีกประเภทหนึ่ง


1
บทความวิกิพีเดียนั้นยากที่จะติดตามหลังจากชิ้นเล็กชิ้นแรก มันถูกเขียนขึ้นสำหรับนักคณิตศาสตร์ที่ประสบความสำเร็จโดยนักคณิตศาสตร์ที่ประสบความสำเร็จและไม่ได้เป็นข้อความเบื้องต้นที่ฉันคาดหวังจากบทความสารานุกรม ขอบคุณสำหรับความเข้าใจของคุณแม้ว่ามันจะดีทั้งหมด
Andrew S

คุณประเมินค่าสูงกว่าระดับในเนื้อหาของ Wikipedia! :) มันไม่ได้เขียนไว้อย่างดีแน่นอน Graham, Knuth และ Patashnik เขียนหนังสือน่ารักเรื่อง "คณิตศาสตร์คณิตศาสตร์" สำหรับนักเรียนใน CS นอกจากนี้คุณยังสามารถลอง“ ศิลปะการเขียนโปรแกรมคอมพิวเตอร์” หรือหนังสือทฤษฎีตัวเลขที่เขียนในยุค 50 (Hardy & Wright, Rose) ตามที่พวกเขามักจะกำหนดเป้าหมายระดับนักเรียนมัธยมปลาย คุณไม่จำเป็นต้องอ่านหนังสือเต็มเล่มหากคุณเลือกหนังสือเพียงเล่มเดียวส่วนที่เกี่ยวกับซีมโทติค! แต่ก่อนที่คุณจะต้องตัดสินใจว่าคุณต้องเข้าใจมากแค่ไหน :)
Michael Le Barbier Grünewald

1

ฉันคิดว่าคุณเข้าใจผิดว่าสัญกรณ์ O ใหญ่หมายถึงอะไร

เมื่อคุณเห็น O (N ^ 2) โดยทั่วไปแล้วจะหมายถึง: เมื่อปัญหาใหญ่ขึ้น 10 เท่าเวลาที่จะแก้ปัญหาจะเป็น: 10 ^ 2 = 100 เท่า

มาเจาะ 1,000 และ 10,000 ในสมการของคุณ: 1,000: (1000 ^ 2 + 1,000) / 2 = 500500 10000: (10000 ^ 2 + 10,000) / 2 = 5,0005000

50005000/500500 = 99,91

ดังนั้นในขณะที่ N มีขนาดใหญ่ขึ้น 10 เท่าวิธีแก้ปัญหาก็ใหญ่ขึ้น 100 เท่า ดังนั้นจึงทำงาน: O (N ^ 2)


1

ถ้า n เป็น1,000,000แล้ว

(n^2 + n) / 2  =  500000500000  (5.00001E+11)
(n^2) / 2      =  500000000000  (5E+11)
(n^2)          = 1000000000000  (1E+12)

1000000000000.00 อะไร

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

มันทำให้เรามีสัดส่วน

หากอัลกอริทึมต้องทำบางสิ่งบางอย่างn²ครั้งจากนั้นจะใช้n²× c สำหรับค่าของ c นั่นคือระยะเวลาที่ใช้ในการวนซ้ำแต่ละครั้ง

หากอัลกอริทึมต้องทำบางสิ่งบางอย่างn²÷ 2 ครั้งมันจะใช้n²× c สำหรับค่าของ c ที่มีค่าเป็นสองเท่าของการทำซ้ำแต่ละครั้ง

ทั้งสองวิธีเวลาที่ใช้ยังคงเป็นสัดส่วนกับn²

ทีนี้ปัจจัยคงที่เหล่านี้ไม่ใช่สิ่งที่เราสามารถมองข้ามได้ แน่นอนคุณสามารถมีกรณีที่อัลกอริทึมที่มีความซับซ้อน O (n²) ทำได้ดีกว่าหนึ่งที่มีความซับซ้อน O (n) เพราะถ้าเรากำลังทำงานกับรายการจำนวนน้อยดังนั้นผลกระทบของปัจจัย consant จะยิ่งใหญ่และสามารถเอาชนะข้อกังวลอื่น ๆ . (แน่นอนแม้กระทั่ง O (n!) ก็เหมือนกับ O (1) สำหรับค่าต่ำที่เพียงพอของ n)

แต่พวกเขาไม่ใช่สิ่งที่ซับซ้อนบอกเราเกี่ยวกับ

ในทางปฏิบัติมีหลายวิธีที่เราสามารถปรับปรุงประสิทธิภาพของอัลกอริทึม:

  1. ปรับปรุงประสิทธิภาพของการวนซ้ำแต่ละครั้ง: O (n²) ยังคงทำงานในn²× c วินาที แต่ c มีขนาดเล็กลง
  2. ลดจำนวนเคสที่เห็น: O (n²) ยังคงทำงานในn²× c วินาที แต่ n มีขนาดเล็กลง
  3. แทนที่อัลกอริธึมด้วยสิ่งที่มีผลลัพธ์เหมือนกัน แต่ลดความซับซ้อนลง: เช่นถ้าเราสามารถเปลี่ยนบางสิ่งบางอย่าง O (n²) เป็น O (n log n) และเปลี่ยนจากn²×c₀วินาทีเป็น (n log n) ×c₁วินาที .

หรือมองอีกวิธีหนึ่งเรามีf(n)×cเวลาเพียงไม่กี่วินาทีและคุณสามารถปรับปรุงประสิทธิภาพโดยการcลดลดnหรือลดสิ่งที่ได้fรับกลับnมา

ครั้งแรกที่เราสามารถทำได้โดยไมโคร -opts ภายในวงหรือใช้ฮาร์ดแวร์ที่ดีกว่า มันจะให้การปรับปรุงเสมอ

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

ที่สามที่เราสามารถทำได้โดยใช้อัลกอริทึมที่แตกต่างกันอย่างสิ้นเชิง ตัวอย่างคลาสสิกจะแทนที่การเรียงลำดับฟองด้วย quicksort ด้วยจำนวนองค์ประกอบที่น้อยเราอาจทำให้สิ่งเลวร้ายลง (ถ้า c greater มากกว่าc₀) แต่โดยทั่วไปแล้วจะช่วยให้ได้รับผลประโยชน์มากที่สุดโดยเฉพาะกับ n ที่มีขนาดใหญ่มาก

ในการใช้งานจริงมาตรการความซับซ้อนช่วยให้เราสามารถให้เหตุผลเกี่ยวกับความแตกต่างระหว่างอัลกอริธึมได้อย่างแม่นยำเพราะพวกเขาไม่สนใจว่าการลด n หรือ c จะช่วยอย่างไรให้มีสมาธิในการฝึกฝน f()


"O (n!) เหมือนกับ O (1) สำหรับค่าต่ำที่เพียงพอของ n" นั้นผิด จะต้องมีวิธีที่ดีกว่าในการอธิบายว่า "เมื่อnถูกเก็บไว้ในระดับต่ำเพียงพอ Big-O ไม่สำคัญ"
Ben Voigt

@ BenVoigt ฉันยังไม่เคยเจอใครที่มีผลกระทบเชิงโวหารเช่นเดียวกับตอนที่ฉันอ่านครั้งแรก; ตอนแรกมันไม่ใช่ของฉันฉันขโมยมันมาจาก Eric Lippert ซึ่งอาจมีต้นกำเนิดมาจากหรืออาจเอามาจากคนอื่น แน่นอนว่ามันเป็นการอ้างอิงเรื่องตลกเช่น "πเท่ากับ 3 สำหรับค่าเล็ก ๆ ของπและค่ามากที่ 3" ซึ่งยังเก่ากว่า
Jon Hanna

0

ปัจจัยคงที่

จุดสัญกรณ์ O ใหญ่คือคุณสามารถเลือกปัจจัยคงที่ที่มีขนาดใหญ่ตามอำเภอใจดังนั้น O (function (n)) จะใหญ่กว่าฟังก์ชัน C * (n) เสมอ ถ้าอัลกอริทึม A ช้ากว่าอัลกอริธึม B เป็นพันล้านครั้งดังนั้นพวกมันก็มีความซับซ้อนของ O เหมือนกันตราบใดที่ความแตกต่างนั้นไม่เพิ่มขึ้นเมื่อ n โตขึ้นอย่างไม่มีกฎเกณฑ์

สมมติว่าเป็นปัจจัยคงที่ 1000000 เพื่อแสดงแนวคิด - มันมีขนาดใหญ่กว่าสิ่งที่จำเป็นเป็นล้านเท่า แต่นั่นแสดงให้เห็นถึงจุดที่พวกเขาคิดว่าไม่เกี่ยวข้อง

(n ^ 2 + n) / 2 "พอดีภายใน" O (n ^ 2) เพราะสำหรับ n ใด ๆ ไม่ว่าจะมีขนาดใหญ่เท่าใด (n ^ 2 + n) / 2 <1000000 * n ^ 2

(n ^ 2 + n) / 2 "ไม่พอดี" ชุดที่เล็กกว่าเช่น O (n) เพราะสำหรับบางค่า (n ^ 2 + n) / 2> 1000000 * n

ปัจจัยคงที่สามารถมีขนาดใหญ่โดยพล - อัลกอริทึมที่มีเวลาทำงาน n ปีมีความซับซ้อน O (n) ซึ่งเป็น "ดีกว่า" กว่าอัลกอริทึมที่มีเวลาทำงานของ n * log (n) microseconds


0

Big-O เป็นเรื่องเกี่ยวกับ "ความซับซ้อน" ของอัลกอริทึม หากคุณมีสองขั้นตอนวิธีการและหนึ่งจะใช้เวลาn^2*kไม่กี่วินาทีในการทำงานและอื่น ๆ จะใช้เวลาn^2*jไม่กี่วินาทีในการทำงานแล้วคุณสามารถโต้แย้งเกี่ยวกับการเป็นที่หนึ่งที่ดีกว่าและคุณอาจจะสามารถที่จะทำให้การเพิ่มประสิทธิภาพที่น่าสนใจบางอย่างที่จะพยายามที่จะส่งผลกระทบต่อkหรือjแต่ทั้งสอง อัลกอริธึมเหล่านี้ช้ามากเมื่อเปรียบเทียบกับอัลกอริทึมที่ใช้n*mในการรัน ไม่สำคัญว่าคุณจะสร้างค่าคงที่ขนาดเล็กเพียงใดkหรือjสำหรับอินพุทขนาดใหญ่พอn*mอัลกอริทึมจะชนะเสมอแม้ว่าmจะค่อนข้างใหญ่ก็ตาม

ดังนั้นเราจึงเรียกว่าอัลกอริทึมสองคนแรกและเราเรียกสองO(n^2) O(n)มันแบ่งโลกออกเป็นคลาสของอัลกอริทึม นี่คือสิ่งที่ใหญ่ -O เป็นเรื่องเกี่ยวกับ มันเหมือนกับการแบ่งยานพาหนะออกเป็นรถยนต์และรถบรรทุกและรถบัส ฯลฯ ... มีการเปลี่ยนแปลงมากมายระหว่างรถยนต์และคุณสามารถใช้เวลาตลอดทั้งวันในการพิสูจน์ว่า Prius ดีกว่า Chevy Volt หรือไม่ แต่ในตอนท้ายถ้าคุณ ต้องใส่ 12 คนเข้าเป็นหนึ่งเดียวแล้วนี่คือเหตุผลที่ไม่มีเหตุผล :)

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