พูดง่ายๆแล้ว Big-O Notation หรือ สัญกรณ์โอใหญ่ คืออะไรที่ช่วยเราประมาณ ว่าเวลาในการรันอัลกอริธึม(ส่วนใหญ่จะคิดในกรณีที่แย่ที่สุด หรือ worst-case) จะเป็นประมาณเท่าไหร่ หรือ จะใช้ประมาณเมมโมรี่ที่ใช้ก็ได้
ในบล็อกโพสต์นี้ จะขออธิบายการหา Big-O คร่าวๆก่อน (มีภาคต่อภายหลัง)
สมมติว่ามีโปรแกรมนี้อยู่
for(i=0;i<N;i++) a+=i;
จะสังเกตได้ว่า โปรแกรมนี้จะทำงาน
- บรรทัดแรก ครั้งแรกตอนกำหนด 
- บรรทัดแรก อีกประมาณ
รอบเวลาเช็คว่าผิดเงื่อนไขหรือยัง และตอนเพิ่มค่าที่ i
- และทำงานบรรทัดที่สอง
รอบ
ดังนั้น โปรแกรมนี้ทำงานประมาณ
คำสั่งด้วยกัน
ถ้า
มีค่าเท่ากับ 10 จะทำงานประมาณ 32 คำสั่ง
ถ้า
มีค่าเท่ากับ 20 จะทำงานประมาณ 62 คำสั่ง
ถ้า
มีค่าเท่ากับ 100 จะทำงานประมาณ 302 คำสั่ง
หมายเหตุ: เพราะเป็นการประมาณ จึงถือว่าคำสั่งทุกคำสั่งใช้เวลาเท่าๆกัน (ใช้เวลาคงที่)
เพิ่มไปกี่เท่า จำนวนคำสั่ง(เวลาที่ใช้)ก็จะเพิ่มไปเท่านั้นโดยประมาณ
แบบนี้เรียกว่า โปรแกรมนี้รันในเวลา 
คิดจากการ นำจำนวนคำสั่งมา
เลือกพจน์ที่มีเลขชี้กำลังสูงสุด(สำหรับกรณีนี้คือ
) ตัดสัมประสิทธ์ออก เหลือ 
ลองเทียบกับโปรแกรม
ที่รัน
คำสั่งดู
ถ้า
มีค่าเท่ากับ 10 จะทำงานประมาณ 110 คำสั่ง
ถ้า
มีค่าเท่ากับ 20 จะทำงานประมาณ 420 คำสั่ง
ถ้า
มีค่าเท่ากับ 100 จะทำงานประมาณ 10100 คำสั่ง
เวลาที่ใช้จะเพิ่มขึ้นอย่างรวดเร็ว
ถ้านำกรณีแรกไปวาดกราฟ จะได้กราฟเส้นตรง
ถ้านำกรณีที่สองไปวาดกราฟ จะได้กราฟพาราโบลา
จะไม่คิดจำนวนครั้งอย่างละเอียดเหมือนในตัวอย่างข้างบนแล้ว แต่จะคิดอย่างคร่าวๆแทน
กำหนด string เป็นอาเรย์ของ char ความยาว 
if(string[0]=='a') printf("yes\n"); else printf("no\n"); printf("%d\n", N*(N+1));
ในตัวอย่างนี้ ไม่ว่า
จะมีค่าเท่าไหร่ แต่ว่าจำนวนคำสั่ง(เวลา)ในการรันก็เท่าเดิม
ดังนั้น โปรแกรมนี้รันในเวลาคงตัว (constant) หรือเขียนได้ว่า 
for(i=0;i<N;i++) if(string[i]=='a') { printf("yes\n"); break; } if(i==N) printf("no\n");
ในตัวอย่างนี้ เราอาจจะเจอตัว ‘a’ ตัวแรก ตั้งแต่อาเรย์ช่องแรกๆ หรืออาจจะไม่เจอเลยก็ได้
อาจจะต้องวิ่งในลูป 1 รอบ 2 รอบ หรือ กรณีที่แย่ที่สุด
รอบ
เพราะเราคำนวณกรณีที่แย่ที่สุด ดังนั้นโปรแกรมนี้รันในเวลา 
for(i=0;i<N;i++) a = a+2; for(i=0;i<N;i++) b = b+a;
ในตัวอย่างนี้ เราทำลูปแรก
ครั้ง ลูปที่สอง
ครั้ง
รวมเป็น
ซึ่งเท่ากับ
นั่นเอง
for(i=0;i<N;i++) for(j=0;j<M:j++) a+=i*j;
สังเกตว่ามีตัวแปร 2 ตัวใน Big-O ได้
for(i=0;i<N;i++) k++; for(j=0;j<M;j++) k++;

for(i=0;i<N;i++) for(j=i;j<N;j++) printf("*"); printf("\n");
ครั้งทุกรอบ
วน
ครั้ง


for(i=0;i<strlen(string);i++) printf("%c", string[i]);
ตัวอย่างนี้ ดูเผินๆ เหมือนจะเป็นโปรแกรมที่รันใน 
แต่ว่า! เนื่องจาก ในการวนลูป โปรแกรมจะต้องเรียก strlen(string) ใหม่ทุกรอบ
ซึ่งการหา strlen แต่ละครั้งนั้นใช้เวลา 
ดังนั้นโปรแกรมนี้จึงใช้เวลา 
หากแก้ไขให้ใช้เวลา
อาจทำเช่นนี้
int k = strlen(string); for(i=0;i<k;i++) printf("%c", string[i]);
(โปรดแรเงาเพื่อดูเฉลย)
1.
for(i=0;i<N;i++) k++; for(j=0;j<M;j++) k++; for(i=0;i<M;i++) for(j=0;j<M;j++) k++; for(i=0;i<10;i++) k++;
2.
for(i=0;i<N;i++) for(j=5;j<N-2;j++) for(k=0;k<N/2;k++) printf("a");
3.
กำหนด myFunc()
myFunc() { int i; for(i=0;i<M;i++) a[i]++; return a[0]; }
for(i=0;i<5;i++) for(j=0;j<N;j++) for(k=j;k<N;k++) printf("%d", myFunc());