เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ

เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ

เบ‚เป‰เบญเบเบžเบปเบšเบšเบฑเบ™เบซเบฒเบ›เบฐเป€เบžเบ”เบ•เปเปˆเป„เบ›เบ™เบตเป‰. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบเปˆเบญเบ‡เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เปƒเบชเปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบซเบกเปˆ
  • เป€เบญเบปเบฒเบญเบปเบ‡เบ›เบฐเบเบญเบšเบญเบญเบเป‚เบ”เบเป€เบฅเบเบฅเปเบฒเบ”เบฑเบš
  • เป„เบ”เป‰เบฎเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเป‚เบ”เบเบˆเปเบฒเบ™เบงเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡
  • เบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบฎเบนเบšเปเบšเบšเบˆเบฑเบ”เบฎเบฝเบ‡

เบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเป€เบžเบตเปˆเบกเปเบฅเบฐเป€เบญเบปเบฒเบญเบญเบเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡, เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ•เป‰เบญเบ‡เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ„เบงเบฒเบกเป„เบงเปƒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เป„เบง. เบ—เปเบฒเบญเบดเบ”เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฐเบเบฒเบเบฒเบกเบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบดเปˆเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป‚เบ”เบเปƒเบŠเป‰เบ–เบฑเบ‡เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบˆเบฒเบ std. เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ„เบญเบšเบ„เบญเบ‡เบ”เป‰เบงเบเบ„เบงเบฒเบกเบชเปเบฒเป€เบฅเบฑเบ”เปเบฅเบฐเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบกเบฒเบงเปˆเบฒเบ‚เป‰เบญเบเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡. เบชเบดเปˆเบ‡เบ”เบฝเบงเบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเปƒเบ™เปƒเบˆเปเบกเปˆเบ™เบเบฒเบ™เปƒเบŠเป‰เบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบปเป‰เบ™เบซเบฒเบ„เบนเปˆ. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เปเบŠเบเป„เบง, เบเบฒเบ™เบฅเบถเบšเปเบฅเบฐเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบˆเบฑเบ”เบฅเบฝเบ‡. เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ„เบดเบ”เบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเบ”เบชเบฐเบ™เบตเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเบ„เบดเบ”เป„เบฅเปˆเบ•เบปเบงเบŠเบตเป‰เบงเบฑเบ”เบ„เบทเบ™เปƒเบซเบกเปˆเป€เบกเบทเปˆเบญเบ•เบปเป‰เบ™เป„เบกเป‰เบ›เปˆเบฝเบ™เปเบ›เบ‡.

struct node_s {    
    data_t data;

    uint64_t weight; // ะฒะตั ัƒะทะปะฐ

    node_t *left;
    node_t *right;

    node_t *parent;
};

เบšเบปเบ”เบ„เบงเบฒเบกเบˆเบฐเบกเบตเบฎเบนเบšเบžเบฒเบšเปเบฅเบฐเบ—เบดเบ”เบชเบฐเบ”เบตเบซเบผเบฒเบเบเปˆเบงเบฒเบฅเบฐเบซเบฑเบ”. เบฅเบฐเบซเบฑเบ”เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ”เป‰เบ—เบตเปˆเบฅเบดเป‰เบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰.

เบ™เป‰เปเบฒเบซเบ™เบฑเบ

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ•เบปเป‰เบ™เป„เบกเป‰เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ”เบฑเบ”เปเบ›เบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ, เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเบเปˆเบฝเบงเบเบฑเบš เบ™เป‰เบณเปœเบฑเบ node. เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบ‚เปเป‰เปเบกเปˆเบ™ เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบฅเบนเบโ€‹เบซเบฅเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบ™เบตเป‰โ€‹ + 1 (เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ”เบฝเบง).

เบŸเบฑเบ‡เบŠเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฎเบฑเบšเบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบ‚เปเป‰:

uint64_t bntree::get_child_weight(node_t *node) {
    if (node) {
        return node->weight;
    }

    return 0;
}

เบ™เป‰ เบณ เปœเบฑเบ เบ‚เบญเบ‡เปเบœเปˆเบ™เปเบกเปˆเบ™เป€เบ—เบปเปˆเบฒเบเบฑเบš 0.

เบ•เปเปˆเป„เบ›, เปƒเบซเป‰เป€เบฎเบปเบฒเบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบžเบฒเบšเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง. เบ”เบณ เบ›เบธเปˆเบก node เบˆเบฐเบ–เบทเบเบชเบฐเปเบ”เบ‡เป€เบ›เบฑเบ™เบชเบต (เบ„เปˆเบฒเบˆเบฐเบšเปเปˆเบชเบฐเปเบ”เบ‡, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™), เบชเบตเปเบ”เบ‡ - เบ™โ€‹เป‰โ€‹เปเบฒโ€‹เบซเบ™เบฑเบ knotโ€‹, เบชเบตเบ‚เบฝเบง - เบ”เบฑเบ”เบŠเบฐเบ™เบต node.

เป€เบกเบทเปˆเบญเบ•เบปเป‰เบ™เป„เบกเป‰เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™ 0. เปƒเบซเป‰เป€เบžเบตเปˆเบกเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบฎเบฒเบเบเบฑเบšเบกเบฑเบ™:

เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ

เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰เบเบฒเบเป€เบ›เบฑเบ™ 1, เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบฎเบฒเบเบเบฒเบเป€เบ›เบฑเบ™ 1. เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบฎเบฒเบเปเบกเปˆเบ™เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰.

เปƒเบซเป‰เป€เบžเบตเปˆเบกเบญเบปเบ‡เบ›เบฐเบเบญเบšเบญเบตเบเบชเบญเบ‡เบชเบฒเบกเบขเปˆเบฒเบ‡:

เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ
เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ
เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ
เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ

เปเบ•เปˆเบฅเบฐเบ„เบฑเป‰เบ‡เบ—เบตเปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบซเบกเปˆเบ–เบทเบเป€เบžเบตเปˆเบก, เบžเบงเบเป€เบฎเบปเบฒเบฅเบปเบ‡เป„เบ›เบซเบฒเบ‚เปเป‰เปเบฅเบฐเป€เบžเบตเปˆเบกเบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐ node เบœเปˆเบฒเบ™. เป€เบกเบทเปˆเบญเป‚เบซเบ™เบ”เปƒเบซเบกเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™, เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰เบกเบฑเบ™ 1. เบ–เป‰เบฒ node เบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ‚เบฝเบ™เบ—เบฑเบšเบกเบนเบ™เบ„เปˆเบฒเปเบฅเบฐเบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™เป€เบ–เบดเบ‡เบฎเบฒเบ, เบเบปเบเป€เบฅเบตเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡ nodes เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบœเปˆเบฒเบ™.
เบ–เป‰เบฒ node เบ–เบทเบเป‚เบเบเบเป‰เบฒเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบฅเบปเบ‡เป„เบ›เปเบฅเบฐเบซเบผเบธเบ”เบฅเบปเบ‡เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡ nodes เบœเปˆเบฒเบ™.

เบ”เบฑเบ”เบ™เบต

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเบ”เบชเบฐเบ™เบต nodes. Nodes เบšเปเปˆเป„เบ”เป‰เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ”เบฑเบ”เบŠเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™, เบกเบฑเบ™เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡ nodes. เบ–เป‰เบฒเบžเบงเบเป€เบ‚เบปเบฒเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ”เบฑเบ”เบชเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเบ–เบทเบเบ•เป‰เบญเบ‡เบเบฒเบ™ O (n) เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เบ”เบฑเบ”เบชเบฐเบ™เบตเบ‚เบญเบ‡เบ—เบธเบ nodes เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบ•เปˆเบฅเบฐเบ•เบปเป‰เบ™เป„เบกเป‰.
เปƒเบซเป‰เบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบเบฒเบ™เบชเบฐเปเบ”เบ‡เบžเบฒเบš. เบ•เบปเป‰เบ™เป„เบกเป‰เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เปƒเบซเป‰เป€เบžเบตเปˆเบกเบ‚เปเป‰เบ—เบต 1 เปƒเบชเปˆเบกเบฑเบ™:

เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ

node เบ—เปเบฒเบญเบดเบ”เบกเบตเบ”เบฑเบ”เบŠเบฐเบ™เบต 0, เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปเบกเปˆเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰ 2 เบเปเบฅเบฐเบ™เบต. เปƒเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”, เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบฎเบฒเบเบˆเบฐเบ›เปˆเบฝเบ™เปเบ›เบ‡, เปƒเบ™เบ„เบฑเป‰เบ‡เบ—เบตเบชเบญเบ‡เบกเบฑเบ™เบˆเบฐเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡.

เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ

เบขเบนเปˆเบฎเบฒเบ, เบ•เบปเป‰เบ™เป„เบกเป‰เบเปˆเบญเบเบŠเป‰เบฒเบเบกเบตเบ™เปเป‰เบฒเปœเบฑเบ 1.

เบเปเบฅเบฐเบ™เบตเบ—เบตเบชเบญเบ‡:

เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ

เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ‚เบญเบ‡เบฎเบฒเบเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบžเบฒเบฐเบงเปˆเบฒเบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰เบเปˆเบญเบเบŠเป‰เบฒเบเบ‚เบญเบ‡เบกเบฑเบ™เบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆ 0.

เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ‚เบญเบ‡ node เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆเป€เบ›เบฑเบ™เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡ subtree เบŠเป‰เบฒเบเบ‚เบญเบ‡เบกเบฑเบ™ + เบ•เบปเบงเป€เบฅเบเบ—เบตเปˆเบœเปˆเบฒเบ™เบˆเบฒเบเบžเปเปˆเปเบกเปˆ. เบ•เบปเบงเป€เบฅเบเบ™เบตเป‰เปเบกเปˆเบ™เบซเบเบฑเบ‡?, เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบ™เบฑเบšเบ”เบฑเบ”เบŠเบฐเบ™เบต, เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบกเบฑเบ™เป€เบ—เบปเปˆเบฒเบเบฑเบš 0, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบฎเบฒเบเบšเปเปˆเบกเบตเบžเปเปˆเปเบกเปˆ. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบฅเบปเบ‡เป„เบ›เบซเบฒเป€เบ”เบฑเบเบŠเป‰เบฒเบเบซเบผเบทเบ‚เบงเบฒ. เบ–เป‰เบฒเป„เบ›เบ—เบฒเบ‡เบŠเป‰เบฒเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเป€เบ„เบปเบฒเป€เบ•เบต. เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบ”เบฑเบ”เบŠเบฐเบ™เบตเบ‚เบญเบ‡เป‚เบซเบ™เบ”เบ›เบฐเบˆเบธเบšเบฑเบ™เปƒเบซเป‰เบ–เบทเบเบ•เป‰เบญเบ‡.

เบ”เบฑเบ”เบชเบฐเบ™เบตเบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเบ”เบชเบฐเบ™เบตเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ” 8 (เบฅเบนเบเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบฎเบฒเบ) เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆ. เบ™เบตเป‰เปเบกเปˆเบ™ "Root Index" + "เบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡ subtree เบŠเป‰เบฒเบเบ‚เบญเบ‡ node เบเบฑเบšเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™ 8" + "1" == 3 + 2 + 1 == 6
เบ”เบฑเบ”เบŠเบฐเบ™เบตเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบกเบตเบเบธเบ™เปเบˆ 6 เบˆเบฐเป€เบ›เบฑเบ™ "เบ”เบฑเบ”เบŠเบฐเบ™เบตเบฎเบฒเบ" + 1 == 3 + 1 == 4

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบกเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเปเบฅเบฐเบฅเบถเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเป‚เบ”เบเบ”เบฑเบ”เบชเบฐเบ™เบต O (log n), เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบžเบงเบเป€เบฎเบปเบฒเบ—เปเบฒเบญเบดเบ”เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบกเบฑเบ™ (เบฅเบปเบ‡เบˆเบฒเบเบฎเบฒเบเป„เบ›เบซเบฒเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ™เบตเป‰).

เบ„เบงเบฒเบกเป€เบฅเบดเบ

เบญเบตเบ‡เบ•เบฒเบกเบ™เป‰เปเบฒเบซเบ™เบฑเบ, เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ„เบดเบ”เป„เบฅเปˆเบ„เบงเบฒเบกเป€เบฅเบดเบเบ‚เบญเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰. เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบธเปˆเบ™เบ”เปˆเบฝเบ‡.
เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ™เป‰ เบณ เปœเบฑเบ เบ‚เบญเบ‡เป‚เบ™เบ”เบ›เบฐเบˆเบธเบšเบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเบ›เบฑเบ”เป€เบ›เบฑเบ™เบ•เบปเบงเป€เบฅเบ เบ—เบณ เบญเบดเบ”เป„เบ›เบซเบฒเบžเบฐเบฅเบฑเบ‡เบ‡เบฒเบ™เบ‚เบญเบ‡ 2 เป€เบŠเบดเปˆเบ‡เปƒเบซเบเปˆเบเบงเปˆเบฒเบซเบผเบทเป€เบ—เบปเปˆเบฒเบเบฑเบšเบ™เป‰ เบณ เปœเบฑเบ เบ—เบตเปˆเปƒเบซเป‰เปเบฅเบฐเป€เบญเบปเบฒ 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));
}

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš

  • เบเบฒเบ™เปเบŠเบเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบซเบกเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™ O (log n)
  • เบเบฒเบ™เบฅเบถเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเป‚เบ”เบเป€เบฅเบเบฅเปเบฒเบ”เบฑเบšเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™ O (log n)
  • เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเป‚เบ”เบเป€เบฅเบเบฅเปเบฒเบ”เบฑเบšเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™ O (log n)

เบ„เบงเบฒเบกเป„เบง O (log n) เบžเบงเบเป€เบฎเบปเบฒเบˆเปˆเบฒเบเบ„เปˆเบฒเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบฎเบนเบšเปเบšเบšเบˆเบฑเบ”เบฎเบฝเบ‡.

เบ‚เป‰เบญเบเบšเปเปˆเบฎเบนเป‰เบงเปˆเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบขเบนเปˆเปƒเบช. เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบดเบ”เบชเบฐเปœเบฒเป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบญเบตเบเป€เบ—เบทเปˆเบญเปœเบถเปˆเบ‡เบงเปˆเบฒเบ•เบปเป‰เบ™เป„เบกเป‰เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”. เบ‚เบญเบšเปƒเบˆเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เป€เบญเบเบฐเบชเบฒเบ™

เป‚เบ„เบ‡เบเบฒเบ™เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป€เบžเบทเปˆเบญเบเบงเบ”เบเบฒเป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเป„เบงเบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™. เบ•เบปเป‰เบ™เป„เบกเป‰เบเปเบฒเบฅเบฑเบ‡เบ–เบปเบกเบ‚เบถเป‰เบ™ 1000000 เบญเบปเบ‡เบ›เบฐเบเบญเบš. เปเบฅเบฐเบกเบตเบเบฒเบ™เบฅเบถเบšเบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš, เบเบฒเบ™เปเบŠเบเปเบฅเบฐเบเบฒเบ™เบ”เบถเบ‡เบ‚เปเป‰เบกเบนเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบš 1000000 เบ„เบฑเป‰เบ‡เบ”เบฝเบง. เบ™เบฑเป‰เบ™โ€‹เปเบกเปˆเบ™ 3000000 เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเบกเบฒเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ”เบต ~ 8 เบงเบดเบ™เบฒเบ—เบต.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™