ืขืฅ ื‘ื™ื ืืจื™ ืขื ืื™ื ื“ืงืก

ืขืฅ ื‘ื™ื ืืจื™ ืขื ืื™ื ื“ืงืก

ื ืชืงืœืชื™ ื‘ืกื•ื’ ื”ื‘ืขื™ื” ื”ื‘ืื”. ื™ืฉ ืฆื•ืจืš ืœื™ื™ืฉื ืžื™ื›ืœ ืื—ืกื•ืŸ ื ืชื•ื ื™ื ื”ืžืกืคืง ืืช ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ื‘ืื”:

  • ื”ื›ื ืก ืืœืžื ื˜ ื—ื“ืฉ
  • ืœื”ืกื™ืจ ืืœืžื ื˜ ืœืคื™ ืžืกืคืจ ืกื™ื“ื•ืจื™
  • ืงื‘ืœ ืืœืžื ื˜ ืœืคื™ ืžืกืคืจ ืกื™ื“ื•ืจื™
  • ื”ื ืชื•ื ื™ื ืžืื•ื—ืกื ื™ื ื‘ืฆื•ืจื” ืžืžื•ื™ื ืช

ื ืชื•ื ื™ื ืžืชื•ื•ืกืคื™ื ื•ืžื•ืกืจื™ื ื›ืœ ื”ื–ืžืŸ, ื”ืžื‘ื ื” ื—ื™ื™ื‘ ืœื”ื‘ื˜ื™ื— ืžื”ื™ืจื•ืช ืคืขื•ืœื” ืžื”ื™ืจื”. ื‘ื”ืชื—ืœื” ื ื™ืกื™ืชื™ ืœื™ื™ืฉื ื“ื‘ืจ ื›ื–ื” ื‘ืืžืฆืขื•ืช ืงื•ื ื˜ื™ื™ื ืจื™ื ืกื˜ื ื“ืจื˜ื™ื™ื ืž 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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”