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ơ.