2012-08-28 37 views
5

Làm cách nào tôi có thể truy cập dữ liệu đang được lưu trữ sử dụng Z-order với độ phức tạp O (1) trong mảng? Tôi cần truy cập nhanh vào từng phần tử theo tọa độ của chúng. Tôi có cách nào nhanh hơn để truy cập dữ liệu này hơn là sử dụng khi chuyển bit?Z-order-curve tọa độ

Một cách sẽ được sử dụng các bảng tra cứu (i có kích thước tĩnh của dữ liệu)

EDIT:

Một ý tưởng tôi đã có ngay bây giờ là để lưu trữ lá theo thứ tự sử dụng y * SIZE + x

EDIT 2 .:

tôi storying bit trong cây quad trong std :: bitset. Tôi đang cố gắng kiểm tra nếu một số dữ liệu có sẵn. trong ma trận có kích thước 128 * 128. Vì vậy, tôi có thể bỏ qua tìm kiếm ma trận bruteforce cho dữ liệu trống.

+0

vui lòng cung cấp thêm thông tin. Bạn chỉ lưu trữ mọi thứ ở tọa độ z nguyên hoặc bạn sử dụng số thực? Số đối tượng (giới hạn trên) là gì? Bạn cần sự phức tạp nào đối với truy vấn (nghĩa là bạn có bao nhiêu truy vấn)? –

+0

từ điển? hoặc tra cứu bảng .. –

+0

Thực ra tôi muốn truy cập dữ liệu tại vị trí đó nhanh nhất có thể bởi vì nó có thể chứa 32k phần tử (bit) cho mỗi một đoạn. Và dữ liệu này có thể trong một lần truy cập được truy cập từ 6 lần trở lên. Những gì tôi đang cố gắng truy cập là lá của cây quad trong mảng! – BlackCat

Trả lời

6

Bạn có thể tính giá trị đường cong thứ tự z với đoạn mã sau:

uint32_t calcZOrder(uint16_t xPos, uint16_t yPos) 
{ 
    static const uint32_t MASKS[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF}; 
    static const uint32_t SHIFTS[] = {1, 2, 4, 8}; 

    uint32_t x = xPos; // Interleave lower 16 bits of x and y, so the bits of x 
    uint32_t y = yPos; // are in the even positions and bits from y in the odd; 

    x = (x | (x << SHIFTS[3])) & MASKS[3]; 
    x = (x | (x << SHIFTS[2])) & MASKS[2]; 
    x = (x | (x << SHIFTS[1])) & MASKS[1]; 
    x = (x | (x << SHIFTS[0])) & MASKS[0]; 

    y = (y | (y << SHIFTS[3])) & MASKS[3]; 
    y = (y | (y << SHIFTS[2])) & MASKS[2]; 
    y = (y | (y << SHIFTS[1])) & MASKS[1]; 
    y = (y | (y << SHIFTS[0])) & MASKS[0]; 

    const uint32_t result = x | (y << 1); 
    return result; 
} 

Nó được lấy từ đây Bit Twiddling Hacks

Từ bạn 128x128 mảng (hoặc bất kỳ kích thước khác), bạn có thể tính toán một cách dễ dàng z giá trị đường cong thứ tự từ vị trí bất kỳ. Ví dụ:

xPos = 2, yPos = 3 -> z order curve value = 7 

Kích thước mảng tối đa cho mã ví dụ là 65536 * 65536. Chỉ cần sử dụng một sức mạnh của 2 cho dễ dàng, trong trường hợp đó không gian lãng phí tối đa là khoảng. 3/4

+1

Điều này thực sự hữu ích cho một vấn đề mà tôi có. Đây có phải là bất kỳ cách nào có thể mở rộng sang 3D hay người ta phải thực hiện một cách tiếp cận khác? –

+0

@Victor Sand: Đối với trường hợp 3 chiều, bạn có thể muốn sử dụng b-tree. – aggsol

+0

Bạn có thể giải thích cách mặt nạ bit ảnh hưởng đến kết quả cuối cùng không? Nhiều nghĩa vụ. – theSongbird

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