Menu
CoddyTech

Tìm kiếm tuyến tính

Cập nhật lần cuối

Tìm kiếm tuyến tính (linear search), còn gọi là tìm kiếm tuần tự, là thuật toán tìm kiếm đơn giản nhất: bắt đầu từ phần tử đầu tiên và so sánh từng phần tử với giá trị cần tìm cho đến khi khớp hoặc hết phần tử. Thuật toán không đặt giả định nào về dữ liệu, nên mảng có thể chưa sắp xếp và các phần tử có thể là bất cứ thứ gì so sánh bằng được.

Hình động ở trên tô sáng từng lần so sánh khi quá trình quét đi từ trái sang phải và dừng ngay khi gặp giá trị cần tìm. Sự đơn giản phải trả giá bằng tốc độ: trong trường hợp xấu nhất mọi phần tử đều bị kiểm tra, nên thuật toán chạy trong O(n). Khi dữ liệu đã sắp xếp, tìm kiếm nhị phân cho cùng kết quả trong O(log n), và nếu cần sắp xếp dữ liệu trước, hãy xem merge sort.

Độ phức tạp thời gian và không gian

Trường hợpĐộ phức tạpGhi chú
Tốt nhấtO(1)Phần tử đầu tiên chính là giá trị cần tìm.
Trung bìnhO(n)Trung bình phải kiểm tra một nửa số phần tử mới tìm thấy.
Xấu nhấtO(n)Giá trị cần tìm nằm cuối cùng, hoặc hoàn toàn không có.
Không gianO(1)Chỉ cần lưu chỉ số hiện tại.

Từng bước

BướcĐiều gì xảy ra
1Bắt đầu ở chỉ số 0, phần tử đầu tiên của mảng.
2So sánh phần tử hiện tại với giá trị cần tìm.
3Nếu bằng nhau, trả về chỉ số hiện tại (đã tìm thấy).
4Nếu không, dịch sang phải một vị trí và lặp lại.
5Nếu đến cuối mảng mà không khớp, giá trị cần tìm không có trong mảng (trả về -1).

Ví dụ minh họa

Tìm 5 trong [7, 3, 9, 1, 5, 8, 2]:

Lần so sánhChỉ sốPhần tửKết quả
1077 ≠ 5: tiếp tục quét.
2133 ≠ 5: tiếp tục quét.
3299 ≠ 5: tiếp tục quét.
4311 ≠ 5: tiếp tục quét.
5455 = 5: tìm thấy ở chỉ số 4.

Khi nào nên dùng tìm kiếm tuyến tính

Nên dùng khiTránh dùng khi
Dữ liệu chưa sắp xếp hoặc thay đổi liên tụcDữ liệu đã sắp xếp, khi đó tìm kiếm nhị phân nhanh hơn theo cấp số mũ
Tập dữ liệu nhỏ, nên sự đơn giản là lợi thếTập dữ liệu lớn và phải tìm kiếm nhiều lần
Bạn chỉ truy cập được tuần tự (luồng dữ liệu, danh sách liên kết)Bạn có thể dùng chỉ mục hoặc bảng băm để tra cứu trong O(1)

Một cách cài đặt Linear Search gọn gàng, chạy được ngay bằng Python, JavaScript, Java, C++, C, Pseudocode. Chọn một ngôn ngữ, sao chép code hoặc mở sẵn trong Coddy Playground.

Code Linear Search bằng Python

Python
1def linear_search(a, target):2    # Scan left to right until the target appears3    for i in range(len(a)):4        if a[i] == target:5            return i6    return -17
8
9nums = [7, 3, 9, 1, 5, 8, 2]10print("Index of 5:", linear_search(nums, 5))11print("Index of 4:", linear_search(nums, 4))
Chạy code này trong Playground Python

Câu hỏi thường gặp về tìm kiếm tuyến tính

Độ phức tạp thời gian của tìm kiếm tuyến tính là bao nhiêu?
O(n) trong trường hợp trung bình và xấu nhất (quá trình quét có thể phải đi qua mọi phần tử) và O(1) trong trường hợp tốt nhất, khi phần tử đầu tiên là giá trị cần tìm. Thuật toán dùng O(1) bộ nhớ phụ.
Tìm kiếm tuyến tính có cần dữ liệu đã sắp xếp không?

Không, đó là ưu điểm chính của nó. Tìm kiếm tuyến tính chạy được trên dữ liệu hoàn toàn chưa sắp xếp vì nó so sánh bằng với từng phần tử; thứ tự không quan trọng. Ngược lại, tìm kiếm nhị phân chỉ chạy được trên mảng đã sắp xếp.

Khi nào tìm kiếm tuyến tính tốt hơn tìm kiếm nhị phân?
Khi dữ liệu chưa sắp xếp và chỉ tìm một lần (sắp xếp trước sẽ tốn O(n log n)), khi tập dữ liệu rất nhỏ, hoặc khi bạn chỉ truy cập được tuần tự, như một luồng dữ liệu hay danh sách liên kết. Với việc tra cứu nhiều lần trên mảng đã sắp xếp, tìm kiếm nhị phân thắng.
Tìm kiếm tuyến tính có giống tìm kiếm tuần tự không?

Có, hai tên gọi mô tả cùng một thuật toán: quét lần lượt các phần tử cho đến khi tìm thấy giá trị cần tìm hoặc hết tập dữ liệu.

Trung bình tìm kiếm tuyến tính thực hiện bao nhiêu lần so sánh?
Nếu giá trị cần tìm có trong mảng và có khả năng nằm ở bất kỳ đâu như nhau, trung bình cần khoảng n/2 lần so sánh; nếu không có, cần đúng n lần. Mức tăng tuyến tính đó chính là lý do thuật toán được gọi là tìm kiếm tuyến tính.
Hình minh họa các ngôn ngữ lập trình của Coddy

Thành thạo thuật toán cùng Coddy

Bắt đầu