2011-02-05 14 views
16

Tôi muốn triển khai cây nhị phân không có bộ nhớ cache được lưu trữ trong một mảng bằng bố cục van Emde Boas, sử dụng con trỏ ẩn. Tất cả các mục trong cây là số nguyên 32 bit và cây sẽ nhận được khá lớn, do đó lưu trữ các con trỏ sẽ có nghĩa là ít nhất 3x nhiều dữ liệu hơn.Cách tính con trỏ trong cây nhị phân với bố cục van Emde Boas

Vấn đề là tôi không thể nghĩ ra bất kỳ cách nào không lặp lại để tính toán con trỏ cho trẻ em trái và phải, được chỉ định một nút (tôi có thể theo dõi bất kỳ thông tin nào khi duyệt qua cây). Nhiều bài báo/bài giảng đề cập đến những cây như vậy với các con trỏ tiềm ẩn, nhưng tôi chưa thấy một thuật toán để tính toán con trỏ. Có cách nào hiệu quả để làm điều đó không?

+0

Bạn có cần tính toán từ chỉ mục không? Dường như với tôi rằng bạn chỉ cần tính toán một nút con cụ thể từ một nút hiện tại. Nếu bạn sẵn sàng nhận thức được mức hiện tại, hãy giữ một chồng các khoảng trống trên đường dẫn đến nút hiện tại, và có một mảng của tất cả các offset ở các mức khác nhau, bạn sẽ có thể làm điều đó. Tôi không biết bao nhiêu trên không theo dõi những ngăn xếp sẽ thêm, nó có thể không đáng giá. – btilly

+0

Bạn nói đúng, tôi không cần tính toán nó từ chỉ mục tùy ý. Tôi không chắc tôi hiểu ý tưởng với một mảng cho tất cả các offsets? Bạn có nghĩa là bù đắp cho tất cả các mục ở một mức cụ thể không? –

+3

Bạn đã kiểm tra [giấy này] (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.76.762&rep=rep1&type=pdf) chưa? Họ cho biết cách bố trí cây bằng cách sử dụng bố trí van Emde Boas trong phần 2.1. – jswolf19

Trả lời

6

Bob Copeland có triển khai rất tốt van Emde Boas trees at GitHub. Ông sử dụng con trỏ tiềm ẩn và tính toán các con trỏ bằng cách đầu tiên tính toán con trỏ đầu tiên rộng, sau đó con trỏ vEB là một điều kiện đơn giản.