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

Đếm cặp nghịch đảo bằng đệ quy

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

Đúng thứ tự chỉ số nhưng ngược thứ tự giá trị

Cặp (i,j) là cặp nghịch đảo nếu **i<j và A[i]>A[j]**. Chỉ số bên trái nhỏ hơn chỉ số bên phải, nhưng giá trị bên trái lớn hơn. Hai phần tử bằng nhau không tạo nghịch đảo vì điều kiện là >, không phải ≥. Với A=[4,1,4,2], các cặp thỏa điều kiện là: | (i,j) | (A[i],A[j]) | |---|---| | (0,1) | (4,1) | | (0,3) | (4,2) | | (2,3) | (4,2) | Có 3 cặp. Hai cặp cùng mang giá trị (4,2) vẫn khác nhau vì thuộc các chỉ số khác nhau. Cặp (0,2) có hai giá trị bằng 4 nên không tính.

Thêm các cặp kết thúc tại chỉ số k

Hàm xét phần đầu A[0] tới A[k]. Các cặp trong phần đầu chia thành hai nhóm: cặp đã nằm hoàn toàn trong A[0] tới A[k−1], và cặp mới có chỉ số bên phải là k. ```python def nghich_dao(A, k): if k <= 0: return 0 c = 0 for i in range(k): if A[i] > A[k]: c += 1 return c + nghich_dao(A, k - 1) ``` Gọi `nghich_dao(A,len(A)-1)`. Ở mỗi bước, k là **chỉ số cuối**, không phải số phần tử. Với ví dụ trên, k=3 thêm hai cặp (0,3),(2,3); k=2 không thêm cặp; k=1 thêm (0,1). Tổng là 2+0+1=3. Mỗi cặp được tính đúng một lần ở bước k=j. Khi dãy rỗng, k=−1 nên trả 0; dãy một phần tử cũng chưa có cặp i<j.

Đối chiếu bằng hai vòng lặp

Có thể đếm trực tiếp từng cặp i<j: ```python def nghich_dao_lap(A): c = 0 for i in range(len(A) - 1): for j in range(i + 1, len(A)): if A[i] > A[j]: c += 1 return c ``` Hai bản phải cùng cho 3 trên [4,1,4,2]. Cả hai chỉ đọc và không sửa A. Nếu dùng hàm sắp xếp chèn đã học trước khi đếm, A bị đổi thành dãy không giảm và số cặp nghịch đảo trở thành 0; khi cần đếm trên dữ liệu gốc phải giữ đúng dữ liệu ấy.

Bài luyện

Dãy [4,1,4,2] có bao nhiêu cặp nghịch đảo?
Chọn một đáp án

Bài luyện

Vì sao hai cặp giá trị (4,2) trong ví dụ đều được tính?
Chọn một đáp án

Bài luyện

Trong lời gọi nghich_dao(A,3) với A=[4,1,4,2], biến c tại bước k=3 nhận giá trị nào?
Chọn một đáp án

Bài luyện

Vì sao nghich_dao([],len([])-1) trả 0 mà không đọc phần tử?
Chọn một đáp án

Đang học