Sắp xếp theo khoảng cách Euclide


17

S là tập hợp các điểm trên mặt phẳng. Một điểm ngẫu nhiên được cho trên cùng một mặt phẳng. Nhiệm vụ là sắp xếp tất cả theo khoảng cách Euclide giữa và .xSySxy

Cách tiếp cận không có não là tính khoảng cách giữa và cho tất cả và sau đó sắp xếp chúng bằng bất kỳ thuật toán nhanh nào.xyyS

Có cách nào để lưu trữ hoặc tiền xử lý để quá trình sắp xếp trở nên nhanh hơn không?S


1
Bạn có thể xem xét một lưới có kích thước và điểm nhóm thích hợp theo ô vuông tương ứng (sử dụng bảng băm). Sau đó, đối với các cặp hình vuông nhất định, bạn có thể suy ra rằng tất cả các điểm từ một hình vuông đều cách xa hơn tất cả các điểm từ một hình vuông khác. Trong thực tế nó có thể giúp đỡ, tôi đoán. x
ilyaraz

Cách tiếp cận không có não của người Viking mà bạn đã nêu chạy trong thời gian O (n log n), trong đó n là số điểm trong S, mà tôi đoán là khá nhanh trong thực tế. Bạn có muốn loại bỏ yếu tố log n, hoặc bạn muốn một cái gì đó khác như sắp xếp bên ngoài ?
Tsuyoshi Ito

Vấn đề là tôi thực tế không giới hạn thời gian để chuẩn bị tập hợp điểm của mình, nhưng thời gian để sắp xếp chúng rất hạn chế. Điều đó nói rằng, bất kỳ sự tăng tốc nào của sắp xếp tiêu chuẩn đều được đánh giá cao - ngay cả khi nó giống O (n log n), nhưng nhanh hơn trong trường hợp xấu nhất (hoặc trường hợp tốt nhất, hoặc bất cứ điều gì).
Alex K.

Ví dụ: nếu tôi lưu trữ S dưới dạng cây 2 chiều, tôi có thể tìm thấy một hàng xóm gần nhất trong thời gian O (log n). Có lẽ có một giải pháp tương tự cho nhiệm vụ của tôi. Tôi không phải là một chuyên gia giỏi về cấu trúc dữ liệu không gian - và có rất nhiều trong số họ - tôi có thể dễ dàng bỏ lỡ nó.
Alex K.

Câu trả lời:


13

Giải pháp 1: Tìm các phép chia vuông góc giữa các cặp điểm và xây dựng cách sắp xếp các đường thẳng này. Sự sắp xếp có các ô Θ ( n 4 ) , trong đó thứ tự sắp xếp là không đổi. Vì vậy, xây dựng cấu trúc dữ liệu vị trí điểm để sắp xếp và trang trí mỗi ô theo thứ tự được sắp xếp sẽ được trả về cho các điểm trong ô đó. Các đơn hàng được sắp xếp giữa các ô liền kề chỉ khác nhau trong một lần chuyển vị, do đó bạn có thể sử dụng cấu trúc dữ liệu liên tục để cho phép biểu diễn của các đơn hàng được sắp xếp này để chia sẻ không gian. Tổng dung lượng là O ( n 4 ) và thời gian truy vấn là OΘ(n2)Θ(n4)O(n4) .O(logn)

Giải pháp 2: Chọn một mẫu ngẫu nhiên của các phép chia vuông góc giống nhau này, xây dựng sự sắp xếp của chúng và phân vùng mỗi ô sắp xếp theo các đoạn thẳng đứng qua mỗi đường chéo của hai đường được lấy mẫu. Phân vùng kết quả có các ô Θ ( n 2 ) , mỗi ô có xác suất cao được vượt qua bởi các phép chia không ghép đôi O ( n ) . Trang trí mỗi ô của phân vùng theo thứ tự sắp xếp hợp lệ của các điểm khi được xem từ một số x trong ô. Tổng không gian là O ( n 3 ) .Θ(n)Θ(n2)O(n)O(n3)

Bây giờ, để thực hiện truy vấn, xác định vị trí điểm truy vấn trong phân vùng, tìm kiếm thứ tự được lưu trữ với ô phân vùng và sử dụng thuật toán sắp xếp so sánh cây Cartesian của Levcopoulos & Petersson (1989) bắt đầu với thứ tự được lưu trữ này. Thời gian cho bước này tỷ lệ thuận với trong đó k i là số điểm không theo thứ tự với điểm y i . Nhưng k iO ( n ) (mỗi bisector không ghép đôi gây ra nhiều nhất một cặp điểm không theo thứ tự), vì vậy thời gian truy vấniO(1+logki)kiyikiO(n) cũng là O ( n ) .iO(1+logki)O(n)


1
PS ở đây là một biến thể thay thế của giải pháp 2 sử dụng cùng một không gian và thời gian truy vấn nhưng sử dụng thuật toán tiền xử lý phức tạp hơn cho thuật toán truy vấn đơn giản hơn: 11011110.livejournal.com/233793.html
David Eppstein

Tại sao tiền xử lý khi bạn có thể sắp xếp từ tất cả n điểm bắt đầu trong thời gian O ( n 2 log n ) và lưu trữ kết quả trong bảng băm bằng cách sử dụng khoảng trắng O ( n 2 ) để tra cứu liên tục? n4nO(n2logn)O(n2)
Dave

Bởi vì có rất bắt đầu từ điểm với thứ tự khác nhau sắp xếp, không Θ ( n 2 ) . Θ(n4)Θ(n2)
David Eppstein

1

Có lẽ bạn sẽ không thể thoát khỏi bất cứ lúc nào bạn cắt nó; thậm chí các khu vực tiền mã hóa tương ứng với tất cả các đơn hàng sắp xếp có thể có thể (tôi tin) mang lại các vùng O ( n ! ) và do đó, việc tìm 'vùng' của bạn bằng bất kỳ kỹ thuật tìm kiếm có ý nghĩa nào sẽ lấy O ( log ( n ! ) ) = O ( n log ( n log ) ) thời gian. ( CHỈNH SỬA:nlog(n)O(n!)O(log(n!))=O(nlog(n))Điều này là hoàn toàn sai; xem câu trả lời xuất sắc David Eppstein để biết thêm thông tin) Một cách hữu hiệu để nhận được xuống độ phức tạp, mặt khác - đặc biệt là nếu bạn không cần đầy đủ các loại cùng một lúc nhưng chỉ cần để có thể kéo một cách ngẫu nhiên ra th-khu vực gần đang di chuyển - có thể thông qua các sơ đồ Voronoi bậc cao: các phần mở rộng của ô Voronoi tiêu chuẩn không chỉ chứa hàng xóm gần nhất mà còn gần thứ hai, v.v. Bài viết của Frank Dehne về tìm kiếm hàng xóm gần nhất, http: //people.scs .carleton.ca / ~ dehne / ấn phẩm / 2-02.pdf dường như là tài liệu tham khảo chính tắc; trang chủ của anh ấy tại http://www.dehne.carleton.ca/publications có một số bài viết khác về sơ đồ Voronoi có thể được sử dụng.k


3
Θ(n4)O(n!)Θ(n2)

@David Tôi nghĩ bạn nên làm điều này một câu trả lời.
James King

Biệt phái - n! cảm thấy sai khi tôi viết nó, nhưng tôi không thể thấy một trường hợp chống lại. Tôi sẽ sửa đổi câu trả lời của mình ngay để sửa nó, nhưng tôi thực sự muốn thấy một câu hỏi trực tiếp hơn; cảm ơn bạn!
Steven Stadnicki
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.