2015-04-28 17 views
6

Với một mảng không được phân loại của n số nguyên, tôi biết tôi có thể tìm ra tổng số đảo sử dụng BIT trong thời gian O (N lg N) sau phương pháp này: Count Inversion by BITPhạm vi truy vấn số đảo ngược trong thời gian O (lg N)

Tuy nhiên có thể nếu tôi phải truy vấn một phạm vi tùy ý cho tổng số nghịch đảo trong O (lg N)?

Tính toán trước O (N lg N) có thể chấp nhận được.

Tôi đã thực hiện một số nghiên cứu và dường như yếu tố N không thể tránh được ... Mọi đề xuất sẽ được đánh giá cao!

+1

"truy vấn một phạm vi tùy ý cho tổng số lần nghịch đảo" nghĩa là gì? – vib

+0

truy vấn bất kỳ phạm vi [l, r], trong đó 0 <= l <= r <= n-1, trả về tổng số nghịch đảo trong phạm vi này – shole

+0

Với bất kỳ ai quan tâm, tôi thấy ở một nơi nào đó mà ai đó sử dụng cái gì đó gọi là "Wavelet Matrix "để làm việc điều này ra ... Cấu trúc này là quá phức tạp đối với tôi bây giờ vì vậy tôi bỏ qua nó trực tiếp ... – shole

Trả lời

0

Đây không phải là câu trả lời mà bạn đang tìm kiếm, nhưng tôi có hai đề xuất.

Trước tiên, tôi không nghĩ rằng BIT là cấu trúc dữ liệu phù hợp để sử dụng cho vấn đề bạn đang cố giải quyết. Lợi thế của BIT là nó duy trì tổng tiền tố có thể truy vấn O (lg n) chỉ sử dụng O (lg n) cho mỗi lần chèn. Vì bạn không chèn khi cấu trúc dữ liệu của bạn được hoàn thành, BIT không thuận lợi (vì bạn có thể sử dụng một mảng tiền tố đơn giản, có thể truy vấn được trong O (1)).

Thứ hai, tôi có một thuật toán ngây thơ có sử dụng O (n) thời gian và không gian để xây dựng một cấu trúc dữ liệu có thể tìm thấy đảo phạm vi trong thời gian O (1) thời gian:

Thứ nhất, xây dựng một (n X n) ma trận ánh xạ các đảo ngược, sao cho chỉ mat[i][j]=1 nếu i<jarr[i]arr[j] được đảo ngược. Sau đó, tính tổng tiền tố trên mỗi hàng của ma trận này, sao cho mat[i][j] là số lần đảo ngược có liên quan đến arr[i] trong phạm vi [i,j]. Cuối cùng, tính tổng hậu tố trên mỗi cột, sao cho mat[i][j] là tổng số nghịch đảo trong phạm vi [i,j].

for i from 0 to n-2 
    for j from i+1 to n-1 
    if(arr[j] > arr[i]) 
     mat[i][j] = 1; 
for i from 0 to n-2 
    for j from i+1 to n-1 
    mat[i][j] += mat[i][j-1]; 
for j from n-1 to 1 
    for i from j-1 to 0 
    mat[i][j] += mat[i+1][j]; 

này có rõ ràng O (n) thời gian và không gian, nhưng số lượng đảo trong bất kỳ phạm vi có thể được truy vấn trong thời gian liên tục.

+0

Cách sử dụng" tiền tố mảng tổng hợp "để truy vấn" tổng số nghịch đảo trong một phạm vi? " : o – shole

+0

@shole Sau khi tiền xử lý, giá trị của 'mat [i] [j]' * là * số nghịch đảo giữa 'i' và' j'. – Kittsil

Các vấn đề liên quan