Giả sử rằng số lượng khoảng cách chỉ hoán đổi, đây là ý tưởng dựa trên hoán vị, chạy theo thời gian tuyến tính.
Bước đầu tiên của thuật toán là đảm bảo rằng hai chuỗi thực sự tương đương với nội dung ký tự của chúng. Điều này có thể được thực hiện trong thời gian tuyến tính bằng cách sử dụng một bảng băm (hoặc một mảng cố định bao gồm tất cả các bảng chữ cái). Nếu không, thì s2 không thể được coi là hoán vị của s1, và "số lượng trao đổi" là không liên quan.
Bước thứ hai tính số lượng hoán đổi tối thiểu cần thiết để chuyển đổi s2 thành s1. Điều này có thể được thực hiện bằng cách kiểm tra p hoán vị tương ứng với phép biến đổi từ s1 đến s2. Ví dụ: nếu s1 = "abcde" và s2 = "badce", sau đó p = (2,1,4,3,5), nghĩa là vị trí 1 chứa phần tử # 2, vị trí 2 chứa phần tử số 1, v.v ... hoán vị có thể được chia thành permutation cycles trong thời gian tuyến tính. Các chu kỳ trong ví dụ là (2,1) (4,3) và (5). Số hoán đổi tối thiểu là tổng số các hoán đổi được yêu cầu cho mỗi chu kỳ. Chu kỳ độ dài k yêu cầu hoán đổi k-1 để "sửa lỗi". Do đó, Số lượng hoán đổi là N-C, trong đó N là độ dài chuỗi và C là số chu kỳ. Trong ví dụ của chúng tôi, kết quả là 2 (hoán đổi 1,2 và sau đó là 3,4).
Giờ đây, có hai vấn đề ở đây, và tôi nghĩ rằng tôi quá mệt mỏi để giải quyết chúng ngay bây giờ :)
1) Giải pháp của tôi giả định rằng không có nhân vật được lặp lại, mà không phải là luôn luôn như vậy. Cần có một số điều chỉnh để tính chính xác số lần hoán đổi.
2) Công thức của tôi # MinSwaps = N-C cần bằng chứng ... Tôi không tìm thấy nó trên web.
Nguồn
2010-06-19 23:04:15
Thẻ bài tập về nhà, có thể? – KevenK
Oh wow, 110 câu hỏi, 3 câu trả lời và chỉ 6 phiếu bầu? – KevenK