Vấn đề thú vị về sắp xếp


14

Cho một ống với các quả bóng được đánh số (ngẫu nhiên). Các ống có lỗ để loại bỏ một quả bóng. Hãy xem xét các bước sau cho một thao tác:

  1. Bạn có thể chọn một hoặc nhiều quả bóng từ các lỗ và ghi nhớ thứ tự bạn chọn quả bóng.
  2. Bạn cần nghiêng ống về phía bên trái để các quả bóng còn lại trong đường ống dịch chuyển sang trái và chiếm khoảng trống được tạo bằng cách loại bỏ các quả bóng.
  3. Bạn không được yêu cầu thay đổi thứ tự bạn chọn những quả bóng được đánh số từ đường ống. Bây giờ bạn đặt chúng trở lại một lần nữa trong đường ống bằng cách sử dụng khoảng trống được tạo bởi chuyển động của quả bóng.

Bước 1 đến 3 được coi là một thao tác.

Tìm hiểu các hoạt động tối thiểu cần thiết để sắp xếp các quả bóng được đánh số theo thứ tự tăng dần.

Ví dụ: Nếu ống chứa: [1 4 2 3 5 6]

Sau đó, chúng tôi có thể lấy ra 56 , và nếu chúng tôi nghiêng ống sang trái, chúng tôi nhận được [ 1 2 3 ] , và chúng tôi chèn ( 4 5 6 ) theo thứ tự đó vào cuối ống để lấy [ 1 2 3 4 5 6 ] .456[1 2 3](4 5 6)[1 2 3 4 5 6]

Vì vậy, số bước tối thiểu cần thiết là 1. Tôi cần tìm các hoạt động tối thiểu để sắp xếp đường ống.

Bất kỳ ý tưởng hoặc gợi ý về cách giải quyết vấn đề này?


Nếu chúng đến theo thứ tự ngược lại, bạn phải lấy ra 2, 3, ... theo thứ tự và thêm vào cuối, cho hoạt động trong tất cả. Đây rõ ràng là trường hợp xấu nhất.n
vonbrand

2
8,7,6,5,4,3,2,1 -> 75318642 -> 51627384 -> 12345678 bằng cách luôn lấy các vị trí lẻ.
adrianN

Tóm tắt câu trả lời của tôi: số lượng tối thiểu các hoạt động cần thiết để sắp xếp một hoán vị log 2 ( d ( π - 1 ) + 1 ) , nơi d ( ) là số descents. πlog2(d(π1)+1)d()
Yuval Filmus

Tôi thích nghĩ về nó trong việc loại bỏ các nghịch đảo. Với mỗi thao tác, bạn có thể loại bỏ nghịch đảo giữa bất kỳ bộ S - X (trong đó S là toàn bộ các quả bóng). Vì vậy, bạn chỉ cần chọn bộ X của bạn một cách cẩn thận. XSXSX
Joe

Câu trả lời:


10

Xác định số phân vùng chạy của hoán vị , ký hiệu là r ( π ) , sử dụng quy trình sau. Gọi k là số nguyên cực đại sao cho các số min (πr(π)k xuất hiện trong thứ tự tăng dần trong π . Loại bỏ chúng khỏi π và lặp lại quá trình. Số vòng cần để tiêu thụ toàn bộ hoán vị là r ( π ) .min(π),,kππr(π)

Ví dụ: hãy tính . Trước tiên, chúng tôi dành 1 , để có được 6273584 . Sau đó, chúng tôi dành ra 234 , để có được 6758 . Sau đó, chúng tôi dành 5 , để có được 678 . Cuối cùng, chúng tôi dành 678 để có được hoán vị trống. Điều này mất bốn vòng, vì vậy r (r(62735814)1627358423467585678678 .r(62735814)=4

Cách biểu diễn này hữu ích cho việc sắp xếp ? Thực hiện mỗi lần chạy thứ hai, tức là 234 , 678 và di chuyển các số này sang bên phải để nhận 51627384 (chỉnh sửa: theo thứ tự chúng xuất hiện trong hoán vị, tức là 627384 ). Bây giờ chỉ có hai lần chạy, cụ thể là 1234 , 5678 và chúng ta có thể sắp xếp danh sách bằng cách di chuyển 5678 sang phải.62735814234,678516273846273841234,56785678

Bây giờ hãy để tôi làm cho giả thuyết sau: Đối với một hoán vị , chúng ta hãy Π là tập hợp của tất cả các hoán vị có thể truy cập từ π trong vòng một di chuyển. Rồi phút α pi r ( α ) = r ( π ) / 2 .πΠπminαΠr(α)=r(π)/2

Với phỏng đoán này, thật dễ dàng để chỉ ra rằng số lượng di chuyển tối thiểu cần thiết để sắp xếp một hoán vị logπ , và tôi đã xác minh công thức này cho tất cả các hoán vị trong S n cholog2r(π)Sn .n8

Chỉnh sửa: Dưới đây là một cách hiểu khác nhau về số phân vùng chạy đưa ra thuật toán thời gian tuyến tính để tính toán nó và cho phép tôi phác thảo một bằng chứng về phỏng đoán của mình, do đó xác minh công thức .log2r(π)

Hãy xem xét hoán vị một lần nữa. Lý do mà lần chạy đầu tiên kết thúc bằng 12 xuất hiện trước 1 . Tương tự, lần chạy thứ hai kết thúc sau 45 xuất hiện trước 4 , v.v. Do đó, số phân vùng chạy của một hoán vị là số i s sao cho i + 1 xuất hiện trước i .62735814121454ii+1i

Chúng ta có thể nói điều này ngắn gọn hơn nếu chúng ta nhìn vào nghịch đảo của hoán vị. Xem xét lại . Lấy π - 1 = 72485136 . Hoán vị này có ba hậu duệ : 7 2 48 5 1 36 (một hậu duệ là một vị trí nhỏ hơn vị trí trước). Mỗi phần tử tương ứng với sự bắt đầu của một lần chạy mới. Vậy r ( π ) bằng một cộng với số lượng con cháu trong π - 1 .π=62735814π1=7248513672485136r(π)π1

Các hoạt động trông như thế nào trong điều khoản của ? Đặt B là tập hợp các số mà chúng ta di chuyển sang phải và A là tập hợp các số ở bên trái. Chúng tôi thay thế các số trong A bằng hoán vị trên { 1 , Mạnh , | Một | } biểu diễn thứ tự tương đối của chúng và thay thế các số trong B bằng hoán vị trên { | Một | + 1 , ... , | Một | + | B | }π1BAA{1,,|A|}B{|A|+1,,|A|+|B|} . Ví dụ, hãy xem xét di chuyển . Xét về hoán vị nghịch đảo, đó là 7 248 56273581451627384 . Vì vậy, 75 đã được ánh xạ đến 21 248136 được ánh xạ đến 468357 .72485136246813577521248136468357

Một hậu duệ trong π - 1 bị mất sau khi hoạt động chỉ nếu x Ay B . Ngược lại, trong điều kiện của π - 1 , phân vùng vào mộtB tương ứng với Một -runs và B -runs; mỗi khi B -run kết thúc và A -run bắt đầu, sẽ có một hậu duệ. Để "giết" một hậu duệ, chúng ta phải chuyển từ A- tràn sang Bxyπ1xAyBπ1ABABBAAB tràn. Nếu chúng ta giết hai hậu duệ, chúng ta sẽ chuyển từ giữa B -run sang -run, phát sinh một hậu duệ.A

Lập luận này có thể được chính thức để chứng minh rằng nếu phát sinh từ π qua một ca mổ, sau đó d ( α - 1 ) d ( π - 1 ) / 2 , nơi d ( ) là số descents. Đây là tương đương với r ( α ) r ( π ) / 2 απd(α1)d(π1)/2d()r(α)r(π)/2, do đó chứng minh một hướng phỏng đoán của tôi. Theo một hướng khác là dễ dàng hơn, và đã được nêu ở trên: chúng tôi chỉ đơn giản là tận dụng mọi chạy thứ hai và đẩy những chạy sang bên phải để có được một hoán vị thỏa mãn r ( α ) = r ( π / 2 ) .αr(α)=r(π/2)


You are taking out several rounds of balls at once, I understand that isn't allowed.
vonbrand

1
I'm taking them in the order they appear in the permutation. That is legal.
Yuval Filmus

i am bit confused. can you please explain min number of operations required to sort [6 5 4 3 2 1] and also you mentioned like "Take every second run, i.e. 234,678, and move these numbers to the right to get 51627384" can you please explian this with detail and also how to calculate r(π) efficently?
user6709

1) r(654321)=6, so you would need 3 operations. For example, 654321531|64251|62341234|56.
Yuval Filmus

2) You take all the numbers belonging to these runs (in the order they appear in the permutation), and move them to the right. In this case, you take 627384 and move them to the right, leaving 51 to the left.
Yuval Filmus
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.