Sáp nhập danh sách các đối tượng dễ vỡ


19

Bối cảnh: Chao Xu đã đăng câu hỏi sau đây một thời gian trước: " Có thuật toán sắp xếp so sánh đã biết nào không làm giảm việc sắp xếp mạng, sao cho mỗi phần tử được so sánh lần không?O(logn) ". Có vẻ như chúng ta có một chút bế tắc với vấn đề; Tôi đã thảo luận vấn đề tương tự với Valentin Polishchuk vào năm 2009, và chúng tôi không đi đến đâu.

Để có được một số ý tưởng mới, tôi đã cố gắng đưa ra câu hỏi đơn giản nhất có thể có hương vị tương tự và không hoàn toàn tầm thường. Do đó câu hỏi sau đây.


Câu hỏi: Bạn được cung cấp hai danh sách được sắp xếp, mỗi danh sách có phần tử. Bạn có thể hợp nhất các danh sách để mỗi phần tử chỉ được so sánh lần không?O ( 1 )nO(1)

Đương nhiên, đầu ra phải là một danh sách được sắp xếp có chứa tất cả các phần tử .2n

[Điều này hóa ra là tầm thường, câu trả lời là "không".]


Câu 2: Bạn được cung cấp hai danh sách được sắp xếp, mỗi danh sách có phần tử. Bạn có thể hợp nhất các danh sách để mỗi phần tử chỉ được so sánh lần không, nếu bạn được phép loại bỏ một phần nhỏ các phần tử ?O ( 1 )nO(1)

Chính xác hơn, đầu ra phải là một danh sách được sắp xếp có chứa các phần tử và "thùng rác" có chứa các phần tử . Làm thế nào nhỏ bạn có thể làm cho giá trị ? Lấy là chuyện nhỏ. Một cái gì đó như nên được thực hiện theo cách đơn giản. Nhưng bạn có thể lấy không?T ( n ) T ( n ) T ( n ) = n T ( n ) = n / 100 T ( n ) = o ( n )2nT(n)T(n)T(n)T(n)=nT(n)=n/100T(n)=o(n)


Ghi chú:

  • Chúng tôi sử dụng mô hình so sánh ở đây. Chỉ các thuật toán xác định, chúng tôi quan tâm đến các đảm bảo trong trường hợp xấu nhất.

  • Lưu ý rằng cả hai danh sách có chính xác phần tử. Nếu chúng ta có một danh sách với phần tử và một phần tử khác có phần tử, câu trả lời rõ ràng là "không"; tuy nhiên, nếu cả hai danh sách đều dài, có vẻ như người ta thể thực hiện một số "cân bằng tải".n 1nn1

  • Lần này bất kỳ loại thuật toán là hợp lệ. Nếu thuật toán của bạn sử dụng các mạng sắp xếp như một khối xây dựng, nó hoàn toàn ổn.

  • Đối với điểm bắt đầu, đây là một thuật toán đơn giản so sánh từng phần tử trong tối đa 200 lần: Chỉ cần sử dụng thuật toán hợp nhất tiêu chuẩn, nhưng duy trì bộ đếm cho các đầu của danh sách. Khi bạn đạt 200, loại bỏ phần tử. Bây giờ với mỗi phần tử mà bạn loại bỏ, bạn đã đặt thành công 200 phần tử trong mảng đầu ra của mình. Do đó bạn đã đạt được .T(n)=n/100


8
Bạn nói rằng "Nếu chúng tôi có một danh sách với n phần tử và một danh sách khác có 1 phần tử, câu trả lời rõ ràng là không." Không phải trường hợp với n phần tử trong mỗi danh sách là một vấn đề tổng quát hơn sao? Ví dụ: nếu chúng tôi hứa rằng tất cả các yếu tố trong danh sách thứ hai ngoại trừ yếu tố đầu tiên lớn hơn nhiều so với tất cả các yếu tố trong danh sách đầu tiên, điều này có làm giảm vấn đề đầu tiên không?
Robin Kothari

@Robin: Phải, vì vậy tôi đã không đưa ra được một câu hỏi không tầm thường, cảm ơn. Sự quan sát của bạn dường như khiến giới hạn bị ràng buộc thấp hơn nếu chúng tôi khăng khăng đòi sắp xếp tất cả các yếu tố. Hãy để tôi tăng nhẹ câu hỏi ...Ω(logn)
Jukka Suomela

Và trong trường hợp kỳ một người nào đó quan điểm của định nghĩa dường như lạ trong Câu hỏi 2 là gì: nếu chúng ta có thể làm cho rất nhỏ, có lẽ chúng ta có thể sử dụng một cái gì đó giống như merge sort để gần như giải quyết vấn đề ban đầu, và lo lắng về một phần rất nhỏ của các yếu tố trong thùng rác sau này. T(n)
Jukka Suomela

Câu trả lời:


5

Không, một thuật toán như vậy không thể tồn tại.

Giả sử so sánh cho mỗi phần tử được cho phép.t

2t2t+1t+1

nn/2tn/2t

to(n)

Mặt khác, dường như có thể khớp với giới hạn này bằng thuật toán trong đó mọi phần tử được so sánh với nhật ký gần đúng về kích thước của phần xung quanh của danh sách khác. Nếu điều này được quan tâm, tôi sẽ cố gắng tìm ra các chi tiết.

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.