á¡á±á¬ááºáá±á¬áºááŒáá« ááŒá¿áá¬á¡áá»áá¯ážá¡á á¬ážááᯠááŒá¯á¶ááœá±á·áá²á·ááá«áááºá á¡á±á¬ááºáá«áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážááá·áº áá±áá¬ááá¯ááŸá±á¬ááºááŸá¯ááœááºááááºáá¬ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠááá¯á¡ááºáááº-
- á¡á áááºá¡ááá¯ááºážá¡áá áºááá·áºáá«á
- á¡ááŸááºá ááºáá¶áá«ááºááŒáá·áº 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