
áĄáąáŹááşááąáŹáşááźá፠ááźáżááŹáĄááťááŻá¸áĄá áŹá¸ááᯠááźáŻáśáá˝áąáˇáá˛áˇáááŤáááşá áĄáąáŹááşááŤááŻááşááąáŹááşááťááşááťáŹá¸ááᯠááśáˇáááŻá¸ááąá¸áááˇáş ááąááŹáááŻáážáąáŹááşáážáŻáá˝ááşááááşááŹááᯠáĄááąáŹááşáĄáááşááąáŹáşáááş áááŻáĄááşáááş-
- áĄá áááşáĄáááŻááşá¸áĄáá áşáááˇáşááŤá
- áĄáážááşá ááşááśááŤááşááźááˇáş element áááŻáááşáážáŹá¸ááŤá
- ááŻáśáážááşááśááŤááşááźááˇáş element áááŻááá°ááŤá
- ááąááŹááᯠáĄááťááŻá¸áĄá áŹá¸áá˝á˛ááŹá¸áááˇáşááŻáśá áśááźááˇáş ááááşá¸áááşá¸ááŹá¸áááşá
ááąááŹááᯠáĄáááşáááźááş áááˇáşáá˝ááşá¸ááąááźáŽá¸ áááşáážáŹá¸ááąáááşá áá˝á˛áˇá ááşá¸ááŻáśáááş ááźááşáááşááąáŹ áááşáááşáážáŻááşá¸ááᯠááąááťáŹá áąááááşá áĄá áááŻááşá¸áážáŹááąáŹáˇ standard containers áá˝áąááŻáśá¸ááźáŽá¸ áĄá˛ááŽáĄááŹááᯠáĄááąáŹááşáĄáááşááąáŹáşáááŻáˇ ááźááŻá¸á áŹá¸áá˛áˇáááşá á áś. ááŽáááşá¸áᏠáĄáąáŹááşááźááşáážáŻáááá°áááąáŹááşá¸áᲠáá áşááŻááŻááᯠáĄááąáŹááşáĄáááşááąáŹáşáááŻáˇ ááŤáááŻááşáááŻááşáááŻáĄááşáá˛áˇ ááŹá¸áááşáážáŻááąáŹááşááŹáááşá á áááşáá˛áá˝ááş áá áşááŻáááşá¸ááąáŹáĄááŹáážáŹ binary áážáŹáá˝áąááąá¸áá áşáááşááᯠáĄááŻáśá¸ááźáŻáááşááźá áşáááşá áĄáááşááźáąáŹááˇáşáááŻááąáŹáş áááşá¸áááş áĄááťááŻá¸áĄá áŹá¸áá˝á˛ááŹá¸áááˇáşááŻáśá áśááźááˇáş ááąááŹááťáŹá¸ááᯠáĄááźááşáááˇáşáá˝ááşá¸ááźááşá¸á ááťááşááźááşá¸áážááˇáş ááááşá¸áááşá¸ááźááşá¸á áááŻáĄááşááťááşáážááˇáş áááŻááşááŽááąáŹááźáąáŹááˇáşááźá áşáááşá ááťááşááŹáĄáŹá¸ááŻáśá¸á ááźááşá ááşáĄáŹá¸ááŻáśá¸ááᯠáĄáá˝ážááşá¸ááááşá¸áááşáááŻáážáŹáááá˛áááŻááŹáá˛áˇ áá áşáááşááźáąáŹááşá¸áá˛áˇáĄá፠áĄáá˝ážááşá¸ááááşá¸áá˝áąááᯠááźááşáááşáá˝ááşááťááşáááŻáˇááŤáá˛á
struct node_s {
data_t data;
uint64_t weight; // Đ˛ĐľŃ ŃСНа
node_t *left;
node_t *right;
node_t *parent;
};ááąáŹááşá¸ááŤá¸áá˝ááş ááŻááşáááş ááŻááşááŻáśááťáŹá¸áážááˇáş ááŽáĄááŻáᎠáááŻááťáŹá¸ááŤáááşá ááŻááşááᯠáĄáąáŹááşá፠link áá˝ááş ááźááˇáşáážáŻáááŻááşááŤáááşá
áĄááąá¸ááťáááş
áááşá¸áááŻáĄáąáŹááşááźááşáááşá áá áşáááşáááş áĄáááşá¸áááşááźáŻááźááşáá˝ááşá¸ááśáážáŻááźáŻááŻááşáá˛áˇááźáŽá¸á áĄáááŻááąáŹááşá¸áĄááťááşáĄáááşááťáŹá¸ááᯠáááˇáşáá˝ááşá¸áá˛áˇáááşá áááŻááşáĄááąá¸ááťáááş node á node weight á ᤠnode áááŹá¸á ááşááźáąá¸áááşáĄááąáĄáá˝ááş + 1 (ááźááşá ááşáá áşááŻááĄááąá¸ááťáááş)á
node áĄááąá¸ááťáááşááᯠááá°áááş ááŻááşááąáŹááşááťááş
uint64_t bntree::get_child_weight(node_t *node) {
if (node) {
return node->weight;
}
return 0;
}á áŹáá˝ááşá áĄááąá¸ááťáááşáááş áá°ááŽáááşá 0.
áááŻáˇááąáŹááşá áááŻáá˛áˇáááŻáˇááąáŹ áá áşáááşá ááŹáááá áşááŻá áĄááźááşáĄáŹááŻáśááᯠáááŻááşá áŹá¸ááźáŻááźááşá¸áááŻáˇ áááşáá˝áŹá¸ááźááŤá ááŻáˇá áĄáááşááąáŹááş node ááąáŹáˇááᯠáĄááąáŹááşááźááˇáş ááźááŤáááş (áááşáááŻá¸ááᯠááźáááşáááŻááşááŤá áááşá¸áááş ááááŻáĄááşááąáŹááźáąáŹááˇáş)á ááŽááąáŹ - ááŻáśá¸áĄááąá¸ááťáááşá á áááşá¸áááşá¸ááąáŹ - node áĄáá˝ážááşá¸
ááťá˝ááşáŻááşáááŻáˇááĄáááşáááş áááŹááźá áşááąááąáŹáĄá፠áááşá¸ááĄááąá¸ááťáááşáážáŹ 0 ááźá áşáááşá áááşá¸áá˝ááş áĄááźá áşááźááşá ááşáá áşááŻááᯠáááˇáşááźááŤá ááŻáˇá

áá áşáááşááĄááąá¸ááťáááşáááş 1 ááźá áşááŹáááşá áĄááźá áşááźááşá ááşááĄááąá¸ááťáááşáááş 1 ááźá áşááŹáááşá áĄááźá áşááźááşá ááşááĄááąá¸ááťáááşáááş áá áşáááşááĄááąá¸ááťáááşááźá áşáááşá
ááąáŹááşáááşááźááşá ááşáĄáááşá¸áááş áááşáááˇáşááźááŤá ááŻáˇá




ááźááşá
ááşáĄáá
áşáá
áşááŻáááˇáşáááŻááşáááŻááşá¸á ááťá˝ááşáŻááşáááŻáˇáááş node ááťáŹá¸áááŻáááşá¸áá˝áŹá¸ááźáŽá¸ node áá
áşááŻá
áŽááĄááąá¸ááťáááşáááşááźááşáááŻáááŻá¸á
áąáááşá node áĄáá
áşáá
áşááŻáááşááŽá¸ááąáŹáĄááŤá áĄááąá¸ááťáááşáá
áşááŻáááşáážááşááąá¸áááşá 1. áááŻáááŻáˇááąáŹááąáŹáˇááŤááąáŹ node áá
áşááŻáážááážááˇáşááźáŽá¸ááźá
áşááŤáá ááťá˝ááşáŻááşáááŻáˇáááş áááşáááŻá¸ááᯠáááşááąá¸ááźáŽá¸ ááťá˝ááşáŻááşáááŻáˇááźááşáááşá¸ááźáŽá¸ááąáŹ node ááťáŹá¸áĄáŹá¸ááŻáśá¸á áĄááąá¸ááťáááşááźáąáŹááşá¸áá˛áážáŻááťáŹá¸ááᯠáááşááťááşáᏠroot áĄáá ááźááşáá˝áŹá¸ááŤáááşá
áĄáááşá node áá
áşááŻááᯠáááşáážáŹá¸ááąááŤáá ááťá˝ááşáŻááşáááŻáˇáááş áĄáąáŹááşáááŻáˇáááşá¸ááźáŽá¸ ááźááşáááşá¸áá˝áŹá¸ááąáŹ node ááťáŹá¸á áĄááąá¸ááťáááşááťáŹá¸ááᯠááťážáąáŹáˇááťááŤá
áĄáá˝ážááşá¸ááááşá¸
áĄáᯠindex node ááŻááşáááşá¸ááᯠáááşááźááˇáşááĄáąáŹááşá Node ááťáŹá¸áááş áááşá¸áááŻáˇá áĄáá˝ážááşá¸ááááşá¸ááᯠááźááşááŹá¸á
á˝áŹ ááááşá¸áááşá¸áááŹá¸ááŤá áááşá¸ááᯠnode ááťáŹá¸á áĄááąá¸ááťáááşááąáŤáşáĄááźáąááśá áá˝ááşááťááşáááşá áĄáááşá áááşá¸áááŻáˇáááş áááşá¸áááŻáˇá áĄáá˝ážááşá¸ááááşá¸ááᯠááááşá¸áááşá¸ááŹá¸ááŤá áááşá¸ááᯠáááŻáĄááşáááşááźá
áşáááşá áĄáᯠ(á) áá
áşáááşáá˝ááşááźáąáŹááşá¸áá˛áážáŻáá
áşááŻá
áŽááźáŽá¸ááąáŹááş node ááťáŹá¸áĄáŹá¸ááŻáśá¸ááĄáá˝ážááşá¸ááááşá¸ááťáŹá¸áááŻáá˝ááşá¸ááśáááşáĄááťáááşá
áĄááźááşáĄáŹááŻáśááᯠáááŻááşá
áŹá¸ááźáŻááźááşá¸áááŻáˇ áááşáá˝áŹá¸ááźááŤá
ááŻáˇá ááťá˝ááşáŻááşáááŻáˇááá
áşáááşáááş áááŹááźá
áşááąáááşá áááşá¸áá˝ááş 1st node áááŻáááˇáşááźááŤá
ááŻáˇá

ááá Node áá˝ááş áĄáá˝ážááşá¸áá áşááŻáážááááşá 0ááźáŽá¸ááąáŹáˇ áĄáᯠá ááąáŹááş ááźá áşáááŻááşáááşá ááááá˝ááşá áĄááźá áşááźááşá ááşááĄáá˝ážááşá¸ááááşá¸áááş ááźáąáŹááşá¸áá˛áááşááźá áşááźáŽá¸á ááŻááááá˝ááş áááşá¸áááş ááźáąáŹááşá¸áá˛áááşáááŻááşááŤá

áĄááźá áşáá˝ááşá áááşáááşáĄáááşá áĄááąá¸ááťáááşáážáŹ áá
ááŻáááááá ášá -

áááşá¸ááááşáááşáĄáááşááĄááąá¸ááťáááşáááş á ááťááşááąááąáŹááźáąáŹááˇáş áĄááźá áşááĄáá˝ážááşá¸ááááşá¸áááźáąáŹááşá¸áá˛ááŤá
node áá áşááŻá áĄáá˝ážááşá¸ááááşá¸ááᯠáááşá¸á áááşáááşáááşááĄáá˝á˛á áĄááąá¸ááťáááş + áááşáááśááž ááąá¸áááŻáˇááąáŹ ááśááŤááşáĄááźá áş áá˝ááşááťááşáááşá á¤ááááşá¸ááááşá¸áááş áĄáááşáááşá¸á á¤áááşáážáŹ áĄáá˝ážááşá¸ááááşá¸ááąáŹááşááŹááźá áşááźáŽá¸ áĄá áááŻááşá¸áá˝ááş áááşá¸áážááˇáş ááŽááťážáááşá 0, ááŹááźá áşáááŻáˇáá˛áááŻááąáŹáˇ root áážáŹ áááááážáááŤáá°á¸á áĄá˛ááŽáĄááŤááťáááş áááşáááşáááąá¸á áááşáááŻáááşá¸áá˝áŹá¸ááá˛áááŻáá˛áˇáĄááąáŤáşáážáŹ áá°áááşáááşá áááşáááşáážáŹáááŻáááş ááąáŹááşááŹáážáŹ ááŹáážáááˇáşáááŹá¸áá°á¸á áĄáááşá ááťá˝ááşáŻááşáááŻáˇáááş áááşáážá node á áĄáá˝ážááşá¸ááᯠááŹáááşáááŻáˇ ááąáŤááşá¸áááˇáşááŤáá

áĽáááŹáĄáŹá¸ááźááˇáşá ááąáŹáˇ 8 ááŤááąáŹ ááźááşá
ááşáá
áşááŻá áĄáá˝ážááşá¸ááááşá¸ (áĄááźá
áşá ááŹáááşáááąá¸) ááᯠáááşáááŻáˇ áá˝ááşááťááşááááşá¸á á¤áááşáážáŹ "Root Index" + "ááąáŹáˇ 8" ááŤááąáŹ áááşáááşáĄáá˝á˛á áĄááąá¸ááťáááş" + "1" == 3 + 2 + 1 == 6
ááąáŹáˇ 6 ááŤááąáŹ ááźááşá
ááşá áĄáá˝ážááşá¸ááááşá¸áááş "áĄááźá
áşáá˝ážááşá¸ááááşá¸" + 1 == 3 + 1 == ááźá
áşááááˇáşáááşá 4
áááŻáˇááźáąáŹááˇáşá áĄáá˝ážááşá¸áĄáŹá¸ááźááˇáş ááźááşá ááşáá áşááŻááᯠááá°áááşáážááˇáş ááťááşáááş áĄááťáááşáá°ááááşá áĄáᯠ(log n)áĄáááşááźáąáŹááˇáşáááŻááąáŹáş áááŻááťááşááąáŹááźááşá ááşáááŻááááşáĄáá˝ááş áááşá¸ááᯠáŚá¸á á˝áŹáážáŹáá˝áąááááşááźá áşááąáŹááźáąáŹááˇáş (áĄááźá áşááž á¤ááźááşá ááşáááŻáˇáááşá¸áá˝áŹá¸ááŤ)á
áĄáááş
áĄááąá¸ááťáááşááąáŤáşáá°áááşá áá
áşáááşááĄááááşáĄáááşáááŻáááşá¸ áá˝ááşááťááşáááŻááşáááşá áááşááťááşááŽáááŻáˇ áááŻáĄááşááŤáááşá
áááşá¸áááŻááŻááşááąáŹááşáááşá áááşáážá node ááĄááąá¸ááťáááşááᯠááąá¸ááŹá¸ááąáŹáĄááąá¸ááťáááşáááş ááźáŽá¸ááąáŹ áááŻáˇáááŻááş ááŽááťážáááˇáş ááŤá፠2 á áááááśááŤááşáááŻáˇ áááŻááşá¸ááŹá¸ááááşááźá
áşááźáŽá¸ áááşá¸ááž binary logarithm áááŻáá°ááŤá áááşá¸áááş ááťá˝ááşáŻááşáááŻáˇáĄáŹá¸ ááťážááááşáᯠáá°áááŤá áá
áşáááşááĄááááşáĄáááşááᯠááąá¸ááŤááááˇáşáááşá ááźááşá
ááşáĄáá
áşáááˇáşáá˝ááşá¸ááźáŽá¸ááąáŹááş áá
áşáááşáááş áááşááťááşááŽáááşá áá
áşáááşáá˝áąááᯠáááşááťááşááŽáĄáąáŹááş áááşáááŻááááşá¸áááá˛áááŻáá˛áˇ ááŽáĄááŻááŽááᯠááťá˝ááşááąáŹáş áááąá¸ááŤáá°á¸á áĄáááşá¸áĄááźá
áşááŻááşááťáŹá¸áááş áááşááťááşááŽááąáŹááŻááşááąáŹááşááťááşááᯠááąá¸ááąáŹááşáááşá
áĄááąá¸ááťáááşááᯠáĄáááşáááŻáˇááźáąáŹááşá¸áááş ááŻááşá
/*
* ĐОСвŃаŃĐ°ĐľŃ ĐżĐľŃвОо ŃиŃНО в ŃŃопони 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));
}ááááşááťáŹá¸áááŻ
- ááźááşá ááşáĄáá áşáá áşááŻáááˇáşáá˝ááşá¸ááźááşá¸áá˝ááş ááźá áşááąáŤáşáááşá áĄáᯠ(log n)
- ááśááŤááşá ááşáĄáááŻááş áĄá áááşáĄáááŻááşá¸áá áşááŻáĄáŹá¸ ááťááşááźááşá¸áážáŹ ááźá áşááąáŤáşááŤáááşá áĄáᯠ(log n)
- áĄáážááşá ááşááśááŤááşááźááˇáş ááźááşá ááşáá áşááŻááážáááźááşá¸áážáŹ ááźá áşááąáŤáşááŤáááşá áĄáᯠ(log n)
áĄáážáááş áĄáᯠ(log n) ááąááŹáĄáŹá¸ááŻáśá¸ááᯠáĄááťááŻá¸áĄá áŹá¸áá˝á˛ááŹá¸áááˇáşááŻáśá áśááźááˇáş ááááşá¸áááşá¸ááŹá¸ááąáŹááźáąáŹááˇáş ááťá˝ááşáŻááşáááŻáˇ ááąá¸ááąáŹááşááŤáááşá
ááŽáááŻáá˝á˛áˇá ááşá¸ááŻáśá áááşááąááŹáážáŹ áĄááŻáśá¸áááşáááŻááşáᲠááááá°á¸á áá áşáááşááťáŹá¸ áááşáááŻáˇáĄááŻááşááŻááşáááşááᯠááŹá¸áááşáááş áááąá ááá áşááŻááŹááźá áşáááşá áááŻá ááŻááşáá˛áˇáĄáá˝ááşááťáąá¸áá°á¸áááşááŤáááşá
áááŻá¸ááŹá¸
áááąáŹááťááşáá˝ááş ááŻááşááąáŹááşááťááşáĄááźááşáážáŻááşá¸ááᯠá á áşááąá¸áááş á ááşá¸áááşááąááŹááŤáážááááşá áá áşáááşá ááźááˇáşááąáááşá 1000000 ááźááşá ááşá áááŻáˇáĄááźááş áĄá áááşáĄáááŻááşá¸ááťáŹá¸ááᯠáááşáááŻááşááťááşááźááşá¸á áááˇáşáá˝ááşá¸ááźááşá¸áážááˇáş ááźááşáááşááá°ááźááşá¸ááťáŹá¸áááşá¸ áážáááŤáááşá 1000000 áááŤá áĄá˛ááŤááŤáá˛á 3000000 á á áşáááşááąá¸á ááááşáááş ~ 8 á áášáááˇáşáĄááąáŹáşááąá¸ááąáŹááşá¸áááşá
source: www.habr.com
