Giữ ứng viên tốt nhất đã gặp
Với ngưỡng giả định `K = 1150`, cần tìm mặt hàng có doanh số **nhỏ hơn K nhưng lớn nhất trong các số thỏa điều kiện**. Trong dãy mẫu, Na 1100 là đáp án; Táo 1200 tuy cách K chỉ 50 nhưng **ở phía trên**, nên không được chọn. Có thể tách đây thành mô-đun mới: nhận hai dãy tên/doanh số và K; duyệt từng cặp, giữ ứng viên hợp lệ có doanh số lớn hơn ứng viên cũ. Nếu không có doanh số nào nhỏ hơn K thì báo không có. Khi nhiều mặt hàng cùng doanh số tốt nhất, cách duyệt dưới đây giữ mặt hàng gặp đầu tiên.
Mã tìm kiếm tuần tự
```python
def gan_duoi_nguong(P, S, K):
if len(P) != len(S):
raise ValueError("Hai dãy phải cùng độ dài")
vi_tri = None
for i in range(len(S)):
if S[i] < K and (vi_tri is None or S[i] > S[vi_tri]):
vi_tri = i
if vi_tri is None:
return None
return P[vi_tri], S[vi_tri]
P = ["Táo", "Mơ", "Lê", "Cam", "Ổi", "Na"]
S = [1200, 900, 1000, 1500, 700, 1100]
print(gan_duoi_nguong(P, S, 1150))
```
Kết quả là `('Na', 1100)`. Hàm chỉ cần một lượt qua dãy, nên bậc thời gian `O(n)`. Nếu dữ liệu **đã sắp theo doanh số**, có thể dùng tìm kiếm nhị phân để tìm ranh giới dưới K; điều kiện đã sắp phải được kiểm hoặc bảo đảm trước.
Bài luyện
Với ngưỡng `K=1150` và dữ liệu mẫu, mặt hàng nào gần K nhất từ phía dưới?
1200 ở phía trên K.
1100 < 1150 và lớn hơn mọi doanh số khác dưới K.
1000 dưới K nhưng xa hơn 1100.
1500 ở phía trên K.
Lời giải
Trong các doanh số dưới 1150 là 900,1000,700,1100, giá trị lớn nhất là 1100 của Na.
Bài luyện
Nếu không có doanh số nào nhỏ hơn K, hàm `gan_duoi_nguong` trả gì?
Yêu cầu bắt buộc nhỏ hơn K.
Không có ứng viên nên vi_tri giữ None.
0 có thể không là doanh số trong dữ liệu.
Không thể chọn tùy ý.
Lời giải
Vòng duyệt không gán vi_tri; hàm kiểm thấy None và trả None để biểu thị không có mặt hàng thỏa điều kiện.
Bài luyện
Khi nào có thể cân nhắc tìm kiếm nhị phân thay cho duyệt tuần tự ở bài này?
Tìm nhị phân cần thứ tự của tiêu chí doanh số.
Chữ hoa của tên không liên quan.
Tính chẵn lẻ của K không liên quan.
Dãy chưa sắp không cho phép bỏ nửa đúng.
Lời giải
Tìm nhị phân chỉ dùng đúng khi dữ liệu theo doanh số đã sắp; đồng thời tên phải còn ghép với số tương ứng.
Đang học