Big O
Big O Notation là một quy ước toán học được các lập trình viên toàn thế giới sử dụng để mô tả hiệu năng của thuật toán một cách đồng nhất.
Big O là gì?
Big O mô tả tốc độ tăng của thời gian và không gian mà một thuật toán yêu cầu trong trường hợp xấu nhất, khi kích thước đầu vào n tiến đến vô cùng.
Tốc độ tăng: Big O không cho bạn biết thuật toán chạy chính xác trong thời gian bao lâu. Nó cho bạn biết quy luật mà thời gian chạy sẽ tăng lên.
Trường hợp xấu nhất: Khi phân tích thuật toán, chúng ta thường quan tâm đến kịch bản tệ nhất có thể xảy ra. Vì nó cho chúng ta một sự đảm bảo. Nếu chúng ta biết thuật toán của mình chạy không quá x giây trong trường hợp xấu nhất chúng ta có thể yên tâm rằng nó luôn đáp ứng được trong mọi tình huống thực tế.
Các loại độ phức tạp phổ biến
O(1) - Constant
Thời gian thực thi không phụ thuộc vào kích thước đầu vào n.
Trường hợp thường gặp:
- Truy cập một phần tử trong mảng bằng index
- Lấy một giá trị trong Dictionary thông qua key
- Thêm, xóa một phần tử ở cuối List
O(log n) - Logarithmic
Thời gian thực thi tăng rất chậm khi n tăng. Khi gấy đôi n, thời gian chỉ tăng thêm một lượng rất nhỏ.
Trường hợp thường gặp:
- Thuật toán tìm kiếm nhị phân trên tệp dữ liệu đã sắp xếp
O(n) - Linear
Thời gian thực thi tỷ lệ thuận với kích thước đầu vào n. Nếu n tăng gấp đôi thì thời gian cũng tăng gấp đôi
Trường hợp thường gặp:
- Duyệt qua tất cả các phần tử để tìm một giá trị
- In ra tất cả các phần tử trong mảng
O(n log n) - Linearithmic
Hiệu quả hơn O(n2) nhưng kém hiệu quả hơn O(n). Đây là tiêu chuẩn vàng cho các thuật toán sắp xếp dựa trên so sánh.
O(n log n) tương đương với việc thực hiện một thao tác O(log n) với mỗi phần tử.
Trường hợp thường gặp:
- Các thuật toán sắp xếp như merge sort, quick sort.
- IntroSort được sử dụng bởi
List<T>.Sort()trong C#
O(n2) - Quadratic
Thời gian thực thi tăng theo bình phương của n. Nếu n tăng 10 lần thì thời gian/không gian tăng 100 lần
Trường hợp thường gặp:
- Các vòng lặp lồng nhau
- Các thuật toán Bubble Sort, Selection Sort
O(2n) - Exponential và O(n!) Factorial
Cực kỳ chậm và nhanh chóng trở nên bất khả thi ngay cả với n tương đối nhỏ
Trường hợp thường gặp:
- O(2n) Tính số Fibonacci bằng đệ quy đơn giản
- O(n!) Giải quyết bài toán Traveling Salesman Problen bằng cách vét cạn

No comments to display
No comments to display