2012-08-28 17 views
5

W jaki sposób mogę uzyskać dostęp do danych, które są przechowywane przy użyciu porządku Z, z złożonością czasu O (1) w tablicy? Potrzebuję szybkiego dostępu do każdego elementu przez ich współrzędne. Czy istnieje jakiś szybszy sposób uzyskania dostępu do tych danych, a nie za pomocą przesunięcia bitów?Współrzędne krzywej o kolejności Z

Jednym ze sposobów będzie za pomocą tabel przeglądowych (mam statyczną rozmiaru danych)

EDIT:

Jeden pomysł miałem teraz jest przechowywanie liście w kolejności przy użyciu y * SIZE + x

EDIT 2 .:

ja storying bity w drzewie quad w std :: bitset. Próbuję sprawdzić, czy niektóre dane są dostępne. w matrycach o rozmiarze 128 * 128. Tak więc mogę pominąć wyszukiwanie w macierzy bruteforce pustych danych.

+0

proszę podać więcej informacji. Czy przechowujesz rzeczy tylko ze współrzędnymi całkowitymi z lub używasz liczb rzeczywistych? Jaka jest liczba obiektu (górna granica)? Jaka złożoność jest potrzebna w zapytaniu (tj. Ile zapytań oczekujesz)? Słownik –

+0

? lub tabeli odnośników .. –

+0

Właściwie chciałbym uzyskać dostęp do danych w tym miejscu tak szybko, jak to możliwe, ponieważ może on pomieścić 32k elementów (bitów) na jedną porcję. I te dane mogą być w jednym przejściu dostępnym 6 lub więcej razy. To, do czego próbuję uzyskać dostęp, to liście quadów w tablicy! – BlackCat

Odpowiedz

6

Można obliczyć zamówienia oo wartość krzywej za pomocą następującego kodu:

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; 
} 

została ona podjęta stąd Bit Twiddling Hacks

od ciebie 128x128 tablicy (lub innej wielkości) można obliczyć łatwo oo Krzywa zamówienia z dowolnej pozycji. Na przykład:

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

Maksymalny rozmiar tablicy dla przykładowego kodu to 65536 * 65536. Po prostu użyj mocy 2, w tym przypadku maksymalna zmarnowana przestrzeń to ok. 3/4

+1

Jest to bardzo pomocne w przypadku problemu, który mam. Czy można to w jakikolwiek sposób rozszerzyć na 3D, czy trzeba przyjąć inne podejście? –

+0

@Voror Sand: W przypadku 3-wymiarowej możesz użyć b-drzewa. – aggsol

+0

Czy możesz być tak miły, aby wyjaśnić, w jaki sposób maski bitowe wpływają na wynik końcowy? Bardzo zobowiązany. – theSongbird

Powiązane problemy