Tại sao người ta lại sử dụng Octree trên cây KD?


32

Tôi có một số kinh nghiệm về điện toán khoa học và đã sử dụng rộng rãi các cây kd cho các ứng dụng BSP (phân vùng không gian nhị phân). Gần đây tôi đã trở nên quen thuộc hơn với octrees, một cấu trúc dữ liệu tương tự để phân vùng các không gian Euclide 3-D, nhưng một không gian hoạt động theo các khoảng thời gian cố định, từ những gì tôi thu thập được.

Một chút nghiên cứu độc lập dường như chỉ ra rằng cây kd thường có hiệu suất vượt trội đối với hầu hết các bộ dữ liệu - nhanh hơn để xây dựng và truy vấn. Câu hỏi của tôi là, những lợi thế của octrees trong hiệu suất không gian / thời gian hay nói cách khác, và trong những tình huống nào chúng được áp dụng nhiều nhất (tôi đã nghe lập trình đồ họa 3D)? Một bản tóm tắt về những lợi thế và vấn đề của cả hai loại tôi sẽ đánh giá cao nhất.

Ngoài ra, nếu bất cứ ai có thể giải thích chi tiết về việc sử dụng cấu trúc dữ liệu R-tree và các ưu điểm của nó, tôi cũng sẽ biết ơn vì điều đó. Cây R (nhiều hơn octrees) dường như được áp dụng khá giống với cây kd cho các tìm kiếm hàng xóm hoặc phạm vi gần nhất.


Tôi nên lưu ý rằng cả cây kd và cây R (nhưng không phải octrees) dường như được thiết kế đặc biệt để tạo điều kiện cho các tìm kiếm hàng xóm gần nhất của k - làm thế nào để chúng so sánh theo nghĩa này?
Noldorin

Một lưu ý là cây kd đã đảm bảo độ sâu nhỏ. Cây bốn lá nén có thể đưa bạn đến đó, nhưng ít thuận tiện hơn.
Suresh Venkat

@Suresh Venkat: Cảm ơn vì điều đó. Tôi không quen thuộc với tứ giác nén, nhưng chúng có thực sự phù hợp với đại diện không gian 3 chiều không? Có lẽ có một tương tự "octree nén".
Noldorin

Tôi cũng đã nghe nói rằng octrees thích hợp hơn khi người ta có đường cong Z-order (lấp đầy không gian) đã biết, nhưng không chắc chắn về lý do ở đây.
Noldorin

Câu trả lời:


23

Các ô trong -tree có thể có tỷ lệ khung hình cao, trong khi các ô octree được đảm bảo là hình khối. Vì đây là một bảng lý thuyết, tôi sẽ cung cấp cho bạn lý do lý thuyết tại sao tỷ lệ khung hình cao là một vấn đề: nó không thể sử dụng giới hạn âm lượng để kiểm soát số lượng ô mà bạn phải kiểm tra khi giải quyết các truy vấn lân cận gần nhất.kD

Chi tiết hơn: nếu bạn yêu cầu -approximate láng giềng gần nhất với điểm truy vấn và hàng xóm gần nhất thực tế ở khoảng cách , bạn thường kết thúc bằng một tìm kiếm kiểm tra mọi ô cấu trúc dữ liệu tiếp cận từ bên trong đến mặt ngoài của vỏ hình khuyên hoặc hình khuyên có bán kính trong và bán kính ngoài . Nếu các ô có tỷ lệ khung giới hạn, vì chúng ở trong một phần tư, thì có thể có nhiều nhất các ô như vậy và bạn có thể chứng minh giới hạn tốt về thời gian cho truy vấn. Nếu tỷ lệ khung hình không bị giới hạn, như trong -tree, các giới hạn này không áp dụng.q d d ( 1 + ε ) d 1 / ε d - 1 k Dϵqdd(1+ϵ)d1/ϵd1kD

kD -trees có một lợi thế khác so với tứ giác, ở chỗ chúng được đảm bảo có độ sâu logarit nhất, điều này cũng đóng góp vào thời gian cho truy vấn lân cận gần nhất. Nhưng độ sâu của một phần tư nhiều nhất là số bit có độ chính xác của đầu vào thường không lớn và có các phương pháp lý thuyết để kiểm soát độ sâu về cơ bản là logarit (xem cấu trúc dữ liệu của phần tư bỏ qua).


4
Xem sách giáo khoa gần đây của Sariel Har-Peled để biết tóm tắt hiện đại về tứ giác nén.
Jeffε

Cảm ơn cho một bản tóm tắt định lượng tốt, David. Chỉ cần xác nhận: việc bạn sử dụng "tỷ lệ khung hình" có đồng nghĩa với "tỷ lệ phân nhánh" không? Tôi chắc chắn sẽ phải kiểm tra bỏ qua quadrees / octrees và cũng có thể nén quadtrees / octrees.
Noldorin

1
Tỷ lệ khung hình của một hộp hình chữ nhật có thể được định nghĩa là tỷ lệ chiều dài cạnh dài nhất của nó với chiều dài cạnh ngắn nhất của nó. Tôi không biết tỷ lệ phân nhánh được cho là có nghĩa gì trong bối cảnh này nhưng tỷ lệ khung hình không liên quan đến yếu tố phân nhánh của cây (không đổi cho cả hai cấu trúc dữ liệu).
David Eppstein

Tôi đã bỏ lỡ "các tế bào trong". Làm cho ý nghĩa bây giờ.
Noldorin

15

Một nhóm bạn và tôi đang làm việc trong một trò chơi RTS không gian như một dự án phụ thú vị. Chúng tôi đang sử dụng rất nhiều thứ chúng tôi đã học tại Khoa học Máy tính để làm cho nó hiệu quả cao, cho phép chúng tôi tạo ra những đội quân khổng lồ sau này.

Vì mục đích này, chúng tôi đã cân nhắc sử dụng cây kd, nhưng chúng tôi đã nhanh chóng loại bỏ chúng: việc chèn và xóa là cực kỳ phổ biến trong chương trình của chúng tôi (xem xét một con tàu bay trong không gian) và đây là một mớ hỗn độn với cây kd. Do đó, chúng tôi đã chọn octrees cho trò chơi của chúng tôi.


À vâng, tôi cũng đã nghe điều này trước đây. Chèn / xóa với cây kd là một hoạt động tốn kém (do cân bằng lại). Tôi tin rằng sự phức tạp trong trường hợp tốt nhất vẫn giống nhau tuy nhiên ...
Noldorin

2
Nó phụ thuộc vào cách bạn đi sửa cây kd. Độ phức tạp trong trường hợp tốt nhất không phải là thứ tôi thường nhắm đến: ví dụ bogosort có độ phức tạp trong trường hợp tốt nhất O (1), nhưng tôi hy vọng không ai sử dụng nó.
Alex ten Brink

Thật không may, tôi dường như không thể tìm thấy bất kỳ tóm tắt tốt nào về độ phức tạp thời gian cho các hoạt động chung trên các cấu trúc dữ liệu này, nhưng không bận tâm. Độ phức tạp thời gian trong trường hợp trung bình thường sâu sắc ...
Noldorin

1
Tôi thực sự nghĩ rằng bạn vẫn sẽ làm tốt hơn nếu bạn chỉ sử dụng một cây KD đã xoay vòng rìu và chỉ đơn giản là chia không gian xuống giữa. Bỏ qua SAH cồng kềnh và các vết cắt trung bình đắt tiền khác và bạn sẽ kết thúc với thứ gì đó không chỉ tìm kiếm nhanh hơn một quãng tám mà còn xây dựng nhanh hơn. Vì bạn phân vùng không gian đồng đều như với một octree, nhưng với cây nhị phân chứ không phải cây 8 ary, bất cứ điều gì bạn đang làm trước đây để xóa đều không nên phức tạp hơn với cây KD, vì nó Sẽ cách đều nhau theo cách tương tự. Ví dụ: bạn có thể chỉ cần xóa các nút trống vượt quá độ sâu của N.
Dragon Energy

8

những lợi thế của quãng tám trong hiệu suất không gian / thời gian hay nói cách khác, và trong những tình huống nào chúng được áp dụng nhiều nhất (tôi đã nghe lập trình đồ họa 3D)?

Cây kD là cây nhị phân cân bằng và octrees đang cố gắng vì vậy những lợi thế và bất lợi có thể được thừa hưởng từ những cấu trúc dữ liệu chung hơn đó. Đặc biệt:

  • Cân bằng lại có thể tốn kém (octrees không cần tái cân bằng).
  • Cân bằng xử lý không đồng nhất tốt hơn vì nó thích nghi.
  • Hệ số phân nhánh cao hơn trong quãng tám có nghĩa là cây nông hơn (ít phân bổ và phân bổ hơn) cho phân phối đồng nhất.

Ngoài ra, chia đôi (như trong octrees) cho vay để thực hiện tầm thường về mặt twiddling. Tương tự, tôi tưởng tượng quãng tám có thể được hưởng lợi rất nhiều từ khoảng cách được tính toán trước khi thực hiện tra cứu phạm vi.

CHỈNH SỬA

Rõ ràng các tài liệu tham khảo của tôi để cố gắng và đồng nhất cần làm rõ.

Tries là một họ các cấu trúc dữ liệu được đại diện bởi các cây từ điển và được sử dụng làm từ điển cho các khóa là các chuỗi (đáng chú ý nhất là các chuỗi nhưng cũng là các chuỗi DNA và các bit trong giá trị băm cho các lần thử băm). Nếu mỗi từ điển ánh xạ một bit của mỗi tọa độ x, y và z (bit đáng kể nhất ở cấp độ đầu tiên của trie, bit đáng kể tiếp theo ở cấp độ thứ hai, v.v.) thì trie là một octree chia đều không gian 3D. Do đó, octrees thừa hưởng các đặc điểm của các lần thử, nói chung:

  • Hệ số phân nhánh cao có thể có nghĩa là cây nông phát sinh một số chỉ dẫn nên việc tìm kiếm rất nhanh, ví dụ 20 cấp cây nhị phân có thể được lưu trữ trong 4 cấp độ của cây với hệ số phân nhánh là 256.
  • Các thử nghiệm không được cân bằng lại trong quá trình chèn và xóa, tiết kiệm một thao tác đắt tiền cần thiết cho cây nhị phân cân bằng.

Nhược điểm là tính không đồng nhất có thể dẫn đến các lần thử / octrees mất cân bằng do đó các tìm kiếm có thể yêu cầu nhiều chỉ dẫn. Vấn đề tương đương trong các lần thử được giải quyết bằng cách sử dụng nén cạnh để thu gọn nhiều cấp độ gián tiếp thành một cấp độ duy nhất. Octrees không làm điều này nhưng không có gì ngăn bạn nén một octree (nhưng tôi không nghĩ bạn có thể gọi kết quả là octree!).

Để so sánh, hãy xem xét một từ điển chuyên ngành cho các khóa chuỗi được biểu diễn dưới dạng trie. Cấp độ đầu tiên của các nhánh trie trên ký tự đầu tiên trong khóa. Cấp độ thứ hai trên nhân vật thứ hai và như vậy. Bất kỳ chuỗi nào cũng có thể được tra cứu bằng cách tìm kiếm ký tự đầu tiên từ khóa trong từ điển để lấy từ điển thứ hai được sử dụng để tra cứu ký tự thứ hai từ khóa, v.v. Một tập hợp các chuỗi khóa ngẫu nhiên sẽ là một phân phối đồng nhất . Một tập hợp các chuỗi khóa mà tất cả đều chia sẻ một số tiền tố (ví dụ: tất cả các từ bắt đầu bằng "chống") là không đồng nhấtphân phối. Trong trường hợp sau, từ điển đầu tiên chỉ chứa một ràng buộc, cho "a", từ điển thứ hai chỉ cho "n", v.v. Tìm kiếm bất kỳ ánh xạ nào trong bộ ba luôn bằng cách tìm kiếm bốn từ điển giống nhau với cùng bốn khóa. Điều này là không hiệu quả và đây là những gì octrees làm nếu, ví dụ, chúng được sử dụng để lưu trữ các phân phối hạt không đồng nhất trong đó phần lớn các hạt nằm trong một thể tích nhỏ trong không gian vectơ.


"quãng tám đang cố gắng"? Ngoài ra, ý của bạn là gì khi "xử lý sự không đồng nhất tốt hơn"? Đồng nhất không phải là một từ tôi đã gặp đối với cây.
Noldorin

2
"Octtrees không cần tái cân bằng"? Điều đó hoàn toàn không đúng với các octtrees lưu trữ các phân phối điểm không đồng nhất. Cách khác, tùy thuộc vào cách bạn thường định nghĩa "octtree": Việc cân bằng lại một octtree đơn giản là không thể , bất kể nó có thể mong muốn như thế nào.
Jeffε

@Noldorin "octrees đang cố gắng". Vâng. Bạn có biết trie là gì không? vi.wikipedia.org/wiki/Trie
Jon Harrop

@Noldorin "Đồng nhất không phải là một từ tôi đã gặp đối với cây". Tôi đang đề cập đến tính đồng nhất của phân phối đang được phân vùng. Ví dụ, khi phân vùng các hạt trong không gian 3D thì các nguyên tử trong chất rắn được phân phối đồng nhất trong khi các ngôi sao trong vũ trụ phân bố không đồng nhất. Cây kD có nhiều khả năng thích hợp hơn cho các phân phối không đồng nhất vì phân chia không gian của chúng là thích nghi.
Jon Harrop

@ Jɛ ff E "Cân bằng lại một octtree đơn giản là không thể". Đó chính xác là những gì tôi đã đề cập. Xin lỗi nếu từ ngữ của tôi là khó hiểu.
Jon Harrop

2

Octrees hữu ích như một kiểu dữ liệu cơ sở cho các mô hình liên tục, xem ví dụ bộ giải dòng chảy Gerris . Cuộc sống đủ khó khăn trong động lực học chất lỏng, vì vậy biết rằng kích thước của tất cả các tiểu phân của bạn chỉ phụ thuộc vào độ sâu của chúng phải là một yếu tố đơn giản hóa.

Hãy cẩn thận: Tôi không phải là một người năng động!


Hấp dẫn. Tôi chắc chắn có thể đánh giá cao rằng octrees đơn giản hơn để làm việc trong các mô hình liên tục ... Tôi tự hỏi lý do gì để lập trình đồ họa mặc dù?
Noldorin
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.