Tôi đang thực hiện một phần tư. Đối với những người không biết cấu trúc dữ liệu này, tôi bao gồm mô tả nhỏ sau đây:
Một quadtree là một cấu trúc dữ liệu và nằm trong mặt phẳng Euclide gì một octree là trong một không gian 3 chiều. Một cách sử dụng phổ biến của tứ giác là lập chỉ mục không gian.
Để tóm tắt cách chúng hoạt động, một hình tứ giác là một bộ sưu tập - giả sử hình chữ nhật ở đây - với dung lượng tối đa và hộp giới hạn ban đầu. Khi cố gắng chèn một phần tử vào một phần tư đã đạt đến công suất tối đa của nó, phần tư được chia thành 4 phần tư (một biểu diễn hình học sẽ có diện tích nhỏ hơn bốn lần so với cây trước khi chèn); mỗi phần tử được phân phối lại trong các cây con theo vị trí của nó, nghĩa là. phía trên bên trái bị ràng buộc khi làm việc với hình chữ nhật.
Vì vậy, một phần tư là một chiếc lá và có ít yếu tố hơn khả năng của nó, hoặc một cây có 4 phần tư khi còn nhỏ (thường là tây bắc, đông bắc, tây nam, đông nam).
Mối quan tâm của tôi là nếu bạn cố gắng thêm các mục trùng lặp, có thể là cùng một phần tử nhiều lần hoặc một số phần tử khác nhau có cùng vị trí, tứ giác có vấn đề cơ bản với việc xử lý các cạnh.
Chẳng hạn, nếu bạn làm việc với một hình tứ giác có dung lượng 1 và hình chữ nhật đơn vị làm hộp giới hạn:
[(0,0),(0,1),(1,1),(1,0)]
Và bạn thử chèn hai lần một hình chữ nhật, giới hạn phía trên bên trái là gốc: (hoặc tương tự nếu bạn thử chèn N + 1 lần trong một hình tứ giác có dung lượng N> 1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
quadtree->insert(0.0, 0.0, 0.1, 0.1)
Chèn đầu tiên sẽ không phải là một vấn đề:
Nhưng sau đó, lần chèn đầu tiên sẽ kích hoạt một phân mục (vì dung lượng là 1):
Cả hai hình chữ nhật do đó được đặt trong cùng một cây con.
Sau đó, một lần nữa, hai phần tử sẽ đến trong cùng một phần tư và kích hoạt một phân nhóm
Và cứ tiếp tục như vậy, phương thức phân chia sẽ chạy vô thời hạn bởi vì (0, 0) sẽ luôn nằm trong cùng một cây con trong số bốn được tạo, nghĩa là xảy ra sự cố đệ quy vô hạn.
Có thể có một tứ giác với các bản sao? (Nếu không, người ta có thể thực hiện nó như một Set
)
Làm thế nào chúng ta có thể giải quyết vấn đề này mà không phá vỡ hoàn toàn kiến trúc của một hình tứ giác?