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

Tìm mốt trên dãy đã sắp xếp

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

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ì?
Chọn một đáp án

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ì?
Chọn một đáp án

Bài luyện

Vì sao bản mode này cần A không giảm?
Chọn một đáp án

Đang học