Квадратно стабло

Квадратно стабло је врста бинарног стабла чији сваки унутрашњи чвор има тачно четворо деце. Квадратна стабла најчешће се користе за поделу дводимензионалног простора рекурзивном паралелизацијом у четири квадранта или регије. Регије могу бити квадратног или правоугаоног облика, или могу имати произвољне облике. Рафаел Финкел и Џон Бентли дали су назив овој структури података,Квадратно стабло, 1974. године. Квадратно стабло је такође познато и као Q-стабло.

Регионско квадратно стабло

Све форме квадратног стабла деле неке заједничке карактеристике:

  • Разлажу простор у прилагодљиве ћелије
  • Свака ћелија има максимални капацитет. Када се достигне максимални капацитет,ћелија се дели
  • Стабло директоријум прати просторну декомпозицију квадратног стабла

Врсте

уреди

Квадратна стабла могу се класификовати према врсти података које они представљају,укључујући регије,тачке,праве и криве. Квадратна стабла такође могу бити класификована по томе да ли је облик стабла независан од редоследа података који обрађује. Неки уобичајени типови су:

Регионско квадратно стабло

уреди

Регионско квадратно стабло представља поделу простора у две димензије тако што разлаже регију на четири једнака квадранта,подквадранта и тако даље, сваки лисни чвор садржи податке који одговарају одређеном подрегиону. Сваки чвор у стаблу или има тачно четворо деце, или нема децу (лисни чвор).

Регионско квадратно стабло је врста стабла. Регионско квадратно стабло дубине н може бити коришћено за представљање слике 2н x 2н пиксела, где је сваки пиксел вредности 0 или 1. Корени чвор представља цео регион слике. Ако пиксели у било којој регији нису искључиво нуле или јединице,она је подељена. У овој пријави,сваки лисни чвор представља блок пиксела који су све нуле или све јединице.

Регионско квадратно стабло такође мозе бити коришћено као репрезентација променљиве резолуције поља података.Ако се регионско квадратно стабло користи при представљању скупа тачака података(као што су географска ширина и дужина скупа градова),региони су подељени док један лист садржи највише једну тачку.[1]

Тачкасто квадратно стабло

уреди

Тачкасто квадратно стабло комбинује приступ грид структура са вишедимензионалном генерализацијом стабла бинарног претраживања. Сваки грански(не-лисни) чвор је повезан са податковним записом са локацијом тачке и има четири следбеника (НW,НЕ,СW и СЕ). Свака квадрантска подела је центрирана над податковном тачком. Време развоја(израде) квадратног стабла је О(н лог н), а време тражења је О(лог н).[2]

Структура чвора за Тачкасто квадратно стабло

уреди

Чвор тачкастог квадратног стабла је сличан чвору бинарног стабла, са главном разликом у томе што има четири показивача(један за сваки квадрант) уместо два("леви" и "десни") као у уобичајеном бинарном стаблу. Такође,кључ се обично декомпонује на два дела,које се односе на x и y координате. Зато чвор садржи следеће податке:

  • четири показивача:['НW'],['НЕ'],['СW'], и ['СЕ']
  • тачку; што заузврат садржи:
    • кључ, обично изражен као x,y координате
    • вредност; на пример име

Рубно квадратно стабло

уреди

Рубна квадратна стабла се обично користе за чување линија више него за чување тачака. Криве су апроксимиране паралелизацијом ћелија у веома фине резолуције. Ово може довести до изузетно неуравнотежених стабала која могу анулирати сврху индексирања.

Полигонална мапа квадратног стабла

уреди

Полигонална мапа квадратног стабла (или ПМ Квадратно стабло) је варијација квадратног стабла, која се користи за складиштење колекције полигона која могу бити дегенерисана(што значи да су изолована темена или ивице).[1] Постоје три главне класе ПМ Квадратних стабала које варирају у зависности од тога које информације чувају унутар сваког црног чвора. ПМ3 квадратна стабла могу да складиште било коју величину ивица које се не секу и највише једну тачку. ПМ2 квадратна стабла су иста као ПМ3 квадратна стабла, осим што све ивице морају да деле исту крајњу тачку. Коначно,ПМ1 квадратна стабла слична су ПМ2, али у овом случају црни чворови могу да или садрже тачку и његове ивице, или да садрже скуп ивица које деле једну тачку , али не може имати тачку и скуп ивица које не садрже ту тачку.


  • Репрезентација Квадратног стабла
     
  • Просторно индексирање
  • Ефикасно откривање судара у две димензије
  • Цонwаy'с Гаме оф Лифе програм.[3]
  • Квадратна стабла се такође користе у области фракталне анализе слике

Псеудокод

уреди

Следећи псеудокод показује један начин имплементације квадратног стабла који користи само тачке. Постоје и други приступи на располагању.

Предуслови

уреди

Претпоставља се да су ове структуре коришћене.

struct XY
{
  float x;
  float y;

  function __construct(float _x, float _y) {...}
}

struct AABB
{
  XY center;
  XY halfDimension;

  function __construct(XY center, XY halfDimension) {...}
  function containsPoint(XY p) {...}
  function intersectsAABB(AABB other) {...}
}

Класа квадратног стабла

уреди

Ова класа представља и квадратно стабло и чвор где је укорењен

class QuadTree
{
  constant int QT_NODE_CAPACITY = 4;
  AABB boundary;

  Array of XY [size = QT_NODE_CAPACITY] points;

  // Deca
  QuadTree* northWest;
  QuadTree* northEast;
  QuadTree* southWest;
  QuadTree* southEast;

  // Metode
  function __construct(AABB _boundary) {...}
  function insert(XY p) {...}
  function subdivide() {...} 
  function queryRange(AABB range) {...}
}

Уметање

уреди

Следећи метод убацује тачку у одговарајући квадрат квадратног стабла.

class QuadTree
{
  ...

  // Ubacujemo tačku u kvadratno stablo
  function insert(XY p)
  {
    // Zanemarujemo objekte koji ne pripadaju ovom kvadratnom stablu
    if (!boundary.containsPoint(p))
      return false;

    // Ako ima mesta u ovom kvadratnom stablu,dodajemo objekat ovde
    if (points.size < QT_NODE_CAPACITY)
    {
      points.append(p);
      return true;
    }

    // U suprotnom,moramo podeliti na manje delove,zatim dodati tačku bilo kojem čvoru koji će to prihvatiti
    if (northWest == null)
      subdivide();

    if (northWest->insert(p)) return true;
    if (northEast->insert(p)) return true;
    if (southWest->insert(p)) return true;
    if (southEast->insert(p)) return true;

    // Inače,tačka neće biti ubačena iz nekog nepoznatog razloga
    return false;
  }
}

Испитивање опсега

уреди

Следећи метод проналази све тачке које се налазе у опсегу.

class QuadTree
{
  ...

  //Pronalazimo sve tačke koje se pojavljuju unutar opsega 
  function queryRange(AABB range)
  {
    // Priprema se niz rezultata
    Array of XY pointsInRange;

    // Automatski prekid ukoliko se opseg ne podudara sa ovim kvadratom
    if (!boundary.intersectsAABB(range))
      return pointsInRange; // empty list

    // Provera objekata
    for (int p := 0; p < points.size; p++)
    {
      if (range.containsPoint(points[p]))
        pointsInRange.append(points[p]);
    }

    // Prekida se ovde,ako nema dece
    if (northWest == null)
      return pointsInRange;

    // U suprotnom,dodajemo tačke koje pripadaju deci
    pointsInRange.appendArray(northWest->queryRange(range));
    pointsInRange.appendArray(northEast->queryRange(range));
    pointsInRange.appendArray(southWest->queryRange(range));
    pointsInRange.appendArray(southEast->queryRange(range));

    return pointsInRange;
  }
}  
 

Референце

уреди

Белешке

уреди
  1. ^ а б Ханан Самет анд Роберт Wеббер. "Сторинг а Цоллецтион оф Полyгонс Усинг Qуадтреес". АЦМ Трансацтионс он Грапхицс Јулy (1985), пп. 182-222. ИнфоЛАБ. Wеб. 23 Марцх 2012
  2. ^ Структуре и методе приступа
  3. ^ Рокицки, Томас Г. (1. 4. 2006). „Ан Алгоритхм фор Цомпрессинг Спаце анд Тиме”. Приступљено 20. 5. 2009. 

Главне референце

уреди

Спољашње везе

уреди