Giá trị xuất hiện nhiều nhất
Mốt (mode) là giá trị có số lần xuất hiện nhiều nhất. Dãy A đã không giảm nên các giá trị bằng nhau nằm liền nhau. Với A=[−1,2,2,2,5,5], mốt là 2 với 3 lần xuất hiện.
Chọn mid; quét trái/phải từ mid để đếm trọn vùng bằng A[mid] trong miền đang xét. Tìm thêm kết quả của nửa trái và nửa phải rồi so ba tần số. Một vùng giá trị hoặc đi qua mid, hoặc nằm hoàn toàn ở một phía, nên các khả năng này phủ đủ ứng viên.
Trả giá trị mốt và tần số
```python
def mode(A, left, right):
if left > right:
return None, 0
mid = (left + right) // 2
i = j = mid
while i > left and A[i] == A[i - 1]:
i -= 1
while j < right and A[j] == A[j + 1]:
j += 1
m0, k0 = A[mid], j - i + 1
m1, k1 = mode(A, left, mid - 1)
m2, k2 = mode(A, mid + 1, right)
if k0 >= k1 and k0 >= k2:
return m0, k0
if k1 >= k0 and k1 >= k2:
return m1, k1
return m2, k2
```
Gọi mode(A,0,len(A)−1). Dãy rỗng trả (None,0). Nếu có nhiều mốt, bài toán chỉ cần một; mã ưu tiên vùng qua mid khi đồng hạng, sau đó nửa trái, rồi nửa phải. Không khẳng định lúc nào cũng trả mốt nhỏ nhất.
Hàm có quét vùng và tìm cả hai phía, nên không suy ra O(log n) chỉ từ việc chia đôi. Không tự sắp xếp trong hàm; cần đúng điều kiện không giảm trước khi gọi.
Kiểm tần số, không chỉ kiểm giá trị
Chạy:
```text
python3 g11-cs-thuc-hanh-chia-de-tri.py mot "-1 2 2 2 5 5"
```
Kết quả cần là mốt 2 và tần số 3. Thử dãy rỗng, toàn cùng một giá trị và dãy có hai mốt. Với [1,1,4,4], giá trị 1 hoặc 4 đều đáp ứng bài toán nếu kèm tần số 2; khi kiểm mã cụ thể, giữ quy tắc ưu tiên đã nêu. Chế độ mot từ chối dãy chưa không giảm.
Bài luyện
Mốt và tần số của [−1,2,2,2,5,5] là gì?
2 xuất hiện nhiều nhất với 3 lần.
5 chỉ xuất hiện 2 lần, ít hơn 2.
3 là số lần xuất hiện, không phải giá trị trong dãy.
−1 chỉ xuất hiện 1 lần.
Lời giải
Đếm các vùng giá trị: −1 có 1 lần,2 có 3 lần,5 có 2 lần. Tần số lớn nhất là 3, thuộc giá trị 2.
Bài luyện
Nếu có nhiều giá trị cùng tần số lớn nhất, yêu cầu bài toán này là gì?
Đó là điều kiện bổ sung chưa có trong yêu cầu.
Sách yêu cầu tìm một phần tử mốt khi có nhiều.
Đồng hạng không làm mất các giá trị mốt.
Tổng có thể không phải phần tử của dãy.
Lời giải
Mỗi giá trị đạt tần số lớn nhất đều là mốt. Bài này chỉ yêu cầu một giá trị hợp lệ; mã dùng quy tắc ưu tiên đã ghi để chọn.
Bài luyện
Vì sao bản mode này cần A không giảm?
Có thể có nhiều mốt đồng hạng.
Vẫn phải so tần số các ứng viên.
Bước quét từ mid dựa trên vùng các giá trị bằng nhau.
Dãy không giảm vẫn có thể chứa giá trị trùng.
Lời giải
Nếu các giá trị bằng nhau bị tách rời, quét quanh mid không đếm trọn tần số của giá trị đó. Dữ liệu không giảm bảo đảm chúng liền nhau để cách kết hợp này đúng.
Đang học