Sắp xếp bằng hộp đen


20

Giả sử rằng chúng ta muốn sắp xếp một danh sách gồm số thực. Giả sử rằng chúng ta được cung cấp một hộp đen có thể sắp xếp số thực ngay lập tức. Chúng ta có thể đạt được bao nhiêu lợi thế khi sử dụng hộp đen này?Snn

Ví dụ: chúng ta có thể sắp xếp các số chỉ với các lệnh gọi vào hộp đen không? Thuật toán tốt nhất mà tôi đã tìm thấy sử dụng cuộc gọi đến hộp đen. Nhưng tôi đã không thể cải thiện nó hơn nữa. Đây là thuật toán của tôi tương tự như merge-sort:O(n)n

Đầu tiên phân vùng danh sách thành liệt kê với kích thước xấp xỉ . Sau đó sử dụng các cuộc gọi vào hộp đen để sắp xếp các danh sách này. Cuối cùng, hợp nhất các danh sách được sắp xếp bằng hộp đen như sau:Sns1,s2,...,snnn

Đặt các phần tử nhỏ nhất của danh sách vào danh sách mới , sau đó gọi hộp đen để sắp xếp nó. Số trong (đầu tiên và phần tử nhỏ nhất của ) sẽ là số nhỏ nhất trong . Chúng ta có thể đặt nó ở vị trí đầu tiên của danh sách đầu ra. Giả sử phần tử đã được chọn từ , chúng ta thay thế với phần tử nhỏ nhất thứ hai trong danh sách loại , và một lần nữa chạy hộp đen trên sẽ được tính toán thành viên nhỏ thứ hai của . Chúng tôi tiếp tục cho đến khi tất cả các yếu tố được sắp xếp. Tổng số cuộc gọi hộp đen cho phần này sẽ làLL[1]LS
sjL[1]sjS
nn. Do đó, tổng số cuộc gọi sẽ là .n

Mặt khác, có vẻ như chúng ta sẽ có thể để có được một thấp-bound sử dụng thấp-bound trên so sánh số lượng cần thiết để phân loại như sau: Chúng ta có thể thực hiện các hộp đen sử dụng so sánhlgn. Nếu chúng ta có thể giải quyết vấn đề vớio(nlgn=12nlgncác cuộc gọi đến hộp đen và hợp nhất theo thời gian tuyến tính, chúng ta có thể sắp xếpnsố thực với các phépso sánho(nlgn)không thể thực hiện được.o(n)no(nlgn)

Tôi đoán chúng ta có thể chứng minh rằng là giới hạn thấp hơn cho số lượng cuộc gọi đến hộp đen, vì rất nhiều phép so sánh sử dụng trong hộp đen sẽ được chia sẻ và do đó được kể lại trong lập luận của chúng tôi.Ω(n)

UPDATE: Là các bài viết khác đề nghị, một cũng có thể đạt được.nlgn


2
Dường như có một lỗi đánh máy trong bình luận của bạn. Có phải bạn muốn nói: "không có thuật toán sử dụng ít hơn cuộc gọi đến máy có thể sắp xếpNsố thực với ít hơnNlgNso sánh "? Ps: bạn cũng nên cẩn thận về thực tế rằngNlgNgiới hạn thấp hơn chỉ giữ cho các thuật toán sắp xếp dựa trên so sánh.NNNlgNNlgN
Kaveh

8
Tôi nghĩ rằng chúng ta thậm chí có thể nhận được bằng cách sử dụng mạng phân loại của AKS. Mạng của họ có thể được coi là khởi tạo mô hình của bạn trong đó hộp đen có thể sắp xếp các khối có kích thước 2. Thuật toán của họ sử dụng các vòngO(logn), mỗi vòng gọi 2 lần sắp xếpO(n). Một "vòng" củaO(n)2-máy phân loại có thể dễ dàng mô phỏng vớiO(O(nlogn)O(logn)O(n)O(n)O(n) lọc. n
Vinayak Pathak 17/03/13

6
@VinayakPathak: Chia tay các dữ liệu đầu vào cho khối kích thước2N, và sau đó sắp xếp các khối bằng cách sử dụng mạng AKS, sau khi thay thế mỗi so sánh với mộtN/2 -sorter. N
Jeffε 17/03/13

1
@ Jɛ E: Vâng, tuyệt, điều đó chắc chắn trông đơn giản hơn so với công trình của tôi.
Vinayak Pathak 17/03/13

1
@ Jɛ E, ý kiến ​​của bạn có thể là một câu trả lời. :)
Kaveh 17/03/13

Câu trả lời:


15

Có thể sắp xếp với gọi đến hộp đen và không so sánh.O(nlogn)

Đầu tiên, hãy xem xét các vấn đề phân vùng cân bằng sau: cho yếu tố A [ 1 .. m ] (nơi mA[1..m]), phân vùng chúng thành hai nhóm, kích thước nhỏ nhất ít nhất khoảngm/4, sao cho tất cả các phần tử trong nhóm thứ nhất nhỏ hơn tất cả các phần tử trong nhóm thứ hai. Điều này có thể được thực hiện vớiO(m/nmnm/4các cuộc gọi đến hộp đen. (Tôi sẽ mô tả điều đó sau.) Sau đó, sử dụng quicksort với thuật toán phân vùng này:O(m/n)

def qsort(A[1..m]):
   if m < sqrt(n): sort A with one call to the black box
   else:
     Partition A[1..m] into two groups as described above.
     Recursively qsort the first group.
     Recursively qsort the second group.

Giả sử mỗi bước phân vùng mất cuộc gọi đến hộp đen, các thuật toán trên, đưa đầu vàoMột[1 ..n], sẽ làm choO(O(m/n)A[1..n]cuộc gọi đến các hộp đen, bởi vì cây đệ quy có chiều sâuO(logn)và mỗi cấp độ của cây có tổng cộngO(n/O(nlogn)O(logn)các cuộc gọi đến hộp đen.O(n/n)=O(n)

Thực hiện bước phân vùng như sau:

def partition(A[1..m]):  (where sqrt(n) <= m <= n)
   Divide A into m/sqrt(n) groups of size sqrt(n) each.
   Sort each group with one call to the black box per group.
   Sort the medians of the groups with one call to the black box.
   (Note the number of groups is less than sqrt(n), because m <= n.)
   Let X be the median of the medians.
   Partition all m elements around X, using the black box as follows:
      For each group G, let Y be its median:
        Call the black box once on (G - {Y}) union {X}.
        (This gives enough information to order all elts w.r.t. X.)

Trong bước cuối cùng của phân vùng thuật toán (): "Phân vùng tất cả các phần tử m quanh X", liệu điều này có sử dụng m so sánh bổ sung không?
Vinayak Pathak 17/03/13

2
Xem dòng chỉ theo thuật toán, nó giải thích cách thực hiện bước đó. Tôi sẽ chỉnh sửa nó để làm cho rõ ràng hơn.
Neal Young

24

Tôi nghĩ rằng câu hỏi của bạn đã được giải quyết trong bài viết của Beigel và Gill " Sắp xếp n đối tượng bằng cách sử dụng k-sorter " từ năm 1990 và bản tóm tắt của bài báo đã nói lên tất cả:

K-sorter là một thiết bị sắp xếp các đối tượng k theo đơn vị thời gian. Độ phức tạp của thuật toán sử dụng bộ sắp xếp k được định nghĩa là số lượng ứng dụng của bộ sắp xếp k. Trong biện pháp này, độ phức tạp của việc sắp xếp n đối tượng nằm giữa 4nlognnlognklogk , lên đến các điều khoản thứ nhất trong n và k.4nlognklogk


Cảm ơn bạn. Tôi không thể tìm thấy bài báo. Bạn có thể cung cấp các liên kết đến giấy hoặc bằng chứng của nó?
AmeerJ 17/03/13


Ngoài ra trên citeseerx .
Kaveh 17/03/13

8
k=nΘ(n)

12

O(nlogn)n

kn2(n/k)2k2n/k

BlockBubbleSort(X[0..n-1], k):
   m = floor(n/k)
   for i = 1 to m
      for j = 0 to m-1
          BlackBoxSort(X[j*k .. (j+1)*k-1])
      for j = 0 to m-1
          BlackBoxSort(X[j*k + k/2 .. (j+1)*k + k/2 - 1])

n=18k=4k

nhập mô tả hình ảnh ở đây

k/2k

O((n/k)2)O((n/k)log2(n/k))=O(nlog2n)O((n/k)log(n/k))=O(nlogn)


Ω(n lg(n))

2
O(n)

+1 cho hình ảnh đẹp đó! Tôi có thể nhầm, nhưng dường như nó không hoàn toàn chính xác (sửa tôi nếu tôi sai). Giả sử đầu ra theo thứ tự tăng dần, nếu phần tử nhỏ nhất ở vị trí cuối cùng thì không có "đường dẫn" nào để nó "di chuyển" đến vị trí đầu tiên. Thay đổi "for i = 1 thành m" thành "for i = 1 thành m + 1" dường như sửa lỗi này, mặc dù nó có thể đưa ra một số chi phí không cần thiết.
George

@George Rất tiếc, bạn đã đúng; Tôi cần thêm một lớp!
Jeffε
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.