0
Tải bản đầy đủ (.pdf) (82 trang)

Cài đặt Range trees

Một phần của tài liệu MỘT SỐ KIỂU DỮ LIỆU TRỪU TƯỢNG ỨNG DỤNG TRONG HÌNH HỌC TÍNH TOÁN (Trang 72 -74 )

Ta đã biết rằng trong trường hợp truy vấn 2 chiều, thời gian trả lời mỗi truy vấn phạm vi với kd-trees là trong khi đó range trees chỉ mất để trả lời mỗi truy vấn. Về mặt lý thuyết thì đại lượng tăng nhanh hơn đại lượng nhưng sự chênh lệch về giá trị giữa hai đại lượng này chỉ đáng kể với những giá trị lớn. Để đánh giá ưu thế của range trees so với kd-trees, ta cần tiến hành thực nghiệm với dữ liệu kích thước lớn.

3.2.1 Cấu trúc dữ liệu

Các lớpmẫu cây với ba đối số: , và . Kiểu định nghĩa kiểu dữ liệu đầu vào và kiểu định nghĩa cửa sổ truy vấn. Cây cũng được sử dụng xác định tập hợp các hàm theo thứ tự truy cập dữ liệu. Các hàm này cũng được cung cấp bởi lớp .

Hình 3.2 - Sơ đồ các lớp trong thực hiện Range trees

Tiến hành cài đặt cấu trúc dữ liệu Range trees gồm 3 lớp: ;

; . Trong đó: các lớp Tree_anchor; được

kế thừa lớp được định nghĩa bởi như sau:

typedef Tree_anchor<Data,Window> Tree_Anchor;

typedef Range_Tree<Data, Window, Point_traits> Range_Tree;

Data

Window

Tree_traits

Tree_base <Data, Window>

Tree_base <Data, Window> *sublayer_tree; Tree_base(Tree_base & sublayer_prototype); Tree_base *clone();

template <class T>

virtual bool make_tree(T& begin, T& end); template <class T>

virtual T window_query(Window& w, T out);

Range_tree< Tree_traits>

Range_tree (Tree_base & sub_proto); Range_tree *clone();

template <class T>

bool make_tree(T& begin, T& end); template <class T>

T window_query(Window & w, T out);

Tree_anchor

Tree_anchor (); Tree_anchor *clone(); template <class T>

bool make_tree(T& begin, T& end); template <class T>

Lớp và lớp nhận hai tham số mẫu: lớp định nghĩa loại dữ liệu lưu trữ trong cây (các điểm) và lớp định nghĩa kiểu của phạm vi truy vấn. nhận lời gọi được định nghĩa giao diện giữa dữ liệu và cây.

struct Data{

double point; // Dữ liệu điểm };

struct Window{ int min, max;

double min_ point, max_point; };

class Point_traits{ public:

typedef doubleKey;

Key get_key(Data& d){return d.point;}

Key get_left(Window& w){return w.min_point;} Key get_right(Window& w){return w.max_point;}

bool comp(Key& key1, Key & key2){return (key1 < key2);} }

3.2.2 Tiến hành thực nghiệm

Tiến hành thực nghiệm tìm kiếm phạm vi trực giao trong không gian hai chiều: Dữ liệu đầu vào là tập hợp các điểm (có thể rất lớn) được tạo ngẫu nhiên trong mặt phẳng có các điểm di chuyển trong mặt phẳng (có tọa độ thay đổi) và phạm vi truy vấn hình chữ nhật. Trả lời cho truy vấn phạm vi hình chữ nhật là đưa ra tất cả các điểm nằm trong phạm vi truy vấn hình chữ nhật.

3.2.3Đánh giá kết quả thực nghiệm

Qua thực nghiệm, việc sử dụng range trees có tốc độ truy vấn nhanh, thời gian trả lời mỗi truy vấn nói chung không đo được bằng bộ đếm nhịp đồng hồ của máy tính, thời gian truy vấn phụ thuộc rất ít vào số điểm và không phụ thuộc vào kích thước phạm vi truy vấn.

Một phần của tài liệu MỘT SỐ KIỂU DỮ LIỆU TRỪU TƯỢNG ỨNG DỤNG TRONG HÌNH HỌC TÍNH TOÁN (Trang 72 -74 )

×