ฟังก์ชันซีมโทติคคืออะไร เส้นกำกับคืออะไร
รับฟังก์ชั่นf (n)ที่อธิบายจำนวนทรัพยากร (เวลา CPU, RAM, พื้นที่ดิสก์, ฯลฯ ) ที่ใช้โดยอัลกอริทึมเมื่อใช้กับอินพุตขนาดnเราได้กำหนดสัญลักษณ์เชิงสัญลักษณ์สูงสุดสามตัวเพื่ออธิบายประสิทธิภาพสำหรับ ขนาดใหญ่n
asymptote (หรือฟังก์ชัน asymptotic) เป็นเพียงฟังก์ชันอื่น ๆ (หรือความสัมพันธ์) g (n)ที่f (n)ใกล้เข้ามามากขึ้นเมื่อnโตขึ้นและใหญ่ขึ้น แต่ก็ยังไม่ถึง ข้อดีของการพูดคุยเกี่ยวกับฟังก์ชั่นซีมโทติคคือพวกเขามักพูดได้ง่ายกว่าแม้ว่าการแสดงออกของf (n)นั้นซับซ้อนมาก ฟังก์ชัน asymptotic ใช้เป็นส่วนหนึ่งของสัญลักษณ์ขอบที่ จำกัด f (n)ด้านบนหรือด้านล่าง
(หมายเหตุ: ในแง่ที่ใช้ในที่นี้ฟังก์ชัน asymptotic จะอยู่ใกล้กับฟังก์ชันดั้งเดิมหลังจากแก้ไขปัจจัยที่ไม่ใช่ค่าคงที่เท่านั้นเนื่องจากสัญกรณ์ทั้งสาม-O / Θ / Ωขนาดใหญ่ไม่สนใจปัจจัยคงที่นี้จากการพิจารณา)
สัญกรณ์ผูกเส้นกำกับสามเส้นคืออะไรและต่างกันอย่างไร
ทั้งสามใช้สัญกรณ์แบบนี้:
f (n) = O (g (n))
โดยที่f (n)ที่นี่คือฟังก์ชันที่น่าสนใจและg (n)คือฟังก์ชันasymptoticอื่น ๆที่คุณพยายามประมาณf (n)ด้วย สิ่งนี้ไม่ควรถูกนำมาเป็นความเท่าเทียมกันในแง่ที่เข้มงวด แต่คำแถลงอย่างเป็นทางการระหว่างวิธีที่f (n)เติบโตอย่างรวดเร็วเมื่อเทียบกับnเมื่อเทียบกับg (n)เมื่อnกลายเป็นใหญ่ ครูสอนมักจะใช้สัญกรณ์ทางเลือกf (n) ∈ O (g (n))เพื่อเน้นว่าสัญลักษณ์O (g (n))เป็นจริงทั้งครอบครัวของฟังก์ชันที่ใช้อัตราการเติบโตร่วมกัน
สัญกรณ์ Big-ϴ (Theta) ระบุความเสมอภาคในการเติบโตของf (n)ถึงปัจจัยคงที่ (เพิ่มเติมในภายหลัง) มันทำงานคล้ายกับ=
ผู้ประกอบการสำหรับอัตราการเติบโต
Big-O สัญกรณ์อธิบายบน -bound ต่อการเจริญเติบโตของf (n) มันทำงานคล้ายกับ≤
ผู้ประกอบการสำหรับอัตราการเติบโต
Big-Ω (โอเมก้า) สัญกรณ์อธิบายต่ำ -bound ในการเจริญเติบโตของf (n) มันทำงานคล้ายกับ≥
ผู้ประกอบการสำหรับอัตราการเติบโต
มีสัญลักษณ์เชิงสัญลักษณ์อื่น ๆ อีกมากมายแต่ก็ไม่ได้เกิดขึ้นบ่อยนักในวรรณคดีวิทยาศาสตร์คอมพิวเตอร์
Big-O สัญลักษณ์และตระกูลของมันมักจะเป็นวิธีการเปรียบเทียบที่ซับซ้อนเวลา
ความซับซ้อนของเวลาคืออะไร?
ความซับซ้อนเวลาเป็นระยะแฟนซีสำหรับระยะเวลาที่t (n)จะใช้เวลาสำหรับขั้นตอนในการดำเนินการเป็นหน้าที่ของขนาดการป้อนข้อมูลของn สิ่งนี้สามารถวัดได้ในเวลาจริง (เช่นวินาที) จำนวนคำสั่งซีพียู ฯลฯ โดยปกติมันจะสันนิษฐานว่าอัลกอริทึมจะทำงานบนคอมพิวเตอร์สถาปัตยกรรม von Neumannของคุณทุกวัน แต่แน่นอนคุณสามารถใช้ความซับซ้อนของเวลาเพื่อพูดคุยเกี่ยวกับระบบคอมพิวเตอร์ที่แปลกใหม่มากขึ้นซึ่งสิ่งต่าง ๆ อาจแตกต่างกัน!
เป็นเรื่องปกติที่จะพูดถึงความซับซ้อนของพื้นที่โดยใช้สัญลักษณ์ Big-O ความซับซ้อนของพื้นที่คือจำนวนหน่วยความจำ (หน่วยความจำ) ที่ต้องใช้เพื่อทำให้อัลกอริธึมสมบูรณ์ซึ่งอาจเป็น RAM, ดิสก์เป็นต้น
อาจเป็นกรณีที่อัลกอริทึมหนึ่งช้าลง แต่ใช้หน่วยความจำน้อยลงในขณะที่อีกอัลกอริทึมเร็วขึ้น แต่ใช้หน่วยความจำเพิ่มเติม แต่ละคนอาจมีความเหมาะสมมากกว่าในสถานการณ์ที่แตกต่างกันหากทรัพยากรถูก จำกัด แตกต่างกัน ตัวอย่างเช่นตัวประมวลผลแบบฝังอาจมีหน่วยความจำที่ จำกัด และสนับสนุนอัลกอริทึมที่ช้ากว่าในขณะที่เซิร์ฟเวอร์ในศูนย์ข้อมูลอาจมีหน่วยความจำจำนวนมากและสนับสนุนอัลกอริทึมที่เร็วกว่า
กำลังคำนวณ Big-ϴ
การคำนวณ Big-ϴ ของอัลกอริทึมเป็นหัวข้อที่สามารถเติมตำราเรียนขนาดเล็กหรือประมาณครึ่งภาคการศึกษาระดับปริญญาตรี: ส่วนนี้จะครอบคลุมพื้นฐาน
รับฟังก์ชั่นf (n)ใน pseudocode:
int f(n) {
int x = 0;
for (int i = 1 to n) {
for (int j = 1 to n) {
++x;
}
}
return x;
}
ความซับซ้อนของเวลาคืออะไร?
ลูปด้านนอกรันnครั้ง สำหรับแต่ละครั้งที่วงรอบด้านนอกทำงานวงด้านในจะทำงานnครั้ง ทำให้เวลานี้ทำงานที่T (n) = n 2
พิจารณาฟังก์ชั่นที่สอง:
int g(n) {
int x = 0;
for (int k = 1 to 2) {
for (int i = 1 to n) {
for (int j = 1 to n) {
++x;
}
}
}
return x;
}
ลูปด้านนอกรันสองครั้ง วงกลางทำงานnครั้ง สำหรับแต่ละครั้งที่วงกลางทำงานวงด้านในจะทำงานnครั้ง ทำให้เวลานี้ทำงานที่T (n) = 2n 2
ตอนนี้คำถามคือสิ่งที่เป็นเชิงเวลาการทำงานของฟังก์ชั่นทั้งสอง?
ในการคำนวณสิ่งนี้เราดำเนินการสองขั้นตอน:
- ลบค่าคงที่ เมื่ออัลกอริธึมเพิ่มขึ้นเนื่องจากอินพุทคำอื่น ๆ จะควบคุมเวลาทำงานทำให้ไม่สำคัญ
- ลบทั้งหมดยกเว้นคำที่ใหญ่ที่สุด ในฐานะที่เป็นnไปที่อินฟินิตี้, n 2อย่างรวดเร็วแซงหน้าn
พวกเขาที่สำคัญที่นี่คือการมุ่งเน้นในแง่ที่โดดเด่นและลดความซับซ้อนในการคำเหล่านั้น
T (n) = n 2 ∈ ϴ (n 2 )
T (n) = 2n 2 ∈ ϴ (n 2 )
หากเรามีอัลกอริทึมอื่นที่มีหลายคำเราจะทำให้มันง่ายขึ้นโดยใช้กฎเดียวกัน:
T (n) = 2n 2 + 4n + 7 ∈ ϴ (n 2 )
ที่สำคัญกับทุกขั้นตอนวิธีการเหล่านี้เป็นสิ่งที่เรามุ่งเน้นไปที่แง่ที่ใหญ่ที่สุดและคงลบ เราไม่ได้ดูเวลาทำงานจริง แต่เป็นความซับซ้อนที่สัมพันธ์กัน
กำลังคำนวณ Big-Ωและ Big-O
ก่อนอื่นให้เตือนว่าในวรรณกรรมที่ไม่เป็นทางการ “ Big-O” มักจะถูกใช้เป็นคำพ้องสำหรับ Big-perhaps อาจเป็นเพราะตัวอักษรกรีกเป็นเรื่องยากที่จะพิมพ์ ดังนั้นหากมีคนออกมาจากสีน้ำเงินขอให้คุณใช้ Big-O ของอัลกอริทึมพวกเขาอาจต้องการ Big-Θ
ตอนนี้ถ้าคุณต้องการคำนวณ Big-Ωและ Big-O จริงๆในความรู้สึกที่เป็นทางการที่กำหนดไว้ก่อนหน้านี้คุณมีปัญหาสำคัญ: มีคำอธิบาย Big-Ωและ Big-O มากมายสำหรับฟังก์ชั่นใด ๆ ! มันเหมือนกับถามว่าตัวเลขที่น้อยกว่าหรือเท่ากับ 42 คืออะไร มีหลายความเป็นไปได้
สำหรับอัลกอริทึมที่มีT (n) ∈ ϴ (n 2 )รายการใด ๆ ต่อไปนี้เป็นข้อความที่ถูกต้องอย่างเป็นทางการที่จะต้องทำ:
- T (n) ∈ O (n 2 )
- T (n) ∈ O (n 3 )
- T (n) ∈ O (n 5 )
- T (n) ∈ O (n 12345 × e n )
- T (n) ∈Ω (n 2 )
- T (n) ∈Ω (n)
- T (n) ∈Ω (บันทึก (n))
- T (n) ∈Ω (บันทึก (บันทึก (n)))
- T (n) ∈Ω (1)
แต่มันก็ไม่ถูกต้องไปยังรัฐT (n) ∈ O (n)หรือT (n) ∈Ω (n 3 )
ความซับซ้อนสัมพัทธ์คืออะไร? มีอัลกอริทึมใดบ้าง
หากเราเปรียบเทียบอัลกอริทึมสองแบบที่แตกต่างกันความซับซ้อนของมันในขณะที่อินพุทไปที่อินฟินิตี้จะเพิ่มขึ้นตามปกติ หากเราดูอัลกอริธึมชนิดต่าง ๆ พวกมันอาจอยู่ในระดับเดียวกัน (พูดแตกต่างกันโดยปัจจัยคงที่) หรืออาจแตกต่างกันอย่างมาก นี่คือเหตุผลสำหรับการวิเคราะห์ Big-O: เพื่อตรวจสอบว่าอัลกอริทึมจะทำงานได้อย่างมีเหตุผลกับอินพุตที่มีขนาดใหญ่หรือไม่
คลาสของอัลกอริทึมแยกย่อยดังนี้:
Θ (1) - คงที่ ตัวอย่างเช่นการเลือกหมายเลขแรกในรายการจะใช้เวลาเท่ากันเสมอ
Θ (n) - เป็นเส้นตรง ยกตัวอย่างเช่นการทำซ้ำรายการมักจะใช้เวลาสัดส่วนกับขนาดของรายการที่ n
Θ (log (n)) - ลอการิทึม (ฐานปกติไม่สำคัญ) อัลกอริทึมที่แบ่งพื้นที่อินพุตในแต่ละขั้นตอนเช่นการค้นหาแบบไบนารีเป็นตัวอย่าง
Θ (n × log (n)) - linear time ลอการิทึม (“ linearithmic”) อัลกอริทึมเหล่านี้มักจะแบ่งและพิชิต ( log (n) ) ในขณะที่ยังคงวนซ้ำ ( n ) อินพุตทั้งหมด อัลกอริทึมการเรียงลำดับยอดนิยมจำนวนมาก (ผสานเรียงลำดับ Timsort) ตกอยู่ในหมวดหมู่นี้
Θ (n m ) - พหุนาม ( nยกเป็นmคงที่ใด ๆ) นี่เป็นคลาสความซับซ้อนที่พบบ่อยมากซึ่งมักพบในลูปซ้อนกัน
Θ (m n ) - เอ็กซ์โพเนนเชียล (ค่าคงที่mยกเป็นn ) อัลกอริทึมแบบเรียกซ้ำและกราฟจำนวนมากอยู่ในหมวดหมู่นี้
Θ (n!) - แฟกทอเรียล กราฟและอัลกอริธึม combinatorial มีความซับซ้อนของปัจจัย
สิ่งนี้เกี่ยวข้องกับกรณีที่ดีที่สุด / ปานกลาง / แย่ที่สุดหรือไม่?
เลขที่ Big-O และครอบครัวของข้อความที่พูดคุยเกี่ยวกับคณิตศาสตร์เฉพาะฟังก์ชั่น เป็นเครื่องมือทางคณิตศาสตร์ที่ใช้ในการช่วยจำแนกลักษณะของอัลกอริธึม แต่ความคิดของกรณีที่ดีที่สุด / เฉลี่ย / แย่ที่สุดนั้นไม่เกี่ยวข้องกับทฤษฎีอัตราการเติบโตที่อธิบายไว้ที่นี่
เพื่อพูดคุยเกี่ยวกับ Big-O ของอัลกอริทึมเราจะต้องผูกมัดกับโมเดลทางคณิตศาสตร์เฉพาะของอัลกอริทึมด้วยพารามิเตอร์ตัวเดียวn
ซึ่งควรจะอธิบาย“ ขนาด” ของอินพุทไม่ว่าอะไรจะมีประโยชน์ก็ตาม แต่ในโลกแห่งความเป็นจริงปัจจัยการผลิตมีโครงสร้างมากกว่าความยาวของพวกเขา ถ้าเรื่องนี้เป็นขั้นตอนวิธีการเรียงลำดับการที่ฉันสามารถกินอาหารในสตริง"abcdef"
, หรือ"fedcba"
"dbafce"
ทั้งหมดของพวกเขามีความยาว 6 แต่หนึ่งในนั้นถูกจัดเรียงแล้วหนึ่งถูกกลับรายการและสุดท้ายเป็นเพียงความสับสนแบบสุ่ม อัลกอริทึมการเรียงลำดับบางอย่าง (เช่น Timsort) ทำงานได้ดีขึ้นหากอินพุตถูกเรียงลำดับแล้ว แต่เราจะรวมเอาความไร้มนุษยธรรมนี้เข้ากับแบบจำลองทางคณิตศาสตร์ได้อย่างไร
วิธีการทั่วไปคือการสมมติว่าอินพุตมาจากการแจกแจงแบบสุ่มและความน่าจะเป็น n
จากนั้นคุณเฉลี่ยซับซ้อนอัลกอริทึมที่ผ่านปัจจัยการผลิตที่มีความยาวทั้งหมด สิ่งนี้จะให้แบบจำลองความซับซ้อนของตัวพิมพ์เล็ก - ใหญ่ของอัลกอริทึม จากที่นี่คุณสามารถใช้สัญลักษณ์ Big-O / Θ / Ωตามปกติเพื่ออธิบายพฤติกรรมของเคสโดยเฉลี่ย
แต่ถ้าคุณกังวลเกี่ยวกับการโจมตีแบบปฏิเสธการให้บริการคุณอาจต้องมองโลกในแง่ร้ายมากกว่า ในกรณีนี้มันปลอดภัยกว่าที่จะสมมติว่าอินพุตเพียงอย่างเดียวคือสิ่งที่ทำให้เกิดความเศร้าโศกมากที่สุดสำหรับอัลกอริทึมของคุณ นี้จะช่วยให้คุณมีความเลวร้ายที่สุดกรณีรูปแบบความซับซ้อนของขั้นตอนวิธี หลังจากนั้นคุณสามารถพูดคุยเกี่ยวกับ Big-O / Θ / Ω ฯลฯ ของโมเดลที่แย่ที่สุด
ในทำนองเดียวกันคุณยังสามารถมุ่งเน้นความสนใจไปยังอินพุตเฉพาะที่อัลกอริทึมของคุณมีปัญหาน้อยที่สุดในการเข้าถึงโมเดลที่ดีที่สุดจากนั้นดู Big-O / Θ / Ωเป็นต้น