рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдЗрдирд░реА рдЯреНрд░реА

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдЗрдирд░реА рдЯреНрд░реА

рдореБрдЭреЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдПрдХ рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг рдХрдВрдЯреЗрдирд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

  • рдирдпрд╛ рддрддреНрд╡ рдбрд╛рд▓реЗрдВ
  • рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡ рд╣рдЯрд╛рдПрдБ
  • рдХреНрд░рдорд┐рдХ рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
  • рдбреЗрдЯрд╛ рдХреЛ рдХреНрд░рдордмрджреНрдз рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдбреЗрдЯрд╛ рд▓рдЧрд╛рддрд╛рд░ рдЬреЛрдбрд╝рд╛ рдФрд░ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╕рдВрд░рдЪрдирд╛ рдХреЛ рддреЗрдЬрд╝ рд╕рдВрдЪрд╛рд▓рди рдЧрддрд┐ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдорд╛рдирдХ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реА рдЪреАрдЬрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдПрд╕рдЯреАрдбреА. рдЗрд╕ рдкрде рдХреЛ рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ рдорд┐рд▓реА рдФрд░ рдпрд╣ рд╕рдордЭ рдЖрдИ рдХрд┐ рдореБрдЭреЗ рд╕реНрд╡рдпрдВ рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдИ рд╡рд╣ рдереА рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ рдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреНрд░рдордмрджреНрдз рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рддреЗрдЬреА рд╕реЗ рд╕рдореНрдорд┐рд▓рди, рд╡рд┐рд▓реЛрдкрди рдФрд░ рднрдВрдбрд╛рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рдЬреЛ рдХреБрдЫ рдмрдЪрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдХреИрд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдкреЗрдбрд╝ рдмрджрд▓рдиреЗ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдкреБрдирд░реНрдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рдПред

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. рдпрджрд┐ рдРрд╕реА рдХреБрдВрдЬреА рд╡рд╛рд▓рд╛ рдХреЛрдИ рдиреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╣рдо рдорд╛рди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рд░реВрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВрдЧреЗ, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рд╕рднреА рдиреЛрдбреНрд╕ рдХреЗ рд╡рдЬрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрдВрдЧреЗред
рдпрджрд┐ рдХреЛрдИ рдиреЛрдб рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╣рдо рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рд░рд┐рдд рдиреЛрдбреНрд╕ рдХрд╛ рд╡рдЬрди рдХрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рд╕реВрдЪрдХрд╛рдВрдХ

рдЕрдм рдЖрдЗрдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдХрд┐ рдиреЛрдбреНрд╕ рдХреЛ рдХреИрд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдиреЛрдбреНрд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рдЧрдгрдирд╛ рдиреЛрдбреНрд╕ рдХреЗ рд╡рдЬрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдирд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛, рддреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдкрд░) рдкреЗрдбрд╝ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рд╕рднреА рдиреЛрдбреНрд╕ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХрд╛ рд╕рдордпред
рдЖрдЗрдП рдПрдХ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдУрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред рд╣рдорд╛рд░рд╛ рдкреЗрдбрд╝ рдЦрд╛рд▓реА рд╣реИ, рдЖрдЗрдП рдЗрд╕рдореЗрдВ рдкрд╣рд▓рд╛ рдиреЛрдб рдЬреЛрдбрд╝реЗрдВ:

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдЗрдирд░реА рдЯреНрд░реА

рдкрд╣рд▓реЗ рдиреЛрдб рдореЗрдВ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рд╣реЛрддрд╛ рд╣реИ 0, рдФрд░ рдЕрдм 2 рдорд╛рдорд▓реЗ рд╕рдВрднрд╡ рд╣реИрдВред рдкрд╣рд▓реЗ рдореЗрдВ, рдореВрд▓ рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рджреВрд╕рд░реЗ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдЗрдирд░реА рдЯреНрд░реА

рдЬрдбрд╝ рдкрд░, рдмрд╛рдПрдБ рдЙрдкрд╡реГрдХреНрд╖ рдХрд╛ рд╡рдЬрди 1 рд╣реИред

рджреВрд╕рд░рд╛ рдорд╛рдорд▓рд╛:

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдЗрдирд░реА рдЯреНрд░реА

рдЬрдбрд╝ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдирд╣реАрдВ рдмрджрд▓рд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рдПрдБ рдЙрдкрд╡реГрдХреНрд╖ рдХрд╛ рднрд╛рд░ 0 рд░рд╣рд╛ред

рдХрд┐рд╕реА рдиреЛрдб рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдЙрд╕рдХреЗ рдмрд╛рдПрдВ рдЙрдкрдЯреНрд░реА рдХреЗ рд╡рдЬрди + рдореВрд▓ рд╕реЗ рдкрд╛рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдХреНрдпрд╛ рд╣реИ?, рдпрд╣ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛рдЙрдВрдЯрд░ рд╣реИ, рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдпрд╣ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ 0, рдХреНрдпреЛрдВрдХрд┐ рдЬрдбрд╝ рдХрд╛ рдХреЛрдИ рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛. рдлрд┐рд░ рдпрд╣ рд╕рдм рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдмрд╛рдПрдВ рдмрдЪреНрдЪреЗ рдХреА рдУрд░ рдХрд╣рд╛рдВ рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рджрд╛рдИрдВ рдУрд░ред рдпрджрд┐ рдмрд╛рдИрдВ рдУрд░, рддреЛ рдХрд╛рдЙрдВрдЯрд░ рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рджрд╛рдИрдВ рдУрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЕрдиреБрдХреНрд░рдорд┐рдд рдмрд╛рдЗрдирд░реА рдЯреНрд░реА

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдВрдЬреА 8 (рд░реВрдЯ рдХрд╛ рджрд╛рдпрд╛рдВ рдмрдЪреНрдЪрд╛) рд╡рд╛рд▓реЗ рддрддреНрд╡ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ "рд░реВрдЯ рдЗрдВрдбреЗрдХреНрд╕" + "рдХреБрдВрдЬреА 8 рдХреЗ рд╕рд╛рде рдиреЛрдб рдХреЗ рдмрд╛рдПрдВ рдЙрдкрд╡реГрдХреНрд╖ рдХрд╛ рд╡рдЬрди" + "1" == 3 + 2 + 1 == рд╣реИ 6
рдХреБрдВрдЬреА 6 рд╡рд╛рд▓реЗ рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ "рд░реВрдЯ рдЗрдВрдбреЗрдХреНрд╕" + 1 == 3 + 1 == рд╣реЛрдЧрд╛ 4

рддрджрдиреБрд╕рд╛рд░, рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ O (рд▓реЙрдЧ рдПрди), рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдЙрд╕реЗ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ (рдореВрд▓ рд╕реЗ рдЗрд╕ рддрддреНрд╡ рддрдХ рдиреАрдЪреЗ рдЬрд╛рдПрдВ)ред

рдЧрд╣рд░рд╛рдИ

рд╡рдЬрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдк рдкреЗрдбрд╝ рдХреА рдЧрд╣рд░рд╛рдИ рдХреА рдЧрдгрдирд╛ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрддреБрд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ.
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреЗ рд╡рдЬрди рдХреЛ рдкрд╣рд▓реЗ рдирдВрдмрд░ рдкрд░ 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 (рд▓реЙрдЧ рдПрди)
  • рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдирд╛ рдШрдЯрд┐рдд рд╣реЛрддрд╛ рд╣реИ O (рд▓реЙрдЧ рдПрди)
  • рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ O (рд▓реЙрдЧ рдПрди)

рд░рдлрд╝реНрддрд╛рд░ O (рд▓реЙрдЧ рдПрди) рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рдХреНрд░рдордмрджреНрдз рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред

рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХрд╣рд╛рдБ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдпрд╣ рд╕рдордЭрдирд╛ рдПрдХ рдкрд╣реЗрд▓реА рд╣реИ рдХрд┐ рдкреЗрдбрд╝ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЧрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдкреЗрдбрд╝ рднрд░ рд░рд╣рд╛ рд╣реИ 1000000 рддрддреНрд╡. рдФрд░ рддрддреНрд╡реЛрдВ рдХрд╛ рдХреНрд░рдорд┐рдХ рд╡рд┐рд▓реЛрдкрди, рд╕рдореНрдорд┐рд▓рди рдФрд░ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рд╣реЛрддреА рд╣реИ 1000000 рдПрдХ рдмрд╛рд░ред рд╡рд╣ рд╣реИ 3000000 рдкрд░рд┐рдЪрд╛рд▓рди. рдирддреАрдЬрд╛ ~8 рд╕реЗрдХрдВрдб рдореЗрдВ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдирд┐рдХрд▓рд╛ред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ