Tran Nhat Sang logo
BigO la gi cheatsheet

BigO là gì trong thuật toán ? 1 công cụ quan trọng của lập trình viên giỏi

Trong khoa học máy tính nói chung và phần mềm nói riêng, để lập trình tạo ra những dòng code chất lương, chúng ta phải đi từ những khái niệm cơ bản nhất. Và BigO là khái niệm cần phải biết trước tiên khi bước vào từng cấu trúc giải thuật và dữ liệu!

BigO là gì ?

Là độ phức tạp của thuật toán, dùng để đánh giá, phân tích thuật toán có tối ưu hay không ? dựa vào giá trị gia tăng của số lượng biến đầu vào

Các dạng BigO phổ biến

  • O(n): Linear time
  • O(1): Constant time, là hằng số thời gian không thay đổi theo lượng input đầu vào
    VD: có 100000 input item và 1 input item thì kết quả của thuật toán không khác nhau
  • O(logN): Mỗi lần lặp sẽ giảm đi 1/2 thời gian
  • O (n2): 2 vòng lặp lồng nhau

Sự khác nhau giữa BigO, Big Omega, BigTheta notations ?

Dưới là 2 link mình đã tìm kiếm có giải thích kỹ lưỡng về sự khác nhau của 3 khái niệm
https://www.quora.com/What-is-the-difference-between-big-oh-big-omega-and-big-theta-notations

https://chatgpt.com/share/67511669-c008-8013-9f74-e212c9eda9d2

Khá khó giải thích bằng lời, nhưng để cho dễ tiếp cận mình sẽ giải thích sự khác nhau như sau:

  • BigO: Trường hợp xấu nhất
  • Big Omega: Trường hợp tốt nhất (best case)
  • Big Theta: Trường hợp xấu nhất, tốt nhất, trung bình

Ví dụ: về thuật toán linear search

function linearSearch(arr, target) {
for (let i = 0; i < arr.length; i++) {
    if (arr[i] === target) {
      return i;
        }
      }
  return -1;
}
  • Big-O (O(n)):
    • Worst-case: We have to check all elements.
    • Time complexity: O(n).
  • Big-Omega (Ω(1)):
    • Best-case: We find it in 1 operation.
    • Time complexity: Ω(1).
  • Big-Theta (Θ(n)):
    • Average-case: On average, the element is found halfway through the array, requiring n/2 checks.
    • Time complexity: Θ(n)

Làm thế nào để tính toán BigO ?

Dựa vào các rule sau đây:

Rule 1: Luôn chọn trường hợp xấu nhất

Rule 2: Xoá đi các constant

Rule 3: Input khác nhau nên có các biến khác nhau

Rule 4: Xoá đi những giá trị không chiếm ưu thế (non-dominant)

Bài tập thực tế

VD 1: O(n2 + 3x + 100 + x/2)
BigO ở đây được tính như thế nào dựa vào 4 rule trên
Rule 1: Worse case n2
Rule 2: Xoá constant 100
Rule 3: Chỉ có 1 input là x
Rule 4: Xoá non-dominant: Xoá 3x + x/2

==> Giá trị thực tế BigO là O(n2)

Điều gì tạo nên một đoạn code tốt ?

  • Readable (Khả năng dễ đọc)
  • Scalable (Khả năng dễ mở rộng)
    • Speed (Tốc độ thực thi)
    • Memory (Chiếm bao nhiêu bộ nhớ)

Vocab (Từ vựng liên quan)

  • arbitrary
    • Tuỳ ý
    • synonyms
  • steepest
    • Dốc đứng, tốn kém nhất
  • pillar
    • Trụ cột, mũi nhọn
    • synonyms:
      • column
      • post
      • pole
      • vertical
  • tradeoff
    • Đánh đổi
    • remind ?
      • Đánh đổi giữa tốc độ và bộ nhớ (time and space complexity)

Liên quan

Ngoài ra trong quá trình viết về các bài giải thuật mình có chuẩn bị cho bản thân các series đó tại đây. Nhấn vào để theo dõi nhé!

https://www.bigocheatsheet.com
Xem thêm các bài viết về cấu trúc dữ liệu và giải thuật của mình tại đây nhé!

#algorithm #data-structure #bigO

5 1 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
1 Bình luận
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Sang
Sang
1 năm trước

Mời mọi người cùng trao đổi nhé!

Lên đầu trang
1
0
Rất thích suy nghĩ của bạn, hãy bình luận.x