• Latest
  • Trending
  • All

[C++]. Thuật Toán Tìm Kiếm Nhị Phân

24/12/2025

Cách phân biệt dàn hay giàn chi tiết nhất với 30+ ví dụ

24/12/2025

Vẽ tranh đề tài tự do

24/12/2025

Cách tìm m để phương trình bậc hai có nghiệm thỏa mãn điều kiện

24/12/2025

Soạn bài Chữ người tử tù (trang 21) – ngắn nhất Kết nối tri thức

24/12/2025

Tên tiếng Anh của cơ quan nhà nước: Doanh nghiệp cần biết

24/12/2025

Riềng

24/12/2025
Tài Liệu Học Tập
No Result
View All Result
  • Đề Thi
  • Lớp 12
    • Lịch Sử Lớp 12
    • Địa Lí Lớp 12
    • Ngữ Văn Lớp 12
    • GD KTPL Lớp 12
    • Toán Lớp 12
    • Tiếng Anh Lớp 12
    • Hóa Học Lớp 12
    • Sinh Học Lớp 12
    • Vật Lí Lớp 12
  • Lớp 11
    • Toán Lớp 11
    • Ngữ Văn Lớp 11
    • Tiếng Anh Lớp 11
    • Hóa Học Lớp 11
    • Sinh Học Lớp 11
    • Vật Lí Lớp 11
    • Lịch Sử Lớp 11
    • Địa Lí Lớp 11
    • GDCD Lớp 11
  • Lớp 10
    • Toán Lớp 10
    • Ngữ Văn Lớp 10
    • Tiếng Anh Lớp 10
    • Hóa Học Lớp 10
    • Sinh Học Lớp 10
    • Vật Lí Lớp 10
    • Lịch Sử Lớp 10
    • Địa Lí Lớp 10
    • GDKTPL Lớp 10
    • Công nghệ lớp 10
    • Tin Học Lớp 10
  • Lớp 9
    • Toán Lớp 9
    • Ngữ Văn Lớp 9
    • Tiếng Anh Lớp 9
    • Lịch sử và địa lý lớp 9
    • Khoa Học Tự Nhiên Lớp 9
    • GDCD Lớp 9
  • Lớp 8
    • Toán Lớp 8
    • Ngữ Văn Lớp 8
    • Tiếng Anh Lớp 8
    • Lịch sử và địa lý lớp 8
    • Khoa Học Tự Nhiên Lớp 8
    • GDCD 8
  • Lớp 7
    • Toán Lớp 7
    • Văn Lớp 7
    • Tiếng Anh Lớp 7
    • Lịch Sử Và Địa Lí Lớp 7
    • Khoa Học Tự Nhiên Lớp 7
  • Lớp 6
    • Toán Lớp 6
    • Văn Lớp 6
    • Tiếng Anh lớp 6
    • Lịch Sử và Địa Lí Lớp 6
    • Khoa Học Tự Nhiên lớp 6
  • Lớp 5
    • Toán lớp 5
    • Tiếng Việt Lớp 5
    • Tiếng Anh Lớp 5
    • Lịch Sử và Địa Lí Lớp 5
  • Lớp 4
    • Toán lớp 4
    • Tiếng Việt Lớp 4
    • Tiếng Anh Lớp 4
    • Lịch Sử và Địa Lí Lớp 4
  • Lớp 3
    • Toán lớp 3
    • Tiếng Anh Lớp 3
    • Tiếng Việt Lớp 3
  • Mẹo Hay
  • Tin tức
  • Liên Hệ
Tài Liệu Học Tập
No Result
View All Result
Home Tin tức

[C++]. Thuật Toán Tìm Kiếm Nhị Phân

by Tranducdoan
24/12/2025
in Tin tức
0
Đánh giá bài viết

image

1. Tìm Kiếm Nhị Phân

Tìm kiếm nhị phân – Binary search được sử dụng trên dãy số đã được sắp xếp tăng dần hoặc giảm dần.

Khác với tìm kiếm tuyến tính không cần điều kiện gì về dãy số tìm kiếm thì với tìm kiếm nhị phân ta phải có một dãy số đã có thứ tự hoặc phải sắp xếp dãy số trước khi áp dụng thuật toán này.

Giả sử bạn cần tìm kiếm phần tử X trong mảng A[] có N phần tử đã sắp xếp tăng dần. Ban đầu đoạn tìm kiếm sẽ là toàn bộ mảng, chỉ số đầu tiên của đoạn tìm kiếm là 0 và chỉ số cuối cùng là N – 1.

Ý tưởng của thuật toán đó là ở mỗi lần tìm kiếm trên đoạn [L, R] thì bạn sẽ tìm ra phần tử đứng giữa và so sánh với phần tử X, vì mảng đã sắp xếp tăng dần nên khi so sánh X với phần tử đứng giữa bạn có thể loại bỏ đi 1 nửa khoảng tìm kiếm, cứ như vậy thì đoạn bạn cần tìm kiếm sẽ giảm đi 1 nửa sau mỗi lần tìm kiếm.

Ví dụ mảng có 1 tỷ phần tử thì bạn chỉ cần tìm kiếm 31 lần.

Để tìm chỉ số đứng giữa của đoạn [L, R] bạn lấy (L + R) / 2 hoặc L + (R – L) / 2

Độ phức tạp : O(logN)

Thuật toán :

  1. Chia đôi đoạn tìm kiếm thành 2 nửa bằng cách tìm chỉ số đứng giữa của đoạn cần tìm kiếm, M = (L + R) / 2
  2. So sánh phần tử ở giữa đoạn là A[M] với phần tử cần tìm kiếm sẽ xảy ra 3 trường hợp
  3. Nếu phần tử cần tìm kiếm bằng phần tử ở giữa thì kết luận tìm thấy
  4. Nếu phần tử cần tìm kiếm nhỏ hơn phần tử ở giữa thì loại bỏ nửa bên phải trong lần tìm kiếm tiếp theo
  5. Nếu phần tử cần tìm kiếm lớn hơn phần tử ở giữa thì loại bỏ nửa bên trái trong lần tìm kiếm tiếp theo
  6. Quá trình lặp đi lặp lại từ bước 1 tới bước 5 cho tới khi phần tử được tìm thấy hoặc không còn khoảng tìm kiếm

Trường hợp 1 : Khi tìm ra phần tử đứng giữa bằng giá trị mà bạn tìm kiếm, thuật toán sẽ dừng vì đã tìm thấy

binary search 1

Trường hợp 2 : Khi tìm ra phần tử đứng giữa nhỏ hơn giá trị tìm kiếm, ta có thể khẳng đỉnh giá trị cần tìm kiếm nếu có sẽ nằm ở nửa bên phải. Khi đó bạn cập nhập L = M + 1

binary search 2

Trường hợp 3 : Khi tìm ra phần tử đứng giữa lớn hơn giá trị tìm kiếm, ta có thể khẳng đỉnh giá trị cần tìm kiếm nếu có sẽ nằm ở nửa bên trái. Khi đó bạn cập nhập R = M – 1

binary search 3

Mã nguồn :

#include “iostream” using namespace std; bool binary_search(int a[], int n, int x){ //Khởi tạo left, right int l = 0, r = n – 1; while(l <= r){ //Tính chỉ số của phần tử ở giữa int m = (l + r) / 2; if(a[m] == x){ return true; // tìm thấy } else if(a[m] < x){ //tìm kiếm ở bên phải l = m + 1; } else{ //tìm kiếm ở bên trái r = m – 1; } } return false; // l > r } int main(){ int n = 12, x = 24, y = 6; int a[12] = {1, 2, 3, 4, 5, 5, 7, 9, 13, 24, 27, 28}; if(binary_search(a, n, x)){ cout << “FOUNDn”; } else cout << “NOT FOUNDn”; if(binary_search(a, n, y)){ cout << “FOUNDn”; } else cout << “NOT FOUNDn”; return 0; }

Output :

FOUND NOT FOUND

Ví dụ 1. Tìm phần tử X = 3 trong mảng A[] = {1, 1, 3, 4, 5, 8, 9, 12, 21, 32}

Ban đầu : l = 0, r = 9

  1. Vòng lặp 1, l = 0, r = 9 , m = (l + r) / 2 = 4, A[m] = 5 > X => Cập nhật r = m – 1 = 3
  2. Vòng lặp 2, l = 0, r = 3, m = (l + r) / 2 = 1, A[m] = 1 < X => Cập nhật l = m + 1 = 2
  3. Vòng lặp 3, l = 2, r = 3, m = (l + r) / 2 = 2, A[m] = 3 = X => Tìm thấy X và kết thúc chương trình

Ví dụ 2. Tìm phần tử X = 2 trong mảng A[] = {1, 1, 3, 4, 5, 8, 9, 12, 21, 32}

Ban đầu : l = 0, r = 9

  1. Vòng lặp 1, l = 0, r = 9, m = (l + r) / 2 = 4, A[m] = 4 > X => Cập nhật r = m – 1 = 3
  2. Vòng lặp 2, l = 0, r = 3, m = (l + r) / 2 = 1, A[m] = 1 < X => Cập nhật l = m + 1 = 2
  3. Vòng lặp 3, l = 2, r = 3, m = (l + r) / 2 = 2, A[m] = 3 > X => Cập nhật r = m – 1 – 1
  4. Vòng lặp 4, l = 2, r = 1, l > r nên vòng lặp kết thúc và không tìm thấy X

2. Tìm Kiếm Nhị Phân Biến Đổi

Bài toán 1. Tìm vị trí đầu tiên của phần tử X trong mảng đã sắp tăng dần

Tương tự như thuật toán tìm kiếm nhị phân nhưng khi tìm thấy phần tử X trong mảng thì ta chỉ lưu lại kết quả và cố gắng tìm kiếm thêm ở nửa bên trái.

#include “iostream” using namespace std; int firstPos(int a[], int n, int x){ int l = 0, r = n – 1; int pos = -1; // cập nhật kết quả while(l <= r){ //Tính chỉ số của phần tử ở giữa int m = (l + r) / 2; if(a[m] == x){ pos = m; // lưu lại //Tìm thêm bên trái r = m – 1; } else if(a[m] < x){ //tìm kiếm ở bên phải l = m + 1; } else{ //tìm kiếm ở bên trái r = m – 1; } } return pos; } int main(){ int n = 10, x = 3; int a[10] = {1, 1, 2, 2, 3, 3, 3, 5, 7, 9}; int res = firstPos(a, n, x); if(res == -1){ cout << “3 khong xuat hien trong mangn”; } else{ cout << “Vi tri dau tien cua 3 trong mang : ” << res << endl; } return 0; }

Output :

Vi tri dau tien cua 3 trong mang : 4

Bài toán 2 : Tìm vị trí cuối cùng của phần tử X trong mảng đã sắp tăng dần

Tương tự như thuật toán tìm kiếm nhị phân nhưng khi tìm thấy phần tử X trong mảng thì ta chỉ lưu lại kết quả và cố gắng tìm kiếm thêm ở nửa bên phải.

#include “iostream” using namespace std; int lastPos(int a[], int n, int x){ int l = 0, r = n – 1; int pos = -1; // cập nhật kết quả while(l <= r){ //Tính chỉ số của phần tử ở giữa int m = (l + r) / 2; if(a[m] == x){ pos = m; // lưu lại //Tìm thêm bên phải l = m + 1; } else if(a[m] < x){ //tìm kiếm ở bên phải l = m + 1; } else{ //tìm kiếm ở bên trái r = m – 1; } } return pos; } int main(){ int n = 10, x = 3; int a[10] = {1, 1, 2, 2, 3, 3, 3, 5, 7, 9}; int res = lastPos(a, n, x); if(res == -1){ cout << “3 khong xuat hien trong mangn”; } else{ cout << “Vi tri xuat hien cuoi cung cua 3 trong mang : ” << res << endl; } return 0; }

Output :

Vi tri xuat hien cuoi cung cua 3 trong mang : 6

Bài toán 3 : Tìm vị trí đầu tiên của phần tử lớn hơn hoặc bằng X trong mảng đã sắp tăng dần

Tương tự như thuật toán tìm kiếm nhị phân nhưng khi tìm thấy phần tử ở giữa lớn hơn hoặc bằng phần tử X thì ta chỉ lưu lại kết quả và cố gắng tìm kiếm thêm ở nửa bên trái.

#include “iostream” using namespace std; int firstPos(int a[], int n, int x){ int l = 0, r = n – 1; int pos = -1; // cập nhật kết quả while(l <= r){ //Tính chỉ số của phần tử ở giữa int m = (l + r) / 2; if(a[m] >= x){ pos = m; // lưu lại //Tìm thêm bên trái r = m – 1; } else{ //tìm kiếm ở bên phải l = m + 1; } } return pos; } int main(){ int n = 10, x = 4; int a[10] = {1, 1, 2, 2, 3, 3, 3, 5, 7, 9}; int res = firstPos(a, n, x); if(res == -1){ cout << “Khong ton tai so >= 4 trong mangn”; } else{ cout << “Vi tri cua phan tu dau tien >= 4 trong mang la : ” << res << “, gia tri = ” << a[res] << endl; } return 0; }

Output :

Vi tri cua phan tu dau tien >= 4 trong mang la : 7, gia tri = 5

Video Tìm Kiếm Nhị Phân :

dB2DWSKGLj8

Previous Post

Cu(OH)2 + HCl → CuCl2 + H2O | Cu(OH)2 ra CuCl2

Next Post

Nguyễn Nhật Ánh

Tranducdoan

Tranducdoan

Trần Đức Đoàn sinh năm 1999, anh chàng đẹp trai đến từ Thái Bình. Hiện đang theo học và làm việc tại trường cao đẳng FPT Polytechnic

Related Posts

Vẽ tranh đề tài tự do

by Tranducdoan
24/12/2025
0
0

Bạn đã bao giờ thử vẽ bất cứ điều gì mình thích mà không cần phải tuân theo bất kỳ...

Tên tiếng Anh của cơ quan nhà nước: Doanh nghiệp cần biết

by Tranducdoan
24/12/2025
0
0

Tên tiếng Anh của các cơ quan nhà nước Việt Nam có thể tham khảo theo quy định tại Phụ...

ĐÁNH NGƯỜI GÂY THƯƠNG TÍCH BỊ XỬ LÝ THẾ NÀO?

by Tranducdoan
24/12/2025
0
0

Hành vi đánh người gây thương tích thường xảy ra trong cuộc sống hằng ngày. Tuy nhiên, tùy vào mục...

Phân tích đoạn thơ sau: “Những đường Việt Bắc của ta…Vui lên Việt Bắc đèo De, núi Hồng” trong bài Việt Bắc – Tố Hữu

by Tranducdoan
24/12/2025
0
0

I. Mở bài: - Giới thiệu tác giả Tố Hữu - Giới thiệu bài thơ Việt Bắc - Giới thiệu...

Load More
Next Post

Nguyễn Nhật Ánh

  • Trending
  • Comments
  • Latest
File đề thi thử lịch sử thpt quốc gia 2024 2025 có đáp án

80 File đề thi thử lịch sử thpt quốc gia 2026 2025 có đáp án

16/12/2025
Viết bài văn kể lại câu chuyện về một nhân vật lịch sử mà em đã đọc đã nghe lớp 4 ngắn gọn

Kể lại câu chuyện về một nhân vật lịch sử lớp 4 ngắn gọn

27/03/2025
viet-bai-van-ke-ve-cau-chuyen-ma-em-yeu-thich-ngan-gon

Viết bài văn kể lại một câu chuyện ngắn gọn nhất 16 mẫu

16/11/2024
De Thi Cuoi Hoc Ki 1 Ngu Van 12 Nam 2021 2022 So Gddt Bac Giang Page 0001 Min

Đề thi học kì 1 lớp 12 môn văn năm học 2021-2022 tỉnh Bắc Giang

0
De Thi Cuoi Ki 1 Mon Van 9 Huyen Cu Chi 2022

Đề thi văn cuối kì 1 lớp 9 huyện Củ Chi năm học 2022 2023

0
Dự án tốt nghiệp FPT Polytechnic ngành Digital Marketing

Dự án tốt nghiệp FPT Polytechnic ngành Digital Marketing

0

Cách phân biệt dàn hay giàn chi tiết nhất với 30+ ví dụ

24/12/2025

Vẽ tranh đề tài tự do

24/12/2025

Cách tìm m để phương trình bậc hai có nghiệm thỏa mãn điều kiện

24/12/2025
Xoilac TV trực tiếp bóng đá Socolive trực tiếp
Tài Liệu Học Tập

Copyright © 2022 Tài Liệu Học Tập.

Chuyên Mục

  • Đề Thi
  • Lớp 12
  • Lớp 11
  • Lớp 10
  • Lớp 9
  • Lớp 8
  • Lớp 7
  • Lớp 6
  • Lớp 5
  • Lớp 4
  • Lớp 3
  • Mẹo Hay
  • Tin tức
  • Liên Hệ

Tham Gia Group Tài Liệu Học Tập

No Result
View All Result
  • Đề Thi
  • Lớp 12
    • Lịch Sử Lớp 12
    • Địa Lí Lớp 12
    • Ngữ Văn Lớp 12
    • GD KTPL Lớp 12
    • Toán Lớp 12
    • Tiếng Anh Lớp 12
    • Hóa Học Lớp 12
    • Sinh Học Lớp 12
    • Vật Lí Lớp 12
  • Lớp 11
    • Toán Lớp 11
    • Ngữ Văn Lớp 11
    • Tiếng Anh Lớp 11
    • Hóa Học Lớp 11
    • Sinh Học Lớp 11
    • Vật Lí Lớp 11
    • Lịch Sử Lớp 11
    • Địa Lí Lớp 11
    • GDCD Lớp 11
  • Lớp 10
    • Toán Lớp 10
    • Ngữ Văn Lớp 10
    • Tiếng Anh Lớp 10
    • Hóa Học Lớp 10
    • Sinh Học Lớp 10
    • Vật Lí Lớp 10
    • Lịch Sử Lớp 10
    • Địa Lí Lớp 10
    • GDKTPL Lớp 10
    • Công nghệ lớp 10
    • Tin Học Lớp 10
  • Lớp 9
    • Toán Lớp 9
    • Ngữ Văn Lớp 9
    • Tiếng Anh Lớp 9
    • Lịch sử và địa lý lớp 9
    • Khoa Học Tự Nhiên Lớp 9
    • GDCD Lớp 9
  • Lớp 8
    • Toán Lớp 8
    • Ngữ Văn Lớp 8
    • Tiếng Anh Lớp 8
    • Lịch sử và địa lý lớp 8
    • Khoa Học Tự Nhiên Lớp 8
    • GDCD 8
  • Lớp 7
    • Toán Lớp 7
    • Văn Lớp 7
    • Tiếng Anh Lớp 7
    • Lịch Sử Và Địa Lí Lớp 7
    • Khoa Học Tự Nhiên Lớp 7
  • Lớp 6
    • Toán Lớp 6
    • Văn Lớp 6
    • Tiếng Anh lớp 6
    • Lịch Sử và Địa Lí Lớp 6
    • Khoa Học Tự Nhiên lớp 6
  • Lớp 5
    • Toán lớp 5
    • Tiếng Việt Lớp 5
    • Tiếng Anh Lớp 5
    • Lịch Sử và Địa Lí Lớp 5
  • Lớp 4
    • Toán lớp 4
    • Tiếng Việt Lớp 4
    • Tiếng Anh Lớp 4
    • Lịch Sử và Địa Lí Lớp 4
  • Lớp 3
    • Toán lớp 3
    • Tiếng Anh Lớp 3
    • Tiếng Việt Lớp 3
  • Mẹo Hay
  • Tin tức
  • Liên Hệ

Copyright © 2022 Tài Liệu Học Tập.