рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖

рдорд▓рд╛ рдЦрд╛рд▓реАрд▓ рдкреНрд░рдХрд╛рд░рдЪреА рд╕рдорд╕реНрдпрд╛ рдЖрд▓реА. рдЦрд╛рд▓реАрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдгрд╛рд░рд╛ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдХрдВрдЯреЗрдирд░ рд▓рд╛рдЧреВ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

  • рдирд╡реАрди рдШрдЯрдХ рдШрд╛рд▓рд╛
  • рдЕрдиреБрдХреНрд░рдорд╛рдВрдХрд╛рдиреБрд╕рд╛рд░ рдШрдЯрдХ рдХрд╛рдврд╛
  • рдСрд░реНрдбрд┐рдирд▓ рдирдВрдмрд░рджреНрд╡рд╛рд░реЗ рдШрдЯрдХ рдорд┐рд│рд╡рд╛
  • рдбреЗрдЯрд╛ рдХреНрд░рдорд╡рд╛рд░реАрдд рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ

рдбреЗрдЯрд╛ рд╕рддрдд рдЬреЛрдбрд▓рд╛ рдЖрдгрд┐ рдХрд╛рдврд▓рд╛ рдЬрд╛рдд рдЖрд╣реЗ, рд╕рдВрд░рдЪрдиреЗрдиреЗ рд╡реЗрдЧрд╡рд╛рди рдСрдкрд░реЗрд╢рди рдЧрддреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдкреНрд░рдердо рдореА рдкрд╛рд╕реВрди рдорд╛рдирдХ рдХрдВрдЯреЗрдирд░ рд╡рд╛рдкрд░реВрди рдЕрд╢реА рдЧреЛрд╖реНрдЯ рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ рд╕реНрдЯрдбреА. рдпрд╛ рдорд╛рд░реНрдЧрд╛рд╡рд░ рдпрд╢рд╛рдЪрд╛ рдореБрдХреБрдЯ рдШрд╛рддрд▓реЗрд▓рд╛ рдирд╛рд╣реА рдЖрдгрд┐ рд╕рдордЬ рдЖрд▓реА рдХреА рдорд▓рд╛ рд╕реНрд╡рдд: рдХрд╛рд╣реАрддрд░реА рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдЖрд╣реЗ. рдмрд╛рдпрдирд░реА рд╢реЛрдз рд╡реГрдХреНрд╖ рд╡рд╛рдкрд░рдгреЗ рд╣реА рдПрдХрдЪ рдЧреЛрд╖реНрдЯ рдордирд╛рдд рдЖрд▓реА. рдХрд╛рд░рдг рддреЗ рдХреНрд░рдорд╡рд╛рд░реАрдд рдбреЗрдЯрд╛ рдЬрд▓рдж рдШрд╛рд▓рдгреНрдпрд╛рдЪреА, рд╣рдЯрд╡рдгреНрдпрд╛рдЪреА рдЖрдгрд┐ рд╕рд╛рдард╡рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреВрд░реНрдг рдХрд░рддреЗ. рд╕рд░реНрд╡ рдШрдЯрдХрд╛рдВрдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд╢реА рдХрд░рд╛рдпрдЪреА рдЖрдгрд┐ рдЬреЗрд╡реНрд╣рд╛ рдЭрд╛рдб рдмрджрд▓рддреЗ рддреЗрд╡реНрд╣рд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдВрдЪреА рдкреБрдирд░реНрдЧрдгрдирд╛ рдХрд╢реА рдХрд░рд╛рдпрдЪреА рд╣реЗ рд╢реЛрдзрдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ.

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.

рдкреБрдвреЗ, рдЕрд╢рд╛ рдЭрд╛рдбрд╛рдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреНрдпрд╛ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡рд╛рдХрдбреЗ рд╡рд│реВ. рдХрд╛рд│рд╛ рдиреЛрдб рдХреА рд░рдВрдЧрд╛рдд рджрд░реНрд╢рд╡рд┐рд▓реА рдЬрд╛рдИрд▓ (рдореВрд▓реНрдп рджрд░реНрд╢рд╡рд┐рд▓реЗ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА, рдХрд╛рд░рдг рд╣реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реА), рд▓рд╛рд▓ - рдЧрд╛рдареАрдЪреЗ рд╡рдЬрди, рд╣рд┐рд░рд╡рд╛ - рдиреЛрдб рдЗрдВрдбреЗрдХреНрд╕.

рдЬреЗрд╡реНрд╣рд╛ рдЖрдкрд▓реЗ рдЭрд╛рдб рд░рд┐рдХрд╛рдореЗ рдЕрд╕рддреЗ, рддреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдЪреЗ рд╡рдЬрди реж рдЕрд╕рддреЗ. рддреНрдпрд╛рдд рдореВрд│ рдШрдЯрдХ рдЬреЛрдбреВрдпрд╛:

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖

рдЭрд╛рдбрд╛рдЪреЗ рд╡рдЬрди 1 рд╣реЛрддреЗ, рдореВрд│ рдШрдЯрдХрд╛рдЪреЗ рд╡рдЬрди 1 рд╣реЛрддреЗ. рдореВрд│ рдШрдЯрдХрд╛рдЪреЗ рд╡рдЬрди рдЭрд╛рдбрд╛рдЪреЗ рд╡рдЬрди рдЕрд╕рддреЗ.

рдЪрд▓рд╛ рдЖрдгрдЦреА рдХрд╛рд╣реА рдШрдЯрдХ рдЬреЛрдбреВрдпрд╛:

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖
рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖
рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖
рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖

рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдирд╡реАрди рдШрдЯрдХ рдЬреЛрдбрд▓реНрдпрд╛рд╡рд░, рдЖрдореНрд╣реА рдиреЛрдбреНрд╕ рдЦрд╛рд▓реА рдЬрд╛рддреЛ рдЖрдгрд┐ рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдбрдЪреЗ рд╡рдЬрди рдХрд╛рдЙрдВрдЯрд░ рд╡рд╛рдврд╡рддреЛ. рдЬреЗрд╡реНрд╣рд╛ рдирд╡реАрди рдиреЛрдб рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рддреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рд▓рд╛ рдПрдХ рд╡рдЬрди рдирд┐рдпреБрдХреНрдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ 1. рдЬрд░ рдЕрд╢реА рдХреА рдЕрд╕рд▓реЗрд▓реА рдиреЛрдб рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕реЗрд▓, рддрд░ рдЖрдореНрд╣реА рдореВрд▓реНрдп рдУрд╡реНрд╣рд░рд░рд╛рдИрдЯ рдХрд░реВ рдЖрдгрд┐ рдЖрдореНрд╣реА рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рд░реНрд╡ рдиреЛрдбреНрд╕рдЪреНрдпрд╛ рд╡рдЬрдирд╛рддреАрд▓ рдмрджрд▓ рд░рджреНрдж рдХрд░реВрди рд░реВрдЯ рд╡рд░ рдкрд░рдд рдЬрд╛рдК.
рдЬрд░ рдиреЛрдб рдХрд╛рдврд▓рд╛ рдЬрд╛рдд рдЕрд╕реЗрд▓, рддрд░ рдЖрдореНрд╣реА рдЦрд╛рд▓реА рдЬрд╛рддреЛ рдЖрдгрд┐ рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдиреЛрдбреНрд╕рдЪреЗ рд╡рдЬрди рдХрдореА рдХрд░рддреЛ.

рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ

рдЖрддрд╛ рдиреЛрдбреНрд╕ рдХрд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рд╛рдпрдЪреЗ рддреЗ рдкрд╛рд╣реВ. рдиреЛрдбреНрд╕ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рддреНрдпрд╛рдВрдЪреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕рдВрдЪрдпрд┐рдд рдХрд░рдд рдирд╛рд╣реАрдд, рддреЗ рдиреЛрдбреНрд╕рдЪреНрдпрд╛ рд╡рдЬрдирд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдореЛрдЬрд▓реЗ рдЬрд╛рддреЗ. рдЬрд░ рддреНрдпрд╛рдВрдиреА рддреНрдпрд╛рдВрдЪрд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓рд╛ рдЕрд╕реЗрд▓ рддрд░ рддреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕реЗрд▓ O (n) рдЭрд╛рдбрд╛рддреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓рд╛рдирдВрддрд░ рд╕рд░реНрд╡ рдиреЛрдбреНрд╕рдЪреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рд╡реЗрд│.
рдЪрд▓рд╛ рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡рд╛рдХрдбреЗ рдЬрд╛рдКрдпрд╛. рдЖрдордЪреЗ рдЭрд╛рдб рд░рд┐рдХрд╛рдореЗ рдЖрд╣реЗ, рдЪрд▓рд╛ рддреНрдпрд╛рдд рдкрд╣рд┐рд▓рд╛ рдиреЛрдб рдЬреЛрдбреВрдпрд╛:

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖

рдкрд╣рд┐рд▓реНрдпрд╛ рдиреЛрдбрдордзреНрдпреЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЕрд╕рддреЛ 0, рдЖрдгрд┐ рдЖрддрд╛ 2 рдкреНрд░рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗрдд. рдкреНрд░рдердо, рдореВрд│ рдШрдЯрдХрд╛рдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдмрджрд▓реЗрд▓, рджреБрд╕рд▒реНрдпрд╛рдордзреНрдпреЗ рддреА рдмрджрд▓рдгрд╛рд░ рдирд╛рд╣реА.

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖

рдореБрд│рд╛рдд, рдбрд╛рд╡реНрдпрд╛ рдЙрдкрд╡реГрдХреНрд╖рд╛рдЪреЗ рд╡рдЬрди 1 рдЖрд╣реЗ.

рджреБрд╕рд░реА рдХреЗрд╕:

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖

рд░реВрдЯрдЪрд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдмрджрд▓рд▓рд╛ рдирд╛рд╣реА рдХрд╛рд░рдг рддреНрдпрд╛рдЪреНрдпрд╛ рдбрд╛рд╡реНрдпрд╛ рдЙрдкрд╡реГрдХреНрд╖рд╛рдЪреЗ рд╡рдЬрди 0 рд░рд╛рд╣рд┐рд▓реЗ.

рдиреЛрдбрдЪреНрдпрд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдЪреА рдЧрдгрдирд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рдбрд╛рд╡реНрдпрд╛ рдЙрдкрд╡реГрдХреНрд╖рд╛рдЪреЗ рд╡рдЬрди + рдкрд╛рд▓рдХрд╛рдВрдХрдбреВрди рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реА рд╕рдВрдЦреНрдпрд╛ рдореНрд╣рдгреВрди рдХреЗрд▓реА рдЬрд╛рддреЗ. рд╣реА рд╕рдВрдЦреНрдпрд╛ рдХрд╛рдп рдЖрд╣реЗ?, рд╣рд╛ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛рдЙрдВрдЯрд░ рдЖрд╣реЗ, рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рддреЛ рд╕рдорд╛рди рдЖрд╣реЗ 0, рдХрд╛рд░рдг рдореБрд│рд╛рд▓рд╛ рдкрд╛рд▓рдХ рдирд╕рддрд╛рдд. рдордЧ рд╣реЗ рд╕рд░реНрд╡ рдЖрдкрдг рдбрд╛рд╡реНрдпрд╛ рдореБрд▓рд╛рдХрдбреЗ рдХрд┐рдВрд╡рд╛ рдЙрдЬрд╡реАрдХрдбреЗ рдХреЛрдареЗ рдЦрд╛рд▓реА рдЬрд╛рддреЛ рдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЖрд╣реЗ. рдбрд╛рд╡реАрдХрдбреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдХрд╛рдЙрдВрдЯрд░рдордзреНрдпреЗ рдХрд╛рд╣реАрд╣реА рдЬреЛрдбрд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА. рдЬрд░ рдЖрдкрдг рд╡рд░реНрддрдорд╛рди рдиреЛрдбрдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЙрдЬрд╡реАрдХрдбреЗ рдЬреЛрдбрд▓реА.

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдпрдирд░реА рд╡реГрдХреНрд╖

рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреА 8 (рдореВрд│рд╛рдЪреЗ рдЙрдЬрд╡реЗ рдореВрд▓) рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдШрдЯрдХрд╛рдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд╢реА рдореЛрдЬрд▓реА рдЬрд╛рддреЗ. рд╣рд╛ "рд░реВрдЯ рдЗрдВрдбреЗрдХреНрд╕" + "рдХреА 8" + "1" рд╕рд╣ рдиреЛрдбрдЪреНрдпрд╛ рдбрд╛рд╡реНрдпрд╛ рд╕рдмрдЯреНрд░реАрдЪреЗ рд╡рдЬрди рдЖрд╣реЗ == 3 + 2 + 1 == 6
рдХреА 6 рд╕рд╣ рдШрдЯрдХрд╛рдЪреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ "рд░реВрдЯ рдЗрдВрдбреЗрдХреНрд╕" + 1 == 3 + 1 == рдЕрд╕реЗрд▓. 4

рддреНрдпрд╛рдиреБрд╕рд╛рд░, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдиреБрд╕рд╛рд░ рдШрдЯрдХ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╣рдЯрд╡рдгреНрдпрд╛рд╕ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ рдУ (рд▓реЙрдЧ рдПрди), рдХрд╛рд░рдг рдЗрдЪреНрдЫрд┐рдд рдШрдЯрдХ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдкрдг рдкреНрд░рдердо рддреЗ рд╢реЛрдзрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ (рдореВрд│рд╛рдкрд╛рд╕реВрди рдпрд╛ рдШрдЯрдХрд╛рдХрдбреЗ рдЬрд╛).

рдЦреЛрд▓реА

рд╡рдЬрдирд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд, рдЖрдкрдг рдЭрд╛рдбрд╛рдЪреА рдЦреЛрд▓реА рджреЗрдЦреАрд▓ рдореЛрдЬреВ рд╢рдХрддрд╛. рд╕рдорддреЛрд▓ рд░рд╛рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ.
рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╡рд░реНрддрдорд╛рди рдиреЛрдбрдЪреЗ рд╡рдЬрди рдкрд╣рд┐рд▓реНрдпрд╛ рдХреНрд░рдорд╛рдВрдХрд╛рд╡рд░ 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));
}

рдкрд░рд┐рдгрд╛рдо

  • рдордзреНрдпреЗ рдирд╡реАрди рдШрдЯрдХ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЙрджреНрднрд╡рддреЗ рдУ (рд▓реЙрдЧ рдПрди)
  • рдЕрдиреБрдХреНрд░рдорд╛рдВрдХрд╛рдиреБрд╕рд╛рд░ рдШрдЯрдХ рд╣рдЯрд╡рдгреЗ рдордзреНрдпреЗ рдпреЗрддреЗ рдУ (рд▓реЙрдЧ рдПрди)
  • рдЕрдиреБрдХреНрд░рдорд╛рдВрдХрд╛рджреНрд╡рд╛рд░реЗ рдШрдЯрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреЗ рдордзреНрдпреЗ рдпреЗрддреЗ рдУ (рд▓реЙрдЧ рдПрди)

рдЧрддреА рдУ (рд▓реЙрдЧ рдПрди) рдЖрдореНрд╣реА рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрд╕рд╛рдареА рдкреИрд╕реЗ рджреЗрддреЛ рдХреА рд╕рд░реНрд╡ рдбреЗрдЯрд╛ рдХреНрд░рдорд╡рд╛рд░реАрдд рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рддреЛ.

рдЕрд╢реА рд░рдЪрдирд╛ рдХреБрдареЗ рдЙрдкрдпреЛрдЧреА рдкрдбреЗрд▓ рд╣реЗ рдорд▓рд╛ рдорд╛рд╣реАрдд рдирд╛рд╣реА. рдЭрд╛рдбреЗ рдХрд╢реА рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рд╣реЗ рдкреБрдиреНрд╣рд╛ рдПрдХрджрд╛ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдлрдХреНрдд рдПрдХ рдХреЛрдбреЗ. рдЖрдкрдг рд▓рдХреНрд╖ рджрд┐рд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж.

рд╕рдВрджрд░реНрдн

рдкреНрд░рдХрд▓реНрдкрд╛рдордзреНрдпреЗ рдСрдкрд░реЗрд╢рдирдЪреА рдЧрддреА рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЪрд╛рдЪрдгреА рдбреЗрдЯрд╛ рдЖрд╣реЗ. рдЭрд╛рдб рднрд░рдд рдЖрд╣реЗ 1000000 рдШрдЯрдХ. рдЖрдгрд┐ рдШрдЯрдХрд╛рдВрдЪреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╣рдЯрд╡рдгреЗ, рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрдгрд┐ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдгреЗ рдЖрд╣реЗ 1000000 рдПрдХрджрд╛ рддреЗ рдЖрд╣реЗ 3000000 рдСрдкрд░реЗрд╢рдиреНрд╕ рдкрд░рд┐рдгрд╛рдо рдЦреВрдк рдЪрд╛рдВрдЧрд▓рд╛ ~ 8 рд╕реЗрдХрдВрдж рдирд┐рдШрд╛рд▓рд╛.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛