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

Đếm nhanh hơn khi các giá trị đã liền nhau

Lưu trên thiết bị này
Kĩ thuật lập trình — CS · Chọn bài khác

Một nhóm liên tiếp, một số đếm

Nếu dãy `a` đã được sắp **không giảm**, các giá trị bằng nhau nằm thành từng đoạn liên tiếp. Với `[1, 1, 2, 4, 4, 4]`, ba đoạn có độ dài 2, 1, 3; điền độ dài của mỗi đoạn vào các vị trí của đoạn cho `[2, 2, 1, 3, 3, 3]`. Có thể giữ hai chỉ số: `start` là đầu đoạn; `end` là vị trí đầu tiên khác giá trị ấy. Độ dài đoạn là `end-start`. Không dùng cách này cho dãy chưa sắp, vì cùng một giá trị có thể nằm ở các đoạn tách nhau.

Duyệt các đoạn mà không đếm lại từ đầu

```python def dem_day_da_sap(a): b = [0] * len(a) start = 0 while start < len(a): end = start + 1 while end < len(a) and a[end] == a[start]: end += 1 for i in range(start, end): b[i] = end - start start = end return b print(dem_day_da_sap([1, 1, 2, 4, 4, 4])) ``` Kết quả là `[2, 2, 1, 3, 3, 3]`. Mỗi phần tử được duyệt trong đoạn của nó và được ghi vào `b` một lần, nên số bước tăng theo `n`: `O(n)` với đầu vào đã sắp. Với dãy rỗng, kết quả là dãy rỗng.

Bài luyện

Với dãy đã sắp `[2, 2, 2, 5, 5]`, kết quả đếm theo vị trí là gì?
Chọn một đáp án

Bài luyện

Vì sao cách duyệt theo đoạn liên tiếp cần điều kiện dãy đã sắp?
Chọn một đáp án

Bài luyện

Với đầu vào đã sắp, mã `dem_day_da_sap` có bậc thời gian nào theo n?
Chọn một đáp án

Đang học