Thuật toán hiệu quả cho ngăn chặn hình chữ nhật


7

Cho một bộ n khoảng trên một dòng, có một O(nlogn)thuật toán để tìm các khoảng được chứa trong các khoảng khác (ví dụ: Manber, "Sử dụng quy nạp để thiết kế thuật toán", 1988). Có mộtO(nlogn) thuật toán cho hình chữ nhật thẳng hàng trục trong kích thước cao hơn?

Tôi đã thực hiện một số tìm kiếm trên internet và cố gắng tự nghĩ về nó, nhưng không thể tìm thấy một sự khái quát cho các chiều cao hơn. Ví dụ, được đưa ran hình chữ nhật thẳng hàng trên mặt phẳng, nhiệm vụ là tìm hình chữ nhật nào được chứa trong các hình chữ nhật khác.


2
Một cách tiếp cận để tìm ra giải pháp cho vấn đề n + 1 chiều là " quét " một "mặt phẳng" n chiều qua không gian có liên quan; một cách khác là chia nhỏ mặt phẳng sau bằng một mặt phẳng như vậy, giải quyết vấn đề một cách đệ quy cho những vật thể không giao nhau với mặt phẳng phân chia và một vật thể khác cho những vật thể đó và đưa ra kết quả.
greybeard

@vzn và DW: chỉnh sửa câu hỏi. Đối với tôi, dường như nhận xét đầu tiên (greybeard) dẫn đến một thuật toán hiệu quả (một "đường quét" thẳng đứng có giao điểm với các hình chữ nhật trải qua các thay đổi cấu trúc tại "các điểm phân nhánh", là các hình chiếu của các cạnh dọc của hình chữ nhật).
John Donn

@vzn đây có phải là "khái quát hóa tự nhiên" mà bạn có trong đầu không? Nếu không, có lẽ bạn có thể gửi một câu trả lời.
John Donn

"Dường như đối với tôi, nhận xét đầu tiên (của greybeard) dẫn đến một thuật toán hiệu quả .." - mặc dù tôi đã thử, tôi không thể tìm cho mình một cấu trúc dữ liệu phù hợp để duy trì các giao điểm của đường quét dọc với các hình chữ nhật (như vậy các hoạt động tổng thể được yêu cầu là little_o (n ** 2)).
John Donn

Câu trả lời:


2

Bạn đã xem xét các chỉ số đa chiều? Chúng thường khá hiệu quả để tìm các hình chữ nhật chồng chéo hoặc bao gồm.

Cá nhân tôi đã viết một loại tứ giác nhị phân chia sẻ tiền tố: Nguồn Java Nó có API cho hình chữ nhật với một phương pháp đặc biệt để tìm kiếm hình chữ nhật có trong một hình chữ nhật khác : PhTreeSolidF.queryInclude().

Tôi không chắc độ phức tạp là gì nhưng nó đại khái là thứ gì đó theo thứ tự O (n * k * log n) để xây dựng cây và O (k * log n) cho mỗi truy vấn (k là số lượng kích thước). Đối với các bộ dữ liệu được phân cụm mạnh mẽ, nó thậm chí có thể trở thành thứ gì đó thua O (1) cho mỗi truy vấn (tôi đã thử nghiệm điều này với n = 10.000.000 và 2 <= k <= 15).


-1

có một phần mở rộng / khái quát hóa tự nhiên của phạm vi tìm kiếm cho các hình chữ nhật được căn chỉnh theo trục và các siêu hình chiều cao hơn.

vấn đề giảm xuống để kiểm tra bao gồm phạm vi riêng biệt trên mỗi trục và sau đó tìm giao điểm của hình chữ nhật hoặc siêu hình "sở hữu" mỗi bao gồm phạm vi 1-d. phải mất k * O (f (n)) trong đó f (n) là thời gian để kiểm tra một thứ nguyên duy nhất và k là số thứ nguyên. điều này dựa trên ý tưởng đơn giản rằng đối với các hình chữ nhật / hypercubes được căn chỉnh theo trục, một hypercube nằm trong một hypercube khác, tất cả các mặt riêng biệt của nó cũng vậy. điều này không xác định chỉ đơn thuần chồng chéo các hình chữ nhật / hypercubes liên kết ngang mặc dù một thuật toán tương tự có thể làm như vậy.

tôi không biết điều này được công bố trong các tài liệu nhưng nó không phức tạp và có lẽ nó được trích dẫn ở đâu đó ít nhất là thông qua. tài liệu về chủ đề này thường hoạt động với Kd-cây hoặc tứ giác (trường hợp 2d) và nằm trong danh mục chung của truy vấn / tìm kiếm phạm vi cơ sở dữ liệu . Cách tiếp cận thường là cho phép các đối tượng hình học chung được xác định như đa giác và sau đó tìm tất cả các nút trong Kd mà đa giác trùng với và thực hiện tính toán phạm vi trên tất cả các nút của đa giác để xác định giao điểm.


1
Tôi có cảm giác bạn đang mô tả một Ôi(k*n2)thuật toán ở đây. Điều này còn tệ hơn những gì OP yêu cầu. Một điểm quan trọng là, đầu ra của việc kiểm tra của bạn trên mỗi thứ nguyên là gì. Có phải nó chỉ đánh dấu các mục được bao phủ bởi một cái gì đó HOẶC nó là một bản ghi của các mục bao gồm những gì? Bởi vì nếu là trước đây, tôi không nghĩ rằng thông tin đó đủ để kết hợp các kết quả của từng thứ nguyên. Bạn cần phải biết danh tính của mục nhập. Trong phiên bản sau mà bạn ghi lại danh tính của mục nhập, thời gian thực hiện làÔi(n2)cho mỗi D như tôi có thể nghĩ.
Apiwat Chantawibul

đồng ý phân tích phức tạp không tầm thường & không chi tiết / điền vào nhưng nghĩ rằng nó "gần gũi". các vùi trong phạm vi 1d có thể được biểu diễn dưới dạng cây cho mối quan hệ "A bên trong B". đôi khi có thể viết mã lên ruby ​​với một số xu hướng khác. có thể làm rõ chi tiết trong Trò chuyện Khoa học Máy tính cho bất cứ ai có thời gian
vzn
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.