ภาพรวม
คนอื่น ๆ ได้ให้ตัวอย่างไดอะแกรมที่ดีเช่นแผนผังต้นไม้ ฉันไม่เห็นตัวอย่างรหัสง่ายๆ ดังนั้นนอกเหนือจากคำอธิบายของฉันฉันจะให้อัลกอริทึมที่มีคำสั่งพิมพ์ง่าย ๆ เพื่อแสดงความซับซ้อนของประเภทอัลกอริทึมที่แตกต่าง
ครั้งแรกที่คุณจะต้องมีความคิดทั่วไปของลอการิทึมซึ่งคุณสามารถได้รับจากhttps://en.wikipedia.org/wiki/Logarithm การใช้วิทยาศาสตร์ธรรมชาติe
และบันทึกทางธรรมชาติ สาวกวิศวกรรมจะใช้ log_10 (ฐาน 10) และนักวิทยาศาสตร์คอมพิวเตอร์จะใช้ log_2 (ฐานฐาน 2) เป็นจำนวนมากเนื่องจากคอมพิวเตอร์เป็นฐานไบนารี บางครั้งคุณจะเห็นตัวย่อของบันทึกธรรมชาติเป็นln()
วิศวกรปกติออกจาก _10 ออกและใช้เพียงlog()
และ log_2 lg()
ย่อเป็น log(n)
ทุกประเภทลอการิทึมเติบโตในลักษณะคล้ายนั่นคือเหตุผลที่พวกเขาร่วมกันประเภทเดียวกันของ
เมื่อคุณดูตัวอย่างโค้ดด้านล่างฉันแนะนำให้ดูที่ O (1) จากนั้น O (n) และ O (n ^ 2) หลังจากที่คุณทำดีแล้วก็ลองมองคนอื่นดู ฉันได้รวมตัวอย่างที่ชัดเจนและรูปแบบที่หลากหลายเพื่อแสดงให้เห็นว่าการเปลี่ยนแปลงที่ละเอียดยังสามารถทำให้เกิดการจัดหมวดหมู่เดียวกันได้อย่างไร
คุณสามารถนึกถึง O (1), O (n), O (logn) เป็นต้นเป็นคลาสหรือหมวดหมู่ของการเติบโต บางหมวดหมู่จะใช้เวลาในการทำนานกว่าหมวดอื่น ๆ หมวดหมู่เหล่านี้ช่วยให้เราสามารถจัดเรียงประสิทธิภาพของอัลกอริทึมได้ บางคนโตเร็วขึ้นเมื่ออินพุท n เพิ่มขึ้น ตารางต่อไปนี้แสดงให้เห็นว่าการเติบโตของตัวเลข ในตารางด้านล่างให้คิดถึง log (n) เป็นเพดานของ log_2
ตัวอย่างโค้ดแบบง่ายของหมวดหมู่ Big O ต่างๆ:
O (1) - ตัวอย่างเวลาคงที่:
ขั้นตอนวิธีการพิมพ์ 1 สวัสดีอีกครั้งและมันไม่ได้ขึ้นอยู่กับ n O(1)
ดังนั้นจึงมักจะทำงานในเวลาที่คงที่ดังนั้นจึงเป็น
print "hello";
อัลกอริทึม 2 พิมพ์ hello 3 ครั้งอย่างไรก็ตามมันไม่ได้ขึ้นอยู่กับขนาดอินพุต แม้เมื่อเติบโตขึ้นอัลกอริทึมนี้จะพิมพ์ Hello 3 ครั้งเท่านั้น ที่ถูกกล่าวว่า 3 เป็นค่าคงที่ดังนั้นอัลกอริทึมนี้ก็เช่นO(1)
กัน
print "hello";
print "hello";
print "hello";
O (บันทึก (n)) - ตัวอย่างลอการิทึม:
- อัลกอริทึม 3 - สิ่งนี้ทำหน้าที่เหมือน "log_2"
อัลกอริทึม 3 แสดงให้เห็นถึงอัลกอริทึมที่ทำงานใน log_2 (n) สังเกตการดำเนินการโพสต์ของ for for ทวีคูณทวีคูณมูลค่าปัจจุบันของ i ด้วย 2 ดังนั้นi
ไปจาก 1 ถึง 2 ถึง 4 ถึง 8 ถึง 16 ถึง 32 ถึง 32 ...
for(int i = 1; i <= n; i = i * 2)
print "hello";
- อัลกอริทึม 4 - สิ่งนี้ทำหน้าที่เหมือน "log_3"
อัลกอริทึม 4 แสดงให้เห็นถึง log_3 การแจ้งเตือนi
เริ่มจาก 1 ถึง 3 ถึง 9 ถึง 27 ...
for(int i = 1; i <= n; i = i * 3)
print "hello";
- อัลกอริทึม 5 - สิ่งนี้ทำหน้าที่เหมือน "log_1.02"
อัลกอริทึม 5 มีความสำคัญเนื่องจากช่วยแสดงว่าตราบใดที่จำนวนมากกว่า 1 และผลลัพธ์นั้นคูณกับตัวเองซ้ำ ๆ คุณกำลังมองหาอัลกอริทึมลอการิทึม
for(double i = 1; i < n; i = i * 1.02)
print "hello";
O (n) - ตัวอย่างเวลาเชิงเส้น:
อัลกอริทึมนี้ง่ายซึ่งพิมพ์ hello n ครั้ง
for(int i = 0; i < n; i++)
print "hello";
อัลกอริทึมนี้แสดงรูปแบบที่จะพิมพ์ hello n / 2 ครั้ง n / 2 = 1/2 * n เราไม่สนใจค่าคงที่ 1/2 และดูว่าอัลกอริทึมนี้คือ O (n)
for(int i = 0; i < n; i = i + 2)
print "hello";
O (n * log (n)) - nlog (n) ตัวอย่าง:
คิดว่านี้เป็นส่วนผสมของและO(log(n))
O(n)
การทำรังของลูปช่วยให้เราได้รับO(n*log(n))
for(int i = 0; i < n; i++)
for(int j = 1; j < n; j = j * 2)
print "hello";
อัลกอริทึม 9 เหมือนกับอัลกอริทึม 8 แต่แต่ละลูปอนุญาตการเปลี่ยนแปลงได้ซึ่งยังคงเป็นผลลัพธ์สุดท้าย O(n*log(n))
for(int i = 0; i < n; i = i + 2)
for(int j = 1; j < n; j = j * 3)
print "hello";
O (n ^ 2) - n กำลังสองตัวอย่าง:
O(n^2)
สามารถทำได้ง่ายโดยการทำรังมาตรฐานสำหรับลูป
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
print "hello";
เช่นเดียวกับอัลกอริทึม 10 แต่มีรูปแบบบางอย่าง
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j = j + 2)
print "hello";
O (n ^ 3) - n cubed ตัวอย่าง:
นี่เป็นเหมือนอัลกอริทึม 10 แต่มี 3 ลูปแทน 2
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
print "hello";
เช่นเดียวกับอัลกอริทึมที่ 12 O(n^3)
แต่มีการเปลี่ยนแปลงบางอย่างที่ยังคงให้ผลผลิต
for(int i = 0; i < n; i++)
for(int j = 0; j < n + 5; j = j + 2)
for(int k = 0; k < n; k = k + 3)
print "hello";
สรุป
ข้างต้นให้ตัวอย่างที่ตรงไปตรงมาหลายรูปแบบและรูปแบบต่าง ๆ เพื่อช่วยแสดงให้เห็นถึงการเปลี่ยนแปลงเล็กน้อยที่สามารถนำมาใช้ซึ่งไม่ได้เปลี่ยนการวิเคราะห์ หวังว่ามันจะช่วยให้คุณเข้าใจได้มากพอ