Một thuật toán sắp xếp trường hợp đặc biệt tốt là gì?


13

Tôi có một bộ dữ liệu là một số đối tượng được sắp xếp trong lưới 2 chiều. Tôi biết tôi có một thứ tự nghiêm ngặt, tăng dần khi bạn đi từ trái sang phải trong mỗi hàng và tăng dần từ trên xuống dưới trong mỗi cột. Ví dụ,

  • 1 2 3
  • 4 6 7
  • 5 8 9

Tôi có thể cải thiện việc sắp xếp ngây thơ để sắp xếp toàn bộ dữ liệu một cách tuyến tính (như được đo trong so sánh) không?

Điều gì về bộ dữ liệu nd? Các tập dữ liệu hữu hạn tùy ý với một tập hợp các phép so sánh đã biết?


1
Bạn có thể hỏi một câu hỏi chính xác hơn? Đoạn đầu tiên của bạn có thể được đọc để ngụ ý rằng dữ liệu của bạn đã được sắp xếp! Chính xác đầu vào của bạn là gì, và đầu ra nào bạn muốn?
Jacques Carette

1
Vâng, ngôn ngữ là một chút bối rối. Phải mất một thời gian tôi mới nhận ra rằng tập dữ liệu bao gồm n số được sắp xếp nhưng những số này được sắp xếp theo lưới sqrt (n) x sqrt (n) sao cho mỗi hàng và mỗi cột đã được sắp xếp. Đó có phải ý của bạn?

Vâng, đó là những gì tôi muốn nói. Tôi sẽ chỉnh sửa cho rõ ràng.
Zachary Vance

Câu trả lời:


19

Thật dễ dàng để chứng minh một Ω (n 2 log n) bị ràng buộc thấp hơn trong vấn đề này (trong mô hình sắp xếp so sánh): nếu phần tử ở vị trí (i, j) luôn nằm trong khoảng cách 1/2 của i + j, thì lưới các đường chéo là độc lập với nhau và thứ tự được sắp xếp trong mỗi đường chéo lưới là tùy ý. Vì vậy, theo ràng buộc này, tổng số thứ tự có thể là sản phẩm (trên tất cả các đường chéo của lưới) của các giai thừa về độ dài của các đường chéo, theo cấp số nhân trong n 2 log n.

Điều đó có nghĩa là các thuật toán sắp xếp so sánh tiêu chuẩn là tối ưu không có triệu chứng cho các lưới được đặt hàng như bạn mô tả.


Câu trả lời khác đưa ra một thuật toán rõ ràng với độ phức tạp này, vì vậy tôi sẽ xem xét vấn đề này được giải quyết cho các lưới 2 chiều và, mà không thực sự kiểm tra, có lẽ là cho các lưới kích thước tùy ý.
Zachary Vance

4

Nếu tôi hiểu chính xác vấn đề (và tôi có thể không, vui lòng cho tôi biết nếu tôi không) bạn muốn chuyển đổi lưới 2D thành mảng 1D được sắp xếp, trong khi mỗi hàng và cột đã được sắp xếp trong lưới 2D?

Phần tử đầu tiên trong danh sách trong trường hợp này phải là góc trên cùng bên trái ((0,0), theo định nghĩa của vấn đề). Sau đó, nó phải là phần tử (1,0) hoặc (0,1), vì tất cả các phần tử khác sẽ lớn hơn các phần tử này theo định nghĩa.

Bạn có thể khái quát bằng cách nói rằng phần tử nhỏ nhất tiếp theo trong lưới luôn nằm ngay bên dưới phần tử đã được sử dụng (hoặc cạnh của lưới) và bên phải của phần tử đã được sử dụng (hoặc cạnh của lưới), vì cả hai phần tử đều được sử dụng được định nghĩa là nhỏ hơn nó. Vì vậy, ở mỗi lần lặp, bạn chỉ phải xem xét giá trị nhỏ nhất đáp ứng yêu cầu này.

Bạn có thể giữ các ứng viên có thể theo thứ tự được sắp xếp khi bạn tìm thấy chúng (không quá hai sẽ có sẵn trong một lần lặp) và tại mỗi lần lặp, hãy kiểm tra các giá trị mới có sẵn (nếu có). Nếu họ thấp hơn mức thấp nhất của các ứng cử viên trước, hãy thêm họ vào danh sách ngay lập tức và lặp lại, nếu không hãy thêm ứng viên thấp nhất trước đó và so sánh với mức thấp nhất tiếp theo, v.v.

Thật không may, tôi không tuyên bố rằng nó có thể cung cấp một sự phức tạp chính xác của điều này, tôi cũng không cho rằng nó hiệu quả nhất có thể, nó chắc chắn có vẻ tốt hơn một cách tiếp cận ngây thơ, và tôi hy vọng tôi đã giải thích nó đủ để bạn hiểu.

EDIT: Đối với các lưới thứ hai như thế này, tôi tin rằng nguyên tắc cơ bản tương tự được áp dụng, nhưng mỗi lần lặp lại tạo ra n ứng cử viên mới và các ứng cử viên này phải là các yếu tố không sử dụng nhỏ nhất trong mỗi chiều thứ n tại thời điểm này.


Nói tóm lại, bạn có thể thực hiện hợp nhất sqrt (N) -way, như trong mergesort? Đó là phương pháp tốt nhất của tôi, nhưng hóa ra là O (N log N) - Tôi không có hằng số chính xác ở đó, nhưng ít nhất có 0,5 cho log (sqrt (N)).
Zachary Vance
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.