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

Nghịch đảo và cách đếm từng cặ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

Phần tử đứng trước lớn hơn phần tử đứng sau

Một cặp chỉ số (i,j) là nghịch đảo khi **i<j và A[i]>A[j]**. Chỉ số tính từ 0; hai giá trị bằng nhau không tạo nghịch đảo. Với A=[6,2,6,1], có các cặp: | Chỉ số gốc (i,j) | Giá trị (A[i],A[j]) | |---|---| | (0,1) | (6,2) | | (0,3) | (6,1) | | (1,3) | (2,1) | | (2,3) | (6,1) | Có 4 cặp. Hai dòng có cùng giá trị (6,1) vẫn là hai cặp khác nhau vì số 6 ở hai vị trí khác nhau. Cặp (0,2) không được tính vì hai giá trị đều bằng 6.

Mỗi i chỉ so với các j đứng sau

```python def count_simple(A): count = 0 for i in range(len(A) - 1): for j in range(i + 1, len(A)): if A[i] > A[j]: count += 1 return count ``` Vòng trong bắt đầu tại i+1, nên không so một vị trí với chính nó và không xét lại cặp theo chiều ngược. Có n(n−1)/2 cặp chỉ số cần so sánh, vì vậy bậc thời gian là O(n²). Dãy rỗng hoặc một phần tử trả 0. Dãy không giảm có 0 nghịch đảo; dãy giảm thực sự có n(n−1)/2 nghịch đảo. Nếu có giá trị trùng, không kết luận mọi cặp đều nghịch đảo chỉ từ việc dãy không tăng.

Bài luyện

Trong A=[6,2,6,1], vì sao (0,2) không là cặp nghịch đảo?
Chọn một đáp án

Bài luyện

Dãy mẫu có hai cặp giá trị (6,1). Cần đếm thế nào?
Chọn một đáp án

Bài luyện

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

Đang học