Tuy nhiên, một câu trả lời không cần thiết! Điều này bảo tồn mảng hoán vị P
một cách rõ ràng, đó là cần thiết cho tình hình của tôi, nhưng hy sinh trong chi phí. Ngoài ra điều này không yêu cầu theo dõi các yếu tố được đặt chính xác. Tôi hiểu rằng câu trả lời trước đó cung cấp giải pháp O(N)
, vì vậy tôi đoán câu trả lời này chỉ để giải trí!
Chúng tôi nhận được trường hợp phức tạp tốt nhất O(N)
, trường hợp xấu nhất O(N^2)
và trường hợp trung bình O(NlogN)
. Đối với mảng lớn (N~10000
hoặc cao hơn), trường hợp trung bình về cơ bản là O(N)
.
Đây là thuật toán cốt lõi trong Java (Ý tôi là pseudo-code * ho ho *)
int ind=0;
float temp=0;
for(int i=0; i<(n-1); i++){
// get next index
ind = P[i];
while(ind<i)
ind = P[ind];
// swap elements in array
temp = A[i];
A[i] = A[ind];
A[ind] = temp;
}
Dưới đây là một ví dụ về thuật toán chạy (tương tự như câu trả lời trước):
cho A = [a, b, c, d, e]
và P = [2, 4, 3, 0, 1]
sau đó dự kiến = [c, e, d, a, b]
i=0: [a, b, c, d, e] // (ind=P[0]=2)>=0 no while loop, swap A[0]<->A[2]
^ ^
i=1: [c, b, a, d, e] // (ind=P[1]=4)>=1 no while loop, swap A[1]<->A[4]
^ ^
i=2: [c, e, a, d, b] // (ind=P[2]=3)>=2 no while loop, swap A[2]<->A[3]
^^
i=3a: [c, e, d, a, b] // (ind=P[3]=0)<3 uh-oh! enter while loop...
^
i=3b: [c, e, d, a, b] // loop iteration: ind<-P[0]. now have (ind=2)<3
? ^
i=3c: [c, e, d, a, b] // loop iteration: ind<-P[2]. now have (ind=3)>=3
?^
i=3d: [c, e, d, a, b] // good index found. Swap A[3]<->A[3]
^
done.
thuật toán này có thể trả lại xung quanh trong đó while
vòng lặp cho bất kỳ chỉ số j<i
, lên đến tối đa là i
lần trong ith
lặp. Trong trường hợp xấu nhất (tôi nghĩ!) Mỗi lần lặp của vòng ngoài for
sẽ dẫn đến việc thêm i
các bài tập bổ sung từ vòng lặp while
, vì vậy chúng tôi sẽ có một chuỗi số học đang diễn ra, sẽ thêm một yếu tố N^2
vào độ phức tạp! Chạy điều này trong phạm vi N
và tính trung bình số lượng bài tập 'phụ' cần thiết theo vòng lặp while
(trung bình trên nhiều hoán vị cho mỗi N
, nghĩa là), mạnh mẽ cho tôi biết rằng trường hợp trung bình là O(NlogN)
.
Cảm ơn!
Bạn có thể sử dụng không gian cố định bằng cách nào? Các mảng đầu vào của bạn sử dụng không gian 'O (n)', không phải là hằng số. –
@Patrick Bạn có thể tái sử dụng mảng đầu vào - về cơ bản, vấn đề là áp dụng hoán vị "tại chỗ". – dasblinkenlight