Có thời không gì scare me hơn nghe câu "Big-O notation cho đó là gì?" Tôi nhớ topic từ school, nhưng vì liên quan math (never my strongest subject), tôi blacked it out.
Tuy nhiên, career progressed, tôi found myself:
- Debug slow queries
- Asked nếu considered code hold up given increased load
Khi decide circle back (get it?) learn Big-O, surprised at high-level simplicity. Share what learned để fellow engineers không chỉ pass interviews flying colors, mà build performant, scalable systems.
Promise, Big-O không scary như vẻ. Once get it down, look at algorithm easily discern efficiency, without profiling tool!
Big-O Notation Là Gì?
Big-O notation là fancy way nói "Hey, worst case performance cho algorithm này là gì?" Có thể thấy function described as O(n) hoặc O(1). Nghĩa:
- O(n) - Worst-case run time tăng linearly khi input size (n) tăng
- O(1) - Worst-case run time constant cho any size input
...và để really understand, cần learn về asymptotes.
Asymptotes?
Quay lại high school algebra, dust off textbook mở chapters limits và asymptotes.
- Limit analysis: xem gì xảy ra function khi approach some value
- Asymptotic analysis: xem gì xảy ra khi f(x) approach infinity
Ví dụ, plot function f(x) = x^2 + 4x.

Perform analyses: - Limit analysis: Khi x tăng, f(x) approach infinity, limit f(x) = x^2 + 4x as x→∞ là infinity. - Asymptotic analysis: Khi x very large, 4x term insignificant compared to x^2 term. f(x) = x^2 + 4x almost equivalent f(x) = x^2 cho x→∞.
Hiểu part of function becomes "insignificant": plug different numbers. x=1 → 1+4=5. x=2,000 → 4,000,000+8,000=4,008,000 — x^2 term contribute much more.
Big-O notation là one way describe algorithm run time changes khi input size changes.
Gì Xác Định Run Time Algorithm?
Hỏi bạn tìm kim trong rổ rơm mất bao lâu, bạn muốn biết rơm bao nhiêu. "10 pieces" → confident tìm trong 1-2 phút. "1,000 pieces" → không excited.
Một info khác: mỗi piece rơm thêm vào mất bao lâu? Khi rơm approach infinity?
Similar asymptotic analysis. One more example: f(x) = 5x^2 + 100x + 50. Plot two parts:

Giống ví dụ trước, 5x^2 term eventually larger 100x+50, drop them, runtime grows as x^2.
Worth mention other factors affect run time: computer speed, language used.
Finding Big-O Cho Linear Search
Big-O analysis linear search algorithm. Linear search start beginning dataset traverse until target found.
Ruby implementation:
def find_number_via_linear_search(array, target)
counter = 0
while counter < array.length
if array[counter] == target
return "linear search took: #{counter} iterations"
else
counter += 1
end
end
return "#{target} not found"
end
Test method:
# Array 50 integers, shuffle
array = [*1..50].shuffle
find_number_via_linear_search(array, 24)
Chạy vài lần results:
=> "linear search took: 10 iterations"
=> "linear search took: 11 iterations"
=> "linear search took: 26 iterations"
Analyzing Big-O, care về worst-case (upper asymptotic bound).
Intuitively, smallest iterations = 1 (target at index 0). Largest = 50 (target not found).
Array 100 elements → worst-case 100. 200 elements → 200. Big-O linear search = O(n), n = elements.
Complex Example: Binary Search
Binary search pre-sorted array:
- Take middle element
- element == target → done
- element > target → discard top half
- element < target → discard bottom half
- Repeat step 1 với remaining array
Note: Rubyist có built-in b-search method implement algorithm!
Ví dụ: dictionary tìm "pineapple". Middle page. Nếu "pineapple" → done. Guess middle không phải "p", maybe "llama". "L" before "P" → discard lower half. Repeat với remaining.
Best-case binary search = 1 iteration. Worst case? Example array 16 elements, tìm 23:
[2, 3, 15, 18, 22, 23, 24, 50, 65, 66, 88, 90, 92, 95, 100, 200]
Step 1: index 7 = 50. 50 > 23 → discard right. Array:
[2, 3, 15, 18, 22, 23, 24, 50]
Middle = 18 < 23 → discard lower half.
[22, 23, 24, 50]
Trở thành
[22, 23]
Cuối cùng
[23]
Total: divide array half 4 times tìm number trong array length 16.
Generalize: worst case binary search = max times divide array half.
Math: logarithms answer "how many this number multiply to get that number?" Apply logs:

Big-O binary search = log(base 2) n.
Wrapping Up
Big-O notation = fancy way nói "worst case cho này là gì?" Real-world: hỏi plumber sửa vòi nước bao nhiêu. Reply: "Guarantee không quá $2,000." Upper bound, không helpful.
Vì thế other Big-O notations used. Big-Theta care both lower/upper bound. Plumber: "Không dưới $1,000 nhưng không quá $2,000." More useful.
Thanks for reading, hope post làm Big-O less scary!