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

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

рдореИрд▓реЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░рдХреЛ рд╕рдорд╕реНрдпрд╛ рднреЗрдЯреНрдЯрд╛рдПрдБред рдпреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░реНрдпрддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрдиреЗ рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдХрдиреНрдЯреЗрдирд░ рд▓рд╛рдЧреВ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

  • рдирдпрд╛рдБ рддрддреНрд╡ рдШреБрд╕рд╛рдЙрдиреБрд╣реЛрд╕реН
  • рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡ рд╣рдЯрд╛рдЙрдиреБрд╣реЛрд╕реН
  • рдХреНрд░рдорд┐рдХ рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рдбреЗрдЯрд╛ рдХреНрд░рдордмрджреНрдз рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░ рдЧрд░рд┐рдПрдХреЛ рдЫ

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

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

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛

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

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

рдкрд╣рд┐рд▓реЛ рдиреЛрдб рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдЫ 0, рд░ рдЕрдм 2 рдХреЗрд╕рд╣рд░реВ рд╕рдореНрднрд╡ рдЫрдиреНред рдкрд╣рд┐рд▓реЛрдорд╛, рдореВрд▓ рддрддреНрд╡рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреЗрдЫ, рджреЛрд╕реНрд░реЛрдорд╛ рдпреЛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреЗрдЫреИрдиред

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

рдЬрд░рд╛рдорд╛, рдмрд╛рдпрд╛рдБ рд╕рдмрдЯреНрд░реАрдХреЛ рддреМрд▓ рез рд╣реБрдиреНрдЫред

рджреЛрд╕реНрд░реЛ рдорд╛рдорд▓рд╛:

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

рд░реВрдЯрдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрди рдХрд┐рдирднрдиреЗ рдпрд╕рдХреЛ рдмрд╛рдпрд╛рдБ рд╕рдмрдЯреНрд░реАрдХреЛ рд╡рдЬрди реж рд░рд╣реНрдпреЛред

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

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

рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдХреБрдЮреНрдЬреА 8 (рдореВрд▓рдХреЛ рджрд╛рдпрд╛рдБ рдмрдЪреНрдЪрд╛) рднрдПрдХреЛ рддрддреНрд╡рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХрд╕рд░реА рдЧрдгрдирд╛ рдЧрд░рд┐рдиреНрдЫред рдпреЛ рд╣реЛ "рд░реВрдЯ рдЗрдиреНрдбреЗрдХреНрд╕" + "рдХреБрдЮреНрдЬреА рео" + "рез" == рей + реи + рез == рдиреЛрдбрдХреЛ рдмрд╛рдпрд╛рдБ рд╕рдмрдЯреНрд░реАрдХреЛ рд╡рдЬрди 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди