2012-05-15 67 views
6

Tôi sẽ viết một triển khai templatized của một KDTree, mà bây giờ chỉ nên làm việc như Quadtree hoặc Octree để thực hiện BarnesHut. Điểm quan trọng ở đây là thiết kế, tôi muốn chỉ định số thứ nguyên mà cây được định nghĩa là tham số mẫu và sau đó chỉ cần khai báo một số phương thức phổ biến, sẽ tự động xử lý đúng cách (tôi nghĩ rằng một số chuyên môn về mẫu là cần thiết sau đó).Thực hiện khuôn mẫu QuadTree hoặc Octree trong C++

Tôi muốn chuyên mẫu để có các nút 2^2 (quadtree) hoặc 2^3 (octree).

Có ai đó có một số ý tưởng thiết kế không? Tôi muốn tránh thừa kế bởi vì nó hạn chế tôi để làm phân bổ bộ nhớ động hơn là phân bổ tĩnh.

Đây N có thể là 2 hoặc 3

template<int N> 
class NTree 
{ 
public: 
    NTree<N>(const std::vector<Mass *> &); 
    ~NTree<N>() 
    { 
     for (int i=0; i<pow(2,N); i++) 
      delete nodes[i]; 
    } 
private: 
    void insert<N>(Mass *m); 
    NTree *nodes[pow(2,N)]; // is it possible in a templatized way? 
}; 

vấn đề khác là quadtree có 4 nút nhưng 2 chiều, octree có 8 nút, nhưng 3 chiều, tức là số lượng nút là 2^dimension. Tôi có thể chỉ định điều này thông qua lập trình meta-template không? Tôi muốn giữ số 4 và 8 để vòng lặp unroller có thể nhanh hơn.

Cảm ơn bạn!

+1

Bạn đang sử dụng cụm từ "lá" không chính xác, cụm từ chính xác là "nút". Một "lá" là một nút mà không có bất kỳ trẻ em. –

+0

Bạn cũng đang trộn kdtrees và quad/octree không chính xác, chúng không giống nhau (nghĩa là cây 2D không bằng một quadtree) .. – KillianDS

+0

Phải, tôi chỉ đơn giản muốn một cây n-ary hoạt động như quadtree trong 2D và octree ở chế độ 3D, tôi đang chỉnh sửa câu hỏi. – linello

Trả lời

8

Bạn có thể sử dụng 1 << N thay vì pow(2, N). Điều này hoạt động vì 1 << N là hằng số biên dịch, trong khi pow(2, N) không phải là hằng số thời gian biên dịch (mặc dù nó sẽ được đánh giá vào thời gian biên dịch).

+0

Ý tưởng hay! cảm ơn bạn! Bạn cũng nghĩ rằng một thực hiện templatized loại này là khả thi hay tốt? – linello

+0

No. Tôi nghĩ rằng mã mẫu sẽ khó viết và dễ đọc hơn hai cách triển khai riêng biệt: một quadtree và một octree. Không chắc bạn sẽ gặp N = 2 vì chúng tôi có cấu trúc dữ liệu tốt hơn chuyên cho dữ liệu một chiều và N> 3 không chắc do tăng trưởng theo cấp số nhân của kích thước của mỗi nút. –

+0

Bạn nói đúng, nhưng tôi cũng đang sử dụng một thư viện đại số tuyến tính templatized cho các hoạt động vector và ma trận (eigen), có vẻ như là một vấn đề kiểm tra nếu N == 2 hoặc N == 3, và sau đó viết mã do đó . Tôi muốn tham gia hai triển khai cho mục đích bảo trì. Tôi sẽ thông báo cho bạn – linello

2

Nếu bạn đang sử dụng trình biên dịch C++ 11 hỗ trợ constexpr, bạn có thể tự viết constexpr -version của pow để thực hiện phép tính khi chạy.

+0

Thật không may tôi không thể có trình biên dịch như vậy, và một số tính năng của C++ 11 vẫn còn mơ hồ với tôi: P – linello

+1

Bạn cũng có thể làm điều đó trong C++ 03. Một siêu mẫu đệ quy đơn giản cho chức năng tích phân thực sự dễ thực hiện. Chồi nếu cơ sở luôn luôn là 2, bạn tốt hơn nhiều với chuyển dịch bit, như Dietrich Epp cho thấy. – Fiktik

Các vấn đề liên quan