- Xuất bản vào
Big O Notation - A Complete Guide
- Tác giả

- Name
- Dat Nguyen
Big O Notation - Your "Big Friend" in Development 🚀
Imagine you're searching for your crush's name in a phone book. If the phone book has 10 people, you find them quickly. But what if it has 10,000 people? That's when Big O appears as your savior!
What is Big O?
Big O Notation is how we measure whether our algorithm is "slow as a turtle" or "fast as Flash" when the amount of data increases. It doesn't care how powerful your machine is, it only cares whether the algorithm can "scale."

🏆 Big O Rankings - From "Lightning Fast" to "Crawling Slow"
1. O(1) - Constant Time ⚡️ "Super Fast"
Whether you have 1 or 1 million elements, the speed remains the same. This is perfection!
// Access element via index or key
function getItemFromHashMap(map, key) {
return map.get(key); // Always 1 step!
}
// Get element by index - ALWAYS fast!
function getFirstStudent(students) {
return students[0]; // Boom! Done instantly!
}
2. O(log n) - Logarithmic Time 🏃♂️ "Very Fast"
Each step eliminates half the possibilities. Like a number guessing game!
// Binary Search - Divide in half each step
function binarySearch(sortedArray, target) {
let left = 0;
let right = sortedArray.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (sortedArray[mid] === target) return mid;
// Eliminate half the array
if (sortedArray[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
// 1,000 elements = ~10 steps
// 1,000,000 elements = ~20 steps (Amazing! 🎉)
3. O(n) - Linear Time 🚶♂️ "Normal"
More data means more time proportionally.
// Traverse list once
function findMax(numbers) {
let max = numbers[0];
for (const num of numbers) { // Iterate through n elements
if (num > max) max = num;
}
return max;
}
// 30 students = 30 checks
// 300 students = 300 checks
4. O(n log n) - Linearithmic Time 🚴♂️ "Acceptable"
Efficient sorting algorithms like Merge Sort, Quick Sort.
// Merge Sort - Divide and Conquer
function mergeSort(array) {
if (array.length <= 1) return array;
const mid = Math.floor(array.length / 2);
const left = mergeSort(array.slice(0, mid));
const right = mergeSort(array.slice(mid));
return merge(left, right);
}
function merge(left, right) {
const result = [];
let i = 0, j = 0;
while (i < left.length && j < right.length) {
if (left[i] <= right[j]) {
result.push(left[i++]);
} else {
result.push(right[j++]);
}
}
return result.concat(left.slice(i)).concat(right.slice(j));
}
5. O(n²) - Quadratic Time 🐌 "Slow"
You start to see "lag" when data grows. Like comparing every pair in class.
// Bubble Sort or nested loops
function bubbleSort(array) {
const arr = [...array];
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
// 10 students = ~45 comparisons
// 100 students = ~4,950 comparisons (Oh no! 😱)
6. O(2ⁿ) - Exponential Time 💀 "Extremely Slow"
Each step doubles the number of operations!
// Naive recursive Fibonacci (no cache)
function fibonacci(n) {
if (n <= 1) return n;
// Each call creates 2 more calls!
return fibonacci(n - 1) + fibonacci(n - 2);
}
// n=20: ~20,000 calls
// n=40: ~2 billion calls 😱
💡 Key Takeaways
Simple Memory Aids:
- O(1): Like opening a drawer - you know exactly where it is
- O(log n): Like using a dictionary - open the middle, then decide left/right
- O(n): Like reading a book - must read every page
- O(n log n): Like sorting cards - divide into groups then merge
- O(n²): Like comparing every pair of shoes with every outfit - tiring!
- O(2ⁿ): Like a family tree - each person has 2 children, grows exponentially
Practical Notes:
📌 Remember: In practice, with small data (n < 100), O(n²) algorithms can sometimes be faster than O(n log n) due to lower overhead. But when n grows large, Big O truly "shows its true form"!
⚠️ Warning: Next time when writing nested loops, remember that Big O is watching you and whispering: "Are you sure? 🤔"
🚀 Conclusion
Big O isn't something mystical. It's just a way to help you assess whether your code can "handle it" when processing large amounts of data.
Happy coding! And remember: Fast code isn't as important as code that's fast when data grows! 🚀