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:
Huremu hwemuti hunova 1, uremu hwechinhu chemudzi hunova 1. Huremu hwemudziyo hunorema huremu hwemuti.
Ngatiwedzere zvimwe zvishoma:
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:
Node yekutanga ine index 0, uye ikozvino 2 kesi zvinogoneka. Mukutanga, indekisi yemudzi wemudzi ichachinja, mune yechipiri haizoshanduki.
Pamudzi, wekuruboshwe subtree unorema 1.
Chechipiri:
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.
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