Indexed binary muti

Indexed binary muti

Ndakasangana nemhando inotevera yedambudziko. Izvo zvinodikanwa kuita chigadziko chekuchengetedza data chinopa zvinotevera kushanda:

  • Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт
  • bvisa chinhu neserial nhamba
  • tora element ne ordinal number
  • data inochengetwa mune yakarongwa fomu

Dhata inogara ichiwedzerwa uye kubviswa, chimiro chinofanira kuve nechokwadi chekukurumidza kushanda kumhanya. Pakutanga ndakaedza kuita chinhu chakadaro ndichishandisa midziyo yakajairwa kubva maawa. Iyi nzira haina kupfekedzwa korona nebudiriro uye nzwisiso yakauya yekuti ndaida kuita chimwe chinhu pachangu. Chinhu chimwe chete chakauya mupfungwa ndechekushandisa bhinari yekutsvaga muti. Nekuti inosangana nezvinodiwa zvekuisa nekukurumidza, kudzima uye kuchengetedza data mune yakarongedzwa fomu. Chasara ndechekufunga nzira yekunongedza zvese zvinhu uye kuverengazve ma indices kana muti wachinja.

struct node_s {    
    data_t data;

    uint64_t weight; // вСс ΡƒΠ·Π»Π°

    node_t *left;
    node_t *right;

    node_t *parent;
};

Chinyorwa chichava nemifananidzo yakawanda uye dzidziso kupfuura kodhi. Iyo kodhi inogona kutariswa pane iyi link iripazasi.

Weight

Для этого Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π»ΠΎΡΡŒ нСбольшой ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΠΊΠ°Ρ†ΠΈΠΈ, добавилась Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация ΠΎ вСсС node. Iyo node huremu ndeye nhamba yezvizvarwa zvenodhi iyi + 1 (huremu hwechimwe chinhu).

Basa rekuwana node uremu:

uint64_t bntree::get_child_weight(node_t *node) {
    if (node) {
        return node->weight;
    }

    return 0;
}

Huremu hwebepa hunoenzana ne 0.

Π”Π°Π»Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ наглядному ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°. nhema iyo node kiyi icharatidzwa muruvara (kukosha hakuzoratidzirwe, sezvo izvi zvisingadiwi), tsvuku - uremu hwepfundo, green - node index.

Kana muti wedu usina chinhu, uremu hwawo ndi 0. Ngatiwedzerei midzi pairi:

Indexed binary muti

Huremu hwemuti hunova 1, uremu hwechinhu chemudzi hunova 1. Huremu hwemudziyo hunorema huremu hwemuti.

Ngatiwedzere zvimwe zvishoma:

Indexed binary muti
Indexed binary muti
Indexed binary muti
Indexed binary muti

Pese painowedzerwa chinhu chitsva, tinodzika pasi nemanodhi uye towedzera huremu hwehuremu hweimwe node yakapfuura. Kana node itsva yagadzirwa, uremu hunopihwa kwairi 1. Kana node ine kiyi yakadaro yatovepo, isu tinozonyora kukosha uye todzokera kumusoro kumudzi, tichidzima shanduko mumaremu emanodhi ese atapfuura.
Kana node iri kubviswa, tobva tadzika todzikisa huremu hwemanodhi apfuura.

Indexes

Zvino ngatienderere mberi kune maitiro ekuisa index nodes. Manodhi haachengete zvakajeka index yavo, inoverengerwa zvichienderana nehuremu hwemanodhi. Kana vakachengeta index yavo, zvaizodiwa O (n) nguva yekuvandudza ma indexes emanode ese mushure mekuchinja kwega kwega mumuti.
Ngatiendererei kune inomiririra inomiririra. Muti wedu hauna chinhu, ngatiwedzerei 1st node kwairi:

Indexed binary muti

Node yekutanga ine index 0, uye ikozvino 2 kesi zvinogoneka. Mukutanga, indekisi yemudzi wemudzi ichachinja, mune yechipiri haizoshanduki.

Indexed binary muti

Pamudzi, wekuruboshwe subtree unorema 1.

Chechipiri:

Indexed binary muti

Indekisi yemudzi haina kushanduka nekuti huremu hweruboshwe rwayo rwakaramba ruri 0.

Indekisi yenodhi inoverengerwa sehuremu hweruboshwe rwayo + nhamba yakapfuura kubva kumubereki. Nhamba iyi chii?, Iyi ndiyo index counter, pekutanga yakaenzana ne 0, nokuti mudzi hauna mubereki. Zvino zvese zvinoenderana nekuti tinodzika kupi kumwana wekuruboshwe kana kurudyi. Kana kuruboshwe, saka hapana chinowedzerwa kune counter. Kana isu tikawedzera indekisi yeino node kune iyo chaiyo.

Indexed binary muti

Semuenzaniso, indekisi yechinhu chine kiyi 8 (mwana chaiye wemudzi) inoverengerwa. Iyi i "Root Index" + "uremu hwekuruboshwe subtree ye node ine kiyi 8" + "1" == 3 + 2 + 1 == 6
Indekisi yechinhu chine kiyi 6 ichave "Root Index" + 1 == 3 + 1 == 4

Nekudaro, zvinotora nguva kuwana nekudzima chinhu ne index O (dandai n), nekuti kuti tiwane chinhu chinodiwa tinofanira kutanga tachiwana (kudzika kubva pamudzi kuenda kune ichi chinhu).

Deepth

Kubva pane uremu, unogonawo kuverenga kudzika kwemuti. Zvinodiwa pakuenzanisa.
Kuti uite izvi, huremu hwenodhi yazvino hunofanira kutenderedzwa kunhamba yekutanga kune simba re2 iro rakakura kupfuura kana kuenzana nehuremu hwakapihwa uye kutora binary logarithm kubva mairi. Izvi zvichatipa kudzika kwemuti, tichifunga kuti yakaenzana. Muti wakaenzana mushure mekuisa chinhu chitsva. Handisi kuzopa dzidziso pamusoro pekuenzanisa miti. Iwo makodhi makodhi anopa basa rekuenzanisa.

Kodhi yekushandura huremu kusvika pakadzika.

/*
 * Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ число Π² стСпСни 2, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ большС ΠΈΠ»ΠΈ Ρ€ΠΎΠ²Π½ΠΎ x
 */
uint64_t bntree::cpl2(uint64_t x) {
    x = x - 1;
    x = x | (x >> 1);
    x = x | (x >> 2);
    x = x | (x >> 4);
    x = x | (x >> 8);
    x = x | (x >> 16);
    x = x | (x >> 32);

    return x + 1;
}

/*
 * Π”Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌ ΠΎΡ‚ числа
 */
long bntree::ilog2(long d) {
    int result;
    std::frexp(d, &result);
    return result - 1;
}

/*
 * ВСс ΠΊ Π³Π»ΡƒΠ±ΠΈΠ½Π΅
 */
uint64_t bntree::weight_to_depth(node_t *p) {
    if (p == NULL) {
        return 0;
    }

    if (p->weight == 1) {
        return 1;
    } else if (p->weight == 2) {
        return 2;
    }

    return this->ilog2(this->cpl2(p->weight));
}

Migumisiro

  • вставка Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта происходит Π·Π° O (dandai n)
  • Kudzima chinhu neserial nhamba kunoitika mukati O (dandai n)
  • kuwana chinhu neserial nhamba kunoitika mukati O (dandai n)

Speed O (dandai n) Isu tinobhadhara chokwadi chekuti data rese rinochengetwa mune yakarongedzwa fomu.

Π“Π΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ такая структура β€” Π½Π΅ знаю. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π·Π°Π΄Π°Ρ‡ΠΊΠ°, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π΅Ρ‰Π΅ Ρ€Π°Π· Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄Π΅Ρ€Π΅Π²ΡŒΡ. Бпасибо Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

nezvakanyorwa

Iyo purojekiti ine data rekuyedza kutarisa kumhanya kwekushanda. Muti uri kuzara 1000000 zvinhu. Uye kune sequential kudzima, kuisa uye kudzoreredza zvinhu 1000000 kamwe. Ndizvozvo 3000000 mabasa. Mhedzisiro yacho yakave yakanaka ~ 8 masekondi.

Source: www.habr.com

Voeg