btvn.vn
Tìm kiếm Đăng nhập

Tìm giá trị gần nhất bằng chia để trị

Lưu trên thiết bị này
Chuyên đề lựa chọn CS: Chia để trị · Chọn bài khác

So sánh khoảng cách tới K

Với A đã sắp xếp không giảm, cần trả một **giá trị trong A** có khoảng cách abs(A[i]−K) nhỏ nhất. Không nhất thiết có phần tử bằng K. Trong bài này, nếu hai giá trị khác nhau cùng gần K, chọn **giá trị lớn hơn**. Ví dụ A=[2,8,14],K=9: các khoảng cách là 7,1,5 nên kết quả là giá trị 8, không phải chỉ số 1. Dãy rỗng chưa có giá trị để chọn, hàm trả None; không dùng −1 làm tín hiệu chung vì −1 có thể là một giá trị hợp lệ trong dãy.

Phần tử giữa vẫn có thể gần nhất

Giá trị 8 cách K=9 một đơn vị, còn 14 cách năm đơn vị. Phần tử giữa 8 vẫn cần được giữ để chọn.
Giá trị 8 cách K=9 một đơn vị, còn 14 cách năm đơn vị. Phần tử giữa 8 vẫn cần được giữ để chọn.
Mở hình lớn
Ở ví dụ A=[2,8,14],K=9, phần tử giữa là 8<K. Dù không bằng K, 8 vẫn gần hơn 14. Vì vậy nhánh phải giữ đoạn [mid,right], thay vì loại mid như tìm đúng K. Nếu K<A[mid], giữ [left,mid] theo lập luận tương tự. Khi miền còn một phần tử, trả phần tử ấy; khi còn hai, so sánh khoảng cách và chọn theo quy ước cách đều. Hai trường hợp cơ sở này giúp miền thật sự thu nhỏ.

Dừng ở một hoặc hai phần tử

```python def valueClosest(A, left, right, K): if left > right: return None if left == right: return A[left] if right - left == 1: if abs(A[left] - K) < abs(A[right] - K): return A[left] return A[right] mid = (left + right) // 2 if A[mid] == K: return A[mid] if K < A[mid]: return valueClosest(A, left, mid, K) return valueClosest(A, mid, right, K) ``` Gọi với left=0,right=len(A)−1. Nhánh hai phần tử dùng <; nếu cách đều, trả phía phải, tức giá trị lớn hơn hoặc bằng trên dãy không giảm. Nếu bỏ cơ sở hai phần tử, miền [0,1] có mid=0. Nhánh giữ [mid,right] lại tạo [0,1], nên có thể không tiến tới điểm dừng. Không đổi cơ sở hoặc hai biên tùy ý khi chuyển từ tìm đúng sang tìm gần nhất.

Bài luyện

Với A=[2,8,14],K=9, hàm tìm gần nhất trong bài trả gì?
Chọn một đáp án

Bài luyện

Theo quy ước của bài, A=[3,9],K=6 cần trả giá trị nào?
Chọn một đáp án

Bài luyện

Vì sao cần cơ sở riêng cho miền có hai phần tử khi các nhánh giữ mid?
Chọn một đáp án

Bài luyện

Dãy A rỗng thì hàm trả None thay vì một giá trị gần K. Vì sao phù hợp?
Chọn một đáp án

Đang học