Hiệu quả chèn vào danh sách giữ số lượng đảo ngược tối thiểu


15

Giả sử hai danh sách các mục so sánh: u và s. Đặt INV (u) là số lượng nghịch đảo trong u.

Tôi đang tìm kiếm một thuật toán hiệu quả để chèn các mục của s vào u với mức tăng tối thiểu của INV (u).

Về cơ bản tôi muốn chèn các đối tượng vào một danh sách trong khi giữ nó "càng được sắp xếp càng tốt" trong khi vẫn giữ thứ tự của danh sách đầu tiên.

Thí dụ:

u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)

s = [8,3,10]

one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))

different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))

Như bạn có thể thấy không có giải pháp tối ưu độc đáo.

Tôi sẽ vui mừng cho bất kỳ loại ý tưởng hoặc hướng để xem xét.


Thực phẩm cho suy nghĩ: Cách tiếp cận ngây thơ sẽ là: Lấy một yếu tố từ s, so sánh nó với từng yếu tố trong u từ trái sang phải, tăng nếu đó là một nghịch đảo và mang số đã tính trước đó. Sau đó duyệt qua danh sách từ phải sang trái với cùng một yếu tố, tăng số lượng cho từng vị trí. Điều này chạy trong O (| s | * | u |) với dấu cách = O (| u |)
trevore

1
Kiểm tra tất cả các chuỗi tăng tối đa có thể dẫn đến một nơi nào đó.
Raphael

Câu trả lời:


2

Đây là một chi tiết về câu trả lời của trevore. Quá dài để phù hợp với một nhận xét và chứa các bằng chứng về giải pháp của anh ấy (hoặc ít nhất là cách tôi hiểu nó).

Bạn có thể chỉ ra rằng trong bất kỳ giải pháp tối ưu nào, các phần tử của sẽ xuất hiện theo thứ tự. ss 1 < s 2 σ 1 s 1 s 2 s 1 β 1 s 1 σ 2 β 2 s 2 σ 1σ 2 β 2β 1 s 1 s 2 - β 1 + β 2 - σ 2 + σ 1 - 1Nếu không, giả sử và chúng xuất hiện theo thứ tự ngược lại trong một giải pháp tối ưu. Đặt là số phần tử giữa và nhỏ hơn và là số phần tử lớn hơn . Xác định và tương tự cho . Lưu ý rằng và . Hoán đổi vàs1<s2σ1s1s2s1β1s1σ2β2s2σ1σ2β2β1s1s2sẽ thay đổi số lần đảo ngược theo nhiều nhất là -1.β1+β2σ2+σ11

Không khó để thấy rằng các phần tử của có thể được chèn độc lập. s s s s sVì chúng xuất hiện theo thứ tự, các yếu tố của không "cảm thấy" sự hiện diện của nhau. Đó là, các cặp phần tử từ không đóng góp vào số lượng đảo ngược. Để làm điều đó, chèn trung bình của cách tối ưu trong thời gian tuyến tính. Sau đó, đệ quy, chèn các phần tử của nhỏ hơn trung vị bên trái của trung tuyến và các phần tử lớn hơn trung vị bên phải.ssss

Đặt trung vị được chèn vào vị trí , thời gian chạy của thỏa mãn này,, tuyến tínhyếu tố là để tìm trung vị và xáo trộn các yếu tố của . Dễ dàng thể hiện bằng cảm ứng rằng .T ( | s | , | u | ) = T ( | s | / 2 , | u | - k ) + T ( | s | / 2 , k ) + | bạn | + | s | | s | s T ( | s | , | u | ) = OkT(|s|,|u|)=T(|s|/2,|u|k)+T(|s|/2,k)+|u|+|s||s|sT(|s|,|u|)=O(|s|log|s|+|u|log|s|)

Lưu ý rằng sự phụ thuộc vàođây là tối ưu Vì việc giải bài toán với rỗng tương đương với việc sắp xếp chỉ sử dụng phép so sánh. Sự phụ thuộc vàocũng là tối ưu, kể từ khi vấn đề đối với một danh sách singleton và một danh sách phải yêu cầu công việc tuyến tính.|s|us|u|sbạn


Cảm ơn đã xây dựng. Đó chính xác là giải pháp tôi muốn nói.
trevore

1

Ok, đây là giải pháp của tôi:

Một quan sát (mà tôi ít nhiều đã chứng minh) là một giải pháp tối ưu sẽ luôn là một giải pháp trong đó s được sắp xếp tăng dần. Điều này dẫn đến thuật toán O ((| u | + | s |) * log (| s |)).

Để tìm giải pháp tối ưu cho một yếu tố duy nhất, hãy làm như tôi đã nói trong nhận xét của mình: Lấy một yếu tố từ s, so sánh nó với từng yếu tố trong u từ trái sang phải, tăng bộ đếm là đảo ngược và mang số đã tính trước đó. Sau đó duyệt qua danh sách từ phải sang trái với cùng một yếu tố, tăng số lượng cho từng vị trí.

Đây là O (| u |).

Sắp xếp s.

Đối với phần tử giữa của s tại vị trí m: Tìm vị trí b tốt nhất trong u (sử dụng phương pháp từ trên).

Tách s tại m và u tại b và gọi đệ quy với các phần bên trái và bên phải, nối các kết quả với m theo thứ tự bên phải.

Dừng lại ngay khi u hoặc s trống.


Tôi không hiểu điều này. s là một đầu vào. Bạn không thể cho rằng s theo thứ tự được sắp xếp. Thuật toán của bạn phải hoạt động cho tất cả các giá trị có thể có của s.
DW

Có, nhưng trong bất kỳ giải pháp tối ưu nào, các phần tử của s sẽ luôn được sắp xếp tăng dần trong mảng mới. Lưu ý bước "Sắp xếp s." Xem ví dụ trên. Điều tôi đã chứng minh cho đến nay là: với a, b in s, a <b nếu a được đặt tối ưu trong u, thì vị trí tối ưu cho b là bên phải của a.
trevore
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.