αααα»αααΆαααααααΆαααααααααααααα αΆααΌα ααΆααααααα ααΆα αΆαααΆα ααααα»αααΆαα’αα»αααααα»ααααα»ααα·ααααααααααααααααΌααα»αααΆαααΌα ααΆααααααα
- αααα αΌαααΆαα»ααααΈα
- ααααΆαα»α ααααααααααααα
- ααα½αααΆαααΆαα»ααααααααααααΆα
- αα·ααααααααααΌαααΆααααααΆαα»ααααα»ααααααααααααα
αα·ααααααααααΌαααΆααααααα αα·αααα ααα₯αααααα αα ααΆααααααααααααΌαααααΆααΆααΆαααΌαααααΏαααααα·ααααα·ααΆαααΏαα ααααΌααααα»αααΆαααααΆααΆαα’αα»ααααααΏααααααααααααααΎαα»ααααααααΆαααΈ 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.
αααααΆαααα ααΎααααααα ααΆαααααΆααααααΎαααΎαααα§ααΆα αααααααΎαααΎααααααα αααα ααααΆααα α»α ααααΆααααΉαααααΌαααΆααααα αΆαααΆααα (αααααααΉααα·αααααΌαααΆααααα αΆααααααααααααα·αα αΆαααΆα ααα) αααα α - ααααα knot, ααααα - αααααααααααααΆααα
αα ααααααααΎαααΎααααααΎαααα ααααααααααααΆααΊ 0α α αΌαααααααααΆαα»α«ααα ααΆα
ααααααααααααααΆαααααΆαααΆ 1 αααααααααΆαα»α«αααααΆαααΆ 1. αααααααααΆαα»α«αααΊααΆαααααααααΎαααΎα
αααααααααααΆαα»αα½αα ααα½ααααα
ααΆααααααααααΆαα»ααααΈααααΌαααΆααααααα ααΎαα
α»ααααααααααΆαα αα·ααααααΎαααααααααααααΆααααΈαα½αααααααΆαααααααΆααα αα
ααααααααααΆααααααΈααααΌαααΆααααααΎα αααααααα½αααααΌαααΆαααααααα
α±ααααΆα 1. ααααα·αααΎααααΆαααααααΆαααΌαααααααααααΆααα½α
α αΎα αααααΎαααΉααααααααΆααααΈααΎααααα α αΎααααααααα
α«ααα·α ααααα»αα
ααααΆαααααΆααααααΌαααααααααααααΆααααΆααα’αααααααΎαααΆαααααααΆααα
ααααα·αααΎααααΆαααα½ααααα»αααααΌαααΆαααα
αα αααααΎαα
α»αααααα α αΎααααααααααααααααααΆαααααααΆαααααααΆααα
ααααααααα
α₯α‘αΌααααααΌααααααα
ααααααααΎαα·αα·ααααααααΆααα ααααΆαααα·ααααααΆαα»ααα·αα·αααααααααα½αααα
αααΆααααΆαααα ααΆααααΌαααΆαααααΆαααααα’ααααΎααααααααααααΆααα ααααα·αααΎαα½ααααααααΆαα»αααααααααααααααα½ααα αααααΆααΉαααααΌαααΆαααΆαααΆα α’αΌα (n) αααααααΆααΎααααΈααααΎαα
αα
α»ααααααααΆααα·αα·ααααααααααΆααααΆααα’αααααααΆααααΈααΆαααααΆααααααΌαααΈαα½αααα
αααα»ααααααΆαα
α
αΌααααααα
ααΆαααααΆααααααΎαααΎαα αααααΆαααααααΎαααα αααααααααααααΆααααΈ 1 αα
ααΆα
ααααΆααααΈαα½αααΆααα·αα·αααα 0α αΎαα₯α‘αΌαααα 2 ααααΈα’αΆα ααααΎαα ααΆαα αα αααα»αααΈαα½α αα·αα·ααααααααΆαα»α«αααΉαααααΆααααααΌα ααΈααΈαααΆααΉααα·αααααΆααααααΌαααα
αα α«α αααααΆαααααΆααααααααΆααααααα α‘.
ααααΈααΈααΈαα
αα·αα·ααααααα«ααα·αααααΆααααααΌααα αααααΆααααααααααααααΆαααααΆααααααααααααΆαα αα 0α
αααααααααβααβααααΆααβααααΌαβααΆαβααααΆβααΆβααααααβααβα’αα»αααααΆαβααΆαβαααααβααααβααΆ + αααβαααβααΆαβααααβααΈβααα ααΎβαααβαααβααΆβαααβα’αααΈ?, αααβααΆβαααααααααβααΆαα, ααααΌαβααΆβααααΎβααΉα 0, αααααΆααα α«ααα·αααΆαααα αααααΆααααααΆααΆααα’ααααΊα’αΆαααααααΎαααααααααααΎαα α»ααα ααΌαααΆααααααα¬ααΆαααααΆαα ααααα·αααΎαα ααΆαααααα αααααααΆαα’αααΈααααΌαααΆααααααααα αααααααα ααααα·αααΎααΎααααααααααααααααααααααΆαααα αα α»αααααααα ααΆαααααΆαα
α§ααΆα ααα ααααβαααβαααααααααβααβααΆαα»βαααβααΆαβαααααΉα 8 (ααΌαβααααΉαααααΌαβααβα«α) ααααΌαβααΆαβααααΆα αααααΊααΆ "αααααααααα«α" + "αααααααααααααΆαααααΆααααααααααααΆαααααααΆααααααΉα 8" + "1" == 3 + 2 + 1 == 6
αα·αα·ααααααααΆαα»αααααΆααααααΉα 6 ααΉαααΆ "αααααααααα«α" + 1 == 3 + 1 == 4
ααΌα ααααα αΎα ααΆααααΌαααΆααααααααΆααΎααααΈααα½αααΆα αα·ααα»αααΆαα»ααααα·αα·αααα O (log n)αααβααΆαβααβααΎααααΈβααα½αβααΆαβααΆαα»βαααβα ααβααΆαβααΎαβααααΌαβααβαααααβααβααΆβααΆβααααΌα (α α»αβααΈ root αα βααΆαα»βαααβ) α
ααααα
αααααα’ααααΎααααααα’αααααα’αΆα
ααααΆααααα
ααααΎαααΎαααααα α
αΆαααΆα
ααααααΆαααα»αααααΆαα
ααΎααααΈααααΎααΌα
αααααααααααααααΆαααα
αα
α»ααααααααααΌααααααααααα
αααααΈαα½ααα
ααΆααααα 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 (log n)
- ααΆααα»αααΆαα»αααααααααααααΎαα‘αΎααα αααα»α O (log n)
- ααΆαααα½αααΆαααΆαα»αααααααααααααΎαα‘αΎααα αααα»α O (log n)
ααααΏα O (log n) ααΎαα αααΆαααΎααΆααα·ααααααΆαα·ααααααααΆααα’ααααααΌαααΆααααααΆαα»ααααα»αααααααααααααα
αααα»ααα·αααΉαααΆααααααααΆααααα ααΆααααααααααααααα’αΆα ααΆααααααααααααααα ααααΆααααααΆααααααααα»αααΌαααΎααααΈαααααΈαααααααααΎαααΎααααΎααΆαα ααΌαβα’ααα»αβα ααααβααΆαβααα α·αααβαα»αααΆααβααααβαααα’αααα
ααα ααααΈααα
αααααααααααΆααα·ααααααααΆααααα ααΎααααΈαα·αα·αααααΎαααααΏαααααα·ααααα·ααΆαα ααΎαααΎαααα»αααααα 1000000 ααΆαα»α α αΎαααΆαααΆααα»αααΆαααααααααΆαα ααΆααααα αΌα αα·αααΆαααΆαααααΆαα» 1000000 ααααα αααααΊααΆ 3000000 ααααα·ααααα·ααΆαα ααααααααΆααααααα ααΆααα’ααΆαα ~ 8 αα·ααΆααΈα
ααααα: www.habr.com