Có một thuật toán sắp xếp của người Viking nào trả về một hoán vị ngẫu nhiên khi sử dụng bộ so sánh lật xu không?


9

Lấy cảm hứng từ câu hỏi này, trong đó người hỏi muốn biết liệu thời gian chạy có thay đổi khi bộ so sánh được sử dụng trong thuật toán tìm kiếm tiêu chuẩn được thay thế bằng cách lật đồng xu công bằng hay không, và lỗi của Microsoft là viết một trình tạo hoán vị thống nhất, do đó, câu hỏi của tôi là :

Có một thuật toán sắp xếp dựa trên so sánh nào, tùy thuộc vào việc chúng tôi thực hiện bộ so sánh:

  1. trả về các phần tử theo thứ tự được sắp xếp khi sử dụng một bộ so sánh thực (nghĩa là so sánh thực hiện những gì chúng ta mong đợi trong một thuật toán sắp xếp tiêu chuẩn)
  2. trả về một hoán vị ngẫu nhiên đồng đều của các yếu tố khi bộ so sánh được thay thế bằng một lần lật đồng xu công bằng (nghĩa là trả về x < y = truevới xác suất 1/2, bất kể giá trị của x và y)

Mã cho thuật toán sắp xếp phải giống nhau. Nó chỉ là mã bên trong "hộp đen" so sánh được phép thay đổi.


Xem thêm câu hỏi này .
Raphael

2
Xem thêm câu hỏi thú vị sau: cstheory.stackexchange.com/questions/5321/iêu .
Yuval Filmus

1
Bạn có muốn so sánh ngẫu nhiên của bạn được cư xử tốt? Đây là hai cách có thể. (1) Một khi bộ so sánh tạo thành tâm trí của nó rằng , thì luôn luôn và . (2) Tương tự, nhưng nếu hơn nữa bộ so sánh quyết định rằng và , thì nó cam kết với (và ). Trong cả hai trường hợp, mỗi truy vấn không giới hạn vẫn hoàn toàn ngẫu nhiên. x < y y > x x < y y < z x < z z > xx<yx<yy>xx<yy<zx<zz>x
Yuval Filmus

@YuvalFilmus Tôi muốn về cơ bản những gì được yêu cầu trong câu hỏi được liên kết của bạn, ngoại trừ cùng một mạch cũng sẽ sắp xếp nếu chúng ta thay thế cổng ngẫu nhiên bằng một cổng trao đổi so sánh đặt hàng cặp phần tử.
Joe

1
Xem ở đây để hình dung tốt đẹp.
Raphael

Câu trả lời:


3

Thuật toán xác định (không có bộ so sánh) sau đây hoạt động cho một bộ dữ liệu đầu vào :(a1,,an)

  1. Thực hiện việc xáo trộn Fisher-Yates bằng cách sử dụng bộ so sánh của bạn với một số cặp tĩnh (giả sử ) dưới dạng lật đồng xu (thực hiện lấy mẫu từ chối chấp nhận). Nếu bộ so sánh xuất ra lần đầu tiên, hãy sử dụng nó đảo ngược để tránh vòng lặp từ chối vô tận trong trường hợp xác định. 1a1<a21
  2. (tăng tốc tùy chọn: Hãy thử một cặp lần, trong đó là độ dài hoặc đầu vào của bạn. Nếu hai đầu ra khác nhau sẽ trả về hoán vị thu được trong (1))nnn
  3. Sắp xếp mảng của bạn bằng cách sử dụng sắp xếp hợp nhất.

Đưa ra một mối quan hệ thứ tự xác định khi so sánh, thuật toán này sắp xếp một mảng theo thời gian kể từ khi shuffle Fisher-Yates chạy trong bằng cách sử dụng tối đa "bit ngẫu nhiên" không ngẫu nhiên (ví dụ như các cuộc gọi đến bộ so sánh của bạn) trong mỗi bước và sắp xếp hợp nhất có cùng độ phức tạp tiệm cận. Kết quả của (1) là hoàn toàn vô dụng trong trường hợp này, nhưng vì nó được theo sau bởi một loại thực sự, điều này không có hại.O ( n ) O ( log n )O(nlogn)O(n)O(logn)

Đưa ra một đồng xu thực sự khi bộ so sánh (1) hoán vị mảng với xác suất bằng nhau cho mỗi lần hoán vị và nếu bạn thực sự phải làm (3) (bạn bỏ qua (2) hoặc (2) không xác định được tính ngẫu nhiên), thì điều này là không tác hại vì phân phối kết quả của nó chỉ phụ thuộc vào thứ tự đầu vào được phân phối đồng đều giữa tất cả các hoán vị vì (1), do đó kết quả của toàn bộ thuật toán cũng được phân phối đồng đều. Số lần mỗi lần lấy mẫu từ chối chấp nhận phải được phân phối lại về mặt hình học (từ chối với xác suất ) và do đó, nó có giá trị mong đợi . Mỗi lần lặp lại sử dụng tối đa bit bit, vì vậy phân tích thời gian chạy gần giống như trong trường hợp xác định, nhưng chúng tôi chỉ nhận được một <2lognO(nlogn)<12<2lognthời gian chạy dự kiến của , với khả năng không bị hủy (chỉ chấm dứt gần như chắc chắn ).O(nlogn)


Như Joe đã chỉ ra: Nếu bạn không thích thử nghiệm cho bit đầu tiên trong (1), hãy làm (3) sau đó (1) và sử dụng luôn là , vì mảng đã được sắp xếp trong trường hợp xác định . Ngoài ra, bạn phải trừ số ngẫu nhiên của bạn khỏi giới hạn trên của phạm vi trong vòng lặp, bởi vì giới hạn trên cho số ngẫu nhiên mang lại hoán vị giống hệt nhau. Nhưng hãy lưu ý rằng (2) bị cấm sau đó, bởi vì bạn luôn phải thực hiện việc xáo trộn trong trường hợp tiền chuộc. 0an<a10


Bạn thậm chí có thể sử dụng cùng một cuộc gọi đến bộ so sánh của mình cho (1) và (3), nhưng sau đó chứng minh rằng kết quả được phân phối đồng đều ít nhất là khó hơn rất nhiều, nếu có thể.


Thuật toán sau đây không có các giai đoạn riêng biệt để xáo trộn và sắp xếp, nhưng chậm hơn về mặt triệu chứng. Về cơ bản, đó là sắp xếp chèn với tìm kiếm nhị phân . Tôi sẽ sử dụng để biểu thị đầu vào và để biểu thị kết quả sau vòng thứ :a=(a1,,an)bk=(bk,1,,bk,k)k

  1. Đặtb1,1=a1
  2. Nếu thì và khác và . Trong cả hai trường hợp, sẽ luôn là (tức là sai) cho một bộ so sánh không ngẫu nhiên.a2<a1b2=(a2,a1)(c,d):=(2,1)b2=(a1,a2)(c,d):=(1,2)ad<ac0
  3. Để có được cho lấy .bkk3bk1
  4. Đặt và , tức là là công suất nhỏ nhất bằng không nhỏ hơn .l=log2kk=2lk2k
  5. Đặt . Với mọi hãy để i0=0j{1,,l}
    ij={ij1+2ljij1+2lj>k1ad<acij1ij1+2lj>k1¬(ad<ac)ij1+2ljij1+2ljk1bk1,ij1+2lj<akij1ij1+2ljk1¬(bk1,ij1+2lj<ak)
  6. Nếu lặp lại (5.) khácb k = ( b k - 1 , 1 , ... , b k - 1 , i l - 1 , một k , b k - 1 , i l , ... , b k - 1 , k - 1 )il>kbk=(bk1,1,,bk1,il1,ak,bk1,il,,bk1,k1)
  7. Đầu rabn

Trường hợp ngẫu nhiên: 5 + mệnh đề if của 6 về cơ bản là lấy mẫu từ chối chấp nhận. Phần còn lại của thuật toán là một shuffle ngây thơ: xáo trộn các phần tử đầu tiên và thêm phần tử thứ vào mỗi vị trí với xác suất bằng nhau. Nếu chúng ta sử dụng loại chèn thông thường, chúng ta sẽ có phân phối nhị thức thay thế.kk1k

Lưu ý rằng thuật toán này không hiệu quả ở cả hai chế độ so với sắp xếp và hợp nhất Fisher-Yates vì ​​việc chèn một phần tử vào một vị trí tùy ý là tốn kém nếu sử dụng một mảng và tìm kiếm nhị phân cần thời gian tuyến tính nếu sử dụng danh sách. Nhưng có lẽ việc sửa đổi sắp xếp heap hoặc sắp xếp cây theo cách tương tự có thể dẫn đến một thuật toán nhanh hơn.


@Joe bạn có thể đặt tất cả các điểm của bạn vẫn còn hiệu lực cho bài đăng trong hình dạng hiện tại vào một bình luận và xóa phần còn lại không?
frafl

Tôi đã hy vọng cho một thuật toán không thực hiện các bước khác nhau tùy thuộc vào bộ so sánh nào được sử dụng. Bạn có thể tránh một vòng từ chối vô hạn mà không cần thăm dò bộ so sánh không? Tôi nghĩ rằng bạn có thể tránh bị từ chối bằng cách thực hiện bước (3) trước ...
Joe

Điều gì sẽ xảy ra nếu bạn thực hiện bước sắp xếp, sau đó thực hiện xáo trộn, nhưng sử dụng một chuỗi các phép so sánh phụ thuộc vào chỉ số , để trong trường hợp xác định, bạn có được chỉ số của phần tử (không trao đổi) và nó vẫn được sắp xếp, nhưng trong trường hợp ngẫu nhiên, bạn thực hiện xáo trộn tiêu chuẩn với lấy mẫu từ chối. i
Joe

Nhận xét đầu tiên: Lưu ý rằng tôi không vứt bỏ bit mẫu đầu tiên đó, đó là "sử dụng kép". Tôi đã nghĩ về việc đảo ngược mỗi bit thứ 2, nhưng điều đó sẽ không ngăn được vòng lặp vô tận. Trong thực tế, một số mẫu không đều là cần thiết và thậm chí có thể từ chối nhiều mục hơn. Tất nhiên tôi có thể XOR hai bit gần đây nhất thay vì bit đầu tiên và mới nhất, nhưng điều đó không thực sự khác biệt.
frafl

Nhận xét thứ hai: Thứ tự (1) so với (3) chỉ quan trọng nếu bạn sử dụng bước (2), vì trong trường hợp ngẫu nhiên, bạn phải đảm bảo rằng việc xáo trộn được thực hiện với xác suất 1 nếu không phân phối đồng đều sẽ bị vi phạm. Tại sao nó nên phụ thuộc vào ? Trong trường hợp này, sẽ luôn trả lời , đó là tất cả những gì chúng ta cần. a n < a 1 0ian<a10
frafl

4

Không, điều này là không thể trừ khi . Xác suất mà một hoán vị được tạo ra bởi thuật toán của bạn bằng cách sử dụng một bộ so sánh ngẫu nhiên là dyadic, tức là có dạng , trong khi đó xác suất phải là. Khi , không có cách nào để viếttheo hình thức .Một / 2 B 1 / n ! n > 2 1 / n ! A / 2 Bn2A/2B1/n!n>21/n!A/2B


1
Nhưng điều này chỉ đúng, nếu chúng ta cần một ràng buộc xác định trong thời gian chạy, không được yêu cầu trong câu hỏi. Nếu chúng ta chỉ yêu cầu thời gian chạy dự kiến ​​là hữu hạn, thì điều này sẽ không có vấn đề gì.
frafl

1
Bạn có biết về bất kỳ thuật toán sắp xếp hợp lý nào không kết thúc trong thời gian đa thức không?
Yuval Filmus

2
Bạn trộn trường hợp xác định và ngẫu nhiên. Thuật toán có thể chấm dứt trong thời gian đa thức xác định nếu được gọi với mối quan hệ thứ tự xác định và trong thời gian đa thức dự kiến ​​nếu được gọi với một đồng xu làm so sánh.
từ

@YuvalFilmus tại sao cây quyết định phải có lá? 2k
Joe

Nếu bạn đang thực hiện tối đa so sánh, thì xác suất của bất kỳ sự kiện nào sẽ có dạng . Nó không phải là về số lượng lá. Cách duy nhất là, như frafl gợi ý, có một số lượng so sánh không giới hạn. A / 2 kkA/2k
Yuval Filmus 22/03/13
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.