Không gian tự học dành cho sinh viên UET

Chào mừng đến với UETệ

Tìm bài giảng theo học phần, hiểu lại những kiến thức nền và ôn tập theo nhịp học của bạn.

Bài giảng
Đọc Notes, ôn nhanh với Slides và luyện tập qua các bài có lời giải.
Wiki kiến thức
Tra cứu thuật ngữ và bổ sung kiến thức nền ngay khi cần.
Góc học tập
Ôn bằng flashcard, lưu ghi chú và hẹn giờ tập trung.

Bạn có thể xem lại phần giới thiệu ở cuối trang.

Buy me a coffee

Website hoàn toàn miễn phí. Nếu thấy hữu ích, bạn có thể tặng tôi một cốc cà phê theo thông tin dưới đây nhé!

Mã QR chuyển khoản Momo
Ngân hàng
Momo
Tên người nhận
MOMO - TKTH DO MINH TRI
Số tài khoản
01MMTTT0060405229
Skip to content

Thuật toán tìm kiếm

Bài 3Cập nhật 10/10/2026Ghi chú của bạn

Tìm kiếm là một trong những thao tác cơ bản nhất khi làm việc với dữ liệu. Từ tìm kiếm một sinh viên theo mã số đến tìm kiếm từ khóa trong cơ sở dữ liệu hàng tỷ bản ghi.


Điều kiện Tiên quyết Bắt buộc

phải được sắp xếp trước! Nếu mảng chưa sắp xếp, bạn không thể dùng Binary Search mà phải dùng Linear Search O(n) hoặc sắp xếp trước.

Trực giác Đơn giản ​

Giống như trò chơi đoán số từ 1 đến 100:

  • Người kia nghĩ số 73.
  • Lần 1: Bạn đoán 50 → Báo "Lớn hơn". Bạn loại ngay được 50 số đầu (1→50).
  • Lần 2: Bạn đoán ở giữa đoạn 51→100, tức là 75 → Báo "Nhỏ hơn". Bạn loại tiếp được đoạn 75→100.
  • Cứ mỗi lần đoán, bạn cắt đôi không gian tìm kiếm.

chỉ mất log2⁡(100)≈7 lần đoán! Với 1.000.000 phần tử, Binary Search tìm ra trong tối đa 20 phép so sánh.

Mã Cài đặt C++ Chống Tràn Số ​

cpp
int binarySearch(const vector<int>& arr, int target) {
    int left = 0;
    int right = arr.size() - 1;

    while (left <= right) {
        // Tránh tràn số (overflow) thay vì dùng (left + right) / 2
        int mid = left + (right - left) / 2;

        if (arr[mid] == target) {
            return mid; // Tìm thấy tại chỉ số mid
        }
        if (arr[mid] < target) {
            left = mid + 1;  // Tìm tiếp bên nửa phải
        } else {
            right = mid - 1; // Tìm tiếp bên nửa trái
        }
    }
    return -1; // Không tìm thấy
}

2. Kỹ thuật Hai Con Trỏ (Two Pointers) ​

Kỹ thuật hai con trỏ giúp giảm từ O(n2) xuống O(n) trên đã sắp xếp.

Bài toán 2-Sum: Tìm hai số có tổng bằng giá trị cho trước ​

  • Đặt con trỏ left = 0 (số nhỏ nhất) và right = n - 1 (số lớn nhất).
  • Tính sum = arr[left] + arr[right]:
    • Nếu sum == S → Tìm thấy cặp số!
    • Nếu sum < S → Cần tổng lớn hơn → Tăng left++.
    • Nếu sum > S → Cần tổng nhỏ hơn → Giảm right--.
cpp
bool hasPairWithSum(const vector<int>& arr, int targetSum) {
    int left = 0;
    int right = arr.size() - 1;
    while (left < right) {
        int currentSum = arr[left] + arr[right];
        if (currentSum == targetSum) return true;
        if (currentSum < targetSum) left++;
        else right--;
    }
    return false;
}

3. Hệ thống bài tập tự luyện ​

Toàn bộ hệ thống bài tập thực hành chuyên sâu của bài học này đã được tích hợp đầy đủ tại tab Bài tập ở đầu trang. Sau khi đọc xong phần lý thuyết, bạn hãy bấm chuyển sang tab Bài tập để bắt đầu luyện tập.

Chuyển sang Tab Bài tập

Bấm vào tab Bài tập trên thanh điều hướng bài giảng ở đầu trang để mở các bài tập thực chiến có hướng dẫn chi tiết và kiểm chứng tự động.

4. Nguồn tham khảo & Đọc thêm ​

Ảnh & sơ đồ
100%
Ảnh tài liệu được phóng to