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? ". 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 )
Đươ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ử .
[Đ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 )
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 )
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 có thể thực hiện một số "cân bằng tải".n 1
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 .