ื ืชืงืืชื ืืกืื ืืืขืื ืืืื. ืืฉ ืฆืืจื ืืืืฉื ืืืื ืืืกืื ื ืชืื ืื ืืืกืคืง ืืช ืืคืื ืงืฆืืื ืืืืช ืืืื:
- ืืื ืก ืืืื ื ืืืฉ
- ืืืกืืจ ืืืื ื ืืคื ืืกืคืจ ืกืืืืจื
- ืงืื ืืืื ื ืืคื ืืกืคืจ ืกืืืืจื
- ืื ืชืื ืื ืืืืืกื ืื ืืฆืืจื ืืืืื ืช
ื ืชืื ืื ืืชืืืกืคืื ืืืืกืจืื ืื ืืืื, ืืืื ื ืืืื ืืืืืื ืืืืจืืช ืคืขืืื ืืืืจื. ืืืชืืื ื ืืกืืชื ืืืืฉื ืืืจ ืืื ืืืืฆืขืืช ืงืื ืืืื ืจืื ืกืื ืืจืืืื ื std. ืืืจื ืืื ืื ืืืืชืจื ืืืฆืืื ืืืืืขื ืืืื ื ืฉืื ื ืฆืจืื ืืืืฉื ืืฉืื ืืขืฆืื. ืืืืจ ืืืืื ืฉืขืื ืืจืืฉื ืืื ืืืฉืชืืฉ ืืขืฅ ืืืคืืฉ ืืื ืืจื. ืืืืืื ืฉืืื ืขืื ื ืขื ืืืจืืฉื ืฉื ืืื ืกื, ืืืืงื ืืืืกืื ืืืืจืื ืฉื ื ืชืื ืื ืืฆืืจื ืืืืื ืช. ืื ืื ืฉื ืืชืจ ืืื ืืืืื ืืืฆื ืืืื ืืงืก ืืช ืื ืืืืื ืืื ืืืืฉื ืืืืฉ ืืช ืืืืืื ืืืฉืจ ืืขืฅ ืืฉืชื ื.
struct node_s {
data_t data;
uint64_t weight; // ะฒะตั ัะทะปะฐ
node_t *left;
node_t *right;
node_t *parent;
};
ืืืืืจ ืืืื ืืืชืจ ืชืืื ืืช ืืชืืืืจืื ืืืฉืจ ืงืื. ื ืืชื ืืจืืืช ืืช ืืงืื ืืงืืฉืืจ ืืืื.
ืืฉืงื
ืืื ืืืฉืื ืืืช, ืืขืฅ ืขืืจ ืฉืื ืื ืงื, ื ืืกืฃ ืืืืข ื ืืกืฃ ืขื ืึดืฉืืงึธื ืฆืึนืึถืช. ืืฉืงื ืืฆืืืช ืืื ืืกืคืจ ืืฆืืฆืืื ืฉื ืฆืืืช ืื + 1 (ืืฉืงื ืฉื ืืืื ื ืืืื).
ืคืื ืงืฆืื ืืืฉืืช ืืฉืงื ืืฆืืืช:
uint64_t bntree::get_child_weight(node_t *node) {
if (node) {
return node->weight;
}
return 0;
}
ืืฉืงื ืืกืืื ืฉืืื ืืืชืืื ื 0.
ืืืืจ ืืื, ื ืขืืืจ ืืืืฆืื ืืืืชื ืฉื ืืืืื ืฉื ืขืฅ ืืื. ืฉืืืจ ืืคืชื ืืฆืืืช ืืืฆื ืืฆืืข (ืืขืจื ืื ืืืฆื, ืืืืืื ืฉืื ืื ืืืจืื), ืืืื - ืืฉืงื ืงืฉืจ, ืืจืืง - ืืื ืืงืก ืฆืืืช.
ืืฉืืขืฅ ืฉืื ื ืจืืง, ืืฉืงืื ืืื 0. ืืืื ื ืืกืืฃ ืื ืืืื ื ืฉืืจืฉ:
ืืฉืงื ืืขืฅ ืืืคื ื-1, ืืฉืงื ืืืื ื ืืฉืืจืฉ ืืืคื ื-1. ืืฉืงื ืืืื ื ืืฉืืจืฉ ืืื ืืฉืงื ืืขืฅ.
ืืืื ื ืืกืืฃ ืขืื ืืื ืืืื ืืื:
ืืื ืคืขื ืฉืืชืืืกืฃ ืืืื ื ืืืฉ, ืื ื ืืืจืืื ืืฆืืชืื ืืืืืืืื ืืช ืืื ื ืืืฉืงื ืฉื ืื ืฆืืืช ืฉืขืืจ. ืืืฉืจ ื ืืฆืจ ืฆืืืช ืืืฉ, ืืืงืฆื ืื ืืฉืงื 1. ืื ืืืจ ืงืืื ืฆืืืช ืขื ืืคืชื ืืื, ืื ื ืืืืฃ ืืช ืืขืจื ืื ืืืืจ ืืฉืืจืฉ, ืื ืืื ืืช ืืฉืื ืืืื ืืืฉืงืืื ืฉื ืื ืืฆืืชืื ืฉืขืืจื ื.
ืื ืฆืืืช ืืืกืจ, ืื ืื ืื ื ืืืจืืื ืืืื ืืืืจืืืื ืืช ืืืฉืงืืืืช ืฉื ืืฆืืชืื ืฉืขืืจื.
ืืืืื
ืืขืช ื ืขืืืจ ืืืฆื ืืืื ืืงืก ืฆืืชืื. ืฆืืชืื ืืื ื ืืืืกื ืื ืืืคืืจืฉ ืืช ืืืื ืืงืก ืฉืืื, ืืื ืืืืฉื ืขื ืกืื ืืฉืงื ืืฆืืชืื. ืื ืื ืืืืกื ืื ืืช ืืืื ืืงืก ืฉืืื, ืื ืื ืืืื ื ืืจืฉ O (n) ืืื ืืขืืื ืืช ืืืื ืืงืกืื ืฉื ืื ืืฆืืชืื ืืืืจ ืื ืฉืื ืื ืืขืฅ.
ื ืขืืืจ ืืืืฆืื ืืืืืืื. ืืขืฅ ืฉืื ื ืจืืง, ืืืื ื ืืกืืฃ ืื ืืช ืืฆืืืช ืืจืืฉืื:
ืืฆืืืช ืืจืืฉืื ืืฉ ืืื ืืงืก 0, ืืขืืฉืื 2 ืืงืจืื ืืคืฉืจืืื. ืืจืืฉืื, ืืืื ืืงืก ืฉื ืืืื ื ืืฉืืจืฉ ืืฉืชื ื, ืืฉื ื ืื ืืฉืชื ื.
ืืฉืืจืฉ, ืชืช ืืขืฅ ืืฉืืืื ืฉืืงื 1.
ืืงืจื ืฉื ื:
ืืืื ืืงืก ืฉื ืืฉืืจืฉ ืื ืืฉืชื ื ืืืืืื ืฉืืืฉืงื ืฉื ืชืช ืืขืฅ ืืฉืืืื ืฉืื ื ืฉืืจ 0.
ืืืื ืืงืก ืฉื ืฆืืืช ืืืืฉื ืืืฉืงื ืืืฉื ื ืืฉืืืื ืฉืื + ืืืกืคืจ ืฉืืืขืืจ ืืืื. ืื ืื ืืืกืคืจ ืืื?, ืืื ืืื ื ืืืื ืืงืก, ืืืชืืื ืืื ืฉืืื 0, ืื ืืฉืืจืฉ ืืื ืืืจื. ืืื ืืื ืชืืื ืืืคื ืื ืื ื ืืืจืืื ืืืื ืืฉืืืื ืื ืืืื ื. ืื ืฉืืืื, ืื ืฉืื ืืืจ ืื ืืชืืืกืฃ ืืืืคืง. ืื ื ืืกืืฃ ืืช ืืืื ืืงืก ืฉื ืืฆืืืช ืื ืืืื ืืืืื.
ืืืืืื, ืืืฆื ืืืืฉื ืืืื ืืงืก ืฉื ืืืื ื ืขื ืืคืชื 8 (ืืืื ืืืื ื ืฉื ืืฉืืจืฉ). ืืื "ืืื ืืงืก ืฉืืจืฉ" + "ืืฉืงื ืฉื ืชืช-ืขืฅ ืฉืืืื ืฉื ืืฆืืืช ืขื ืืงืฉ 8" + "1" == 3 + 2 + 1 == 6
ืืืื ืืงืก ืฉื ืืืืื ื ืขื ืืคืชื 6 ืืืื "ืืื ืฉืืจืฉ" + 1 == 3 + 1 == 4
ืืืชืื, ืืืงื ืืื ืืงืื ืืืืืืง ืืืื ื ืืคื ืืื ืืงืก O (ืืืื n), ืื ืขื ืื ืช ืืงืื ืืช ืืืืื ื ืืจืฆืื ืขืืื ื ืงืืื ืื ืืืฆืื ืืืชื (ืืจืืช ืืืฉืืจืฉ ืืืกืื ืืื).
ืขืืืง
ืขื ืกืื ืืืฉืงื ื ืืชื ืื ืืืฉื ืืช ืขืืืง ืืขืฅ. ืืืจืื ืืืืืื.
ืืฉื ืื ืืฉ ืืขืื ืืช ืืฉืงื ืืฆืืืช ืื ืืืื ืืืกืคืจ ืืจืืฉืื ืืืืงืช 2 ืฉืืืื ืื ืฉืืื ืืืฉืงื ืื ืชืื ืืืงืืช ืืื ื ืืช ืืืืืจืืชื ืืืื ืืจื. ืื ืืืชื ืื ื ืืช ืขืืืง ืืขืฅ, ืืื ืื ืฉืืื ืืืืื. ืืขืฅ ืืืืื ืืืืจ ืืื ืกืช ืืืื ื ืืืฉ. ืื ื ืื ืืชื ืชืืืืจืื ืขื ืืื ืืืื ืขืฆืื. ืงืืื ืืืงืืจ ืืกืคืงืื ืคืื ืงืฆืืืช ืืืืื.
ืงืื ืืืืจืช ืืฉืงื ืืขืืืง.
/*
* ะะพะทะฒัะฐัะฐะตั ะฟะตัะฒะพะต ัะธัะปะพ ะฒ ััะตะฟะตะฝะธ 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));
}
ืชืืฆืืืช ืฉื
- ืืื ืกืช ืืืื ื ืืืฉ ืืชืจืืฉืช ื O (ืืืื n)
- ืืืืงืช ืืืื ื ืืคื ืืกืคืจ ืกืืืืจื ืืชืจืืฉืช ื O (ืืืื n)
- ืืฉืืช ืืืื ื ืืคื ืืกืคืจ ืกืืืืจื ืืชืจืืฉืช ื O (ืืืื n)
ืึฐืึดืืจืึผืช O (ืืืื n) ืื ื ืืฉืืืื ืขื ืืขืืืื ืฉืื ืื ืชืื ืื ืืืืืกื ืื ืืฆืืจื ืืืืื ืช.
ืื ื ืื ืืืืข ืืืคื ืืื ื ืืื ืขืฉืื ืืืืืช ืฉืืืืฉื. ืจืง ืืืื ืืืืื ืฉืื ืืื ืขืฆืื ืขืืืืื. ืชืืื ืื ืขื ืชืฉืืืช ืืื.
ืชืืืืจ
ืืคืจืืืงื ืืืื ื ืชืื ื ืืืืงื ืืืืืงืช ืืืืจืืช ืืคืขืืื. ืืขืฅ ืืชืืื 1000000 ืืืื ืืื. ืืืฉ ืืืืงื, ืืื ืกื ืืฉืืืคื ืืจืฆืฃ ืฉื ืืืื ืืื 1000000 ืคึผึทืขึทื. ืื 3000000 ืคืขืืืืช. ืืชืืฆืื ืืชืืจืจื ืืืืื ืืืื ~ 8 ืฉื ืืืช.
ืืงืืจ: www.habr.com