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

Ghép ba số đếm nghịch đảo

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

Ba nhóm phủ đủ mọi cặp

```python def getInvCount(A, left, right, temp): if left >= right: return 0 mid = (left + right) // 2 countL = getInvCount(A, left, mid, temp) countR = getInvCount(A, mid + 1, right, temp) countM = merge_count(A, left, mid, right, temp) return countL + countR + countM ``` Với mỗi cặp chỉ số ban đầu i<j, hoặc cả hai ở trái, hoặc cả hai ở phải, hoặc i ở trái và j ở phải. Ba nhóm không chồng nhau nên cộng countL,countR,countM. Cơ sở miền rỗng hoặc một phần tử trả 0. Hai lời gọi nhỏ sắp xếp từng nửa trong A; bước merge_count vừa trộn chúng vừa đếm cặp chéo. Dãy A ở đây bị sửa thành thứ tự không giảm, nên cần giữ bản gốc nếu còn dùng để đối chiếu.

Tạo bản sao và dãy tạm một lần

```python def count_fast(A): B = A.copy() temp = [0] * len(B) return getInvCount(B, 0, len(B) - 1, temp) ``` Chạy tại thư mục chứa mã: ```text python3 g11-cs-thuc-hanh-chia-de-tri.py dem "6 2 6 1" ``` Hai dòng đếm cần cùng cho 4. count_fast giữ A gốc bằng bản sao B; temp tạo một lần rồi truyền tới các lời gọi. Không đếm lại trên B đã được sắp để kiểm số nghịch đảo của dữ liệu ban đầu. Bước trộn tốn O(n), hai nửa tạo công thức T(n)=2T(n/2)+O(n), nên bản chỉ đếm có O(n log n). Dãy rỗng/một phần tử/toàn bằng nhau đều cho 0; thử thêm dãy giảm và đối chiếu với count_simple.

Bài luyện

Vì sao có thể cộng countL+countR+countM?
Chọn một đáp án

Bài luyện

Vì sao count_fast tạo B=A.copy()?
Chọn một đáp án

Bài luyện

Bản chỉ đếm dùng trộn có bậc thời gian nào theo mô hình thao tác cơ bản?
Chọn một đáp án

Đang học