lāʻau binary i kuhikuhi ʻia

lāʻau binary i kuhikuhi ʻia

Ua loaʻa iaʻu kēia ʻano pilikia. Pono e hoʻokō i kahi pahu mālama data e hāʻawi ana i kēia mau hana:

  • hoʻokomo i ka mea hou
  • wehe i ka mea ma ka helu serial
  • loaʻa i ka mea ma ka helu ordinal
  • mālama ʻia ka ʻikepili ma ke ʻano koho

Hoʻohui mau ʻia ka ʻikepili a hoʻoneʻe ʻia, pono e hōʻoia ka hana i ka wikiwiki o ka hana. I ka wā mua ua ho'āʻo wau e hoʻokō i ia mea me ka hoʻohana ʻana i nā ipu maʻamau mai ok. ʻAʻole i lei ʻia kēia ala me ka holomua a ua hiki mai ka ʻike e pono iaʻu e hoʻokō i kekahi mea iaʻu iho. ʻO ka mea wale nō i komo i ka noʻonoʻo ʻo ka hoʻohana ʻana i kahi lāʻau huli binary. No ka mea e hoʻokō i ke koi o ka hoʻokomo wikiwiki ʻana, ka holoi ʻana a me ka mālama ʻana i nā ʻikepili ma ke ʻano i hoʻokaʻawale ʻia. ʻO nā mea a pau i koe e noʻonoʻo pehea e kuhikuhi ai i nā mea a pau a helu hou i nā helu i ka wā e loli ai ka lāʻau.

struct node_s {    
    data_t data;

    uint64_t weight; // вес узла

    node_t *left;
    node_t *right;

    node_t *parent;
};

E loaʻa i ka ʻatikala nā kiʻi a me ke kumumanaʻo ma mua o ke code. Hiki ke ʻike ʻia ke code ma ka loulou ma lalo nei.

ʻO ke kaumaha

No ka hoʻokō ʻana i kēia, ua hoʻololi iki ka lāʻau, ua hoʻohui ʻia ka ʻike hou aku e pili ana kaumaha node. ʻO ke kaumaha o ka node helu o na mamo o keia node + 1 (kaumaha o ka mea hookahi).

Hana no ka loaʻa ʻana o ke kaumaha node:

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

    return 0;
}

Ua like ke kaumaha o ka pepa me 0.

A laila, e neʻe kākou i kahi hiʻohiʻona ʻike o kahi laʻana o ia lāʻau. ʻeleʻele e hōʻike ʻia ke kī node i ke kala (ʻaʻole e hōʻike ʻia ka waiwai, no ka mea ʻaʻole pono kēia), i ʻulaʻula - kaumaha puʻupuʻu, ʻōmaʻomaʻo — helu kuhikuhi node.

Ke haʻahaʻa kā mākou kumulāʻau, ʻo 0 kona kaumaha. E hoʻohui kākou i kahi kumu kumu iā ia:

lāʻau binary i kuhikuhi ʻia

Lilo ke kaumaha o ke kumu i 1, lilo ke kaumaha o ke kumu i 1. ʻO ke kaumaha o ke kumu kumu ke kaumaha o ka lāʻau.

E hoʻohui i kekahi mau mea hou aʻe:

lāʻau binary i kuhikuhi ʻia
lāʻau binary i kuhikuhi ʻia
lāʻau binary i kuhikuhi ʻia
lāʻau binary i kuhikuhi ʻia

I kēlā me kēia manawa e hoʻohui ʻia kahi mea hou, e iho mākou i lalo i nā node a hoʻonui i ka helu paona o kēlā me kēia node i hala. Ke hana ʻia kahi node hou, hāʻawi ʻia kahi paona iā ia 1. Inā loaʻa kahi node me ia kī, a laila e kākau hou mākou i ka waiwai a hoʻi i luna i ke kumu, e kāpae ana i nā loli i nā paona o nā nodes a pau i hala.
Inā wehe ʻia kahi node, a laila iho mākou i lalo a hoʻemi i nā paona o nā node i hala.

Papa Kuhikuhi

I kēia manawa e neʻe kākou i ka pehea e kuhikuhi ai i nā nodes. ʻAʻole mālama pono nā nodes i kā lākou papa kuhikuhi, ua helu ʻia ma muli o ke kaumaha o nā nodes. Inā mālama lākou i kā lākou index, a laila pono ia ʻO (n) manawa e hoʻololi i nā kuhikuhi o nā nodes a pau ma hope o kēlā me kēia hoʻololi i ka lāʻau.
E neʻe kākou i kahi hōʻike kiʻi. ʻAʻohe kā mākou kumu lāʻau, e hoʻohui i ka node 1 iā ia:

lāʻau binary i kuhikuhi ʻia

Loaʻa i ka node mua kahi kuhikuhi 0, a hiki i kēia manawa 2 mau hihia. I ka mua, e loli ka index o ke kumu kumu, i ka lua ʻaʻole ia e loli.

lāʻau binary i kuhikuhi ʻia

Ma ke kumu, he 1 ke kaumaha o ka subtree hema.

ʻO ka hihia ʻelua:

lāʻau binary i kuhikuhi ʻia

ʻAʻole i loli ka papa kuhikuhi o ke kumu no ka mea he 0 ke kaumaha o kona kumulāʻau hema.

Ua helu ʻia ka papa kuhikuhi o kahi node e like me ke kaumaha o kāna kumulāʻau hema + ka helu i hala mai ka makua. He aha kēia helu?, ʻO kēia ka helu helu helu, i ka mua ua like ia me 0, no ka mea ʻaʻohe makua o ke kumu. A laila pili ia i kahi e iho ai mākou i ke keiki hema a i ʻole ke keiki ʻākau. Inā ma ka hema, ʻaʻohe mea i hoʻohui ʻia i ka counter. Inā mākou e hoʻohui i ka index o ka node o kēia manawa i ka ʻākau.

lāʻau binary i kuhikuhi ʻia

No ka laʻana, pehea e helu ʻia ai ka papa kuhikuhi o kahi mea me ke kī 8 (ke keiki ʻākau o ke kumu). ʻO kēia ka "Root Index" + "kaumaha o ka subtree hema o ka node me ke kī 8" + "1" == 3 + 2 + 1 == 6
ʻO ka papa kuhikuhi o ka mea me ke kī 6 ʻo ia ka "Root Index" + 1 == 3 + 1 == 4

No laila, pono ka manawa e kiʻi a holoi i kahi mea e ka index ʻO (ʻeʻe n), no ka loaʻa ʻana o ka mea i makemake ʻia e loaʻa mua iā mākou (e iho i lalo mai ke kumu a hiki i kēia mea).

Hōʻike

Ma muli o ke kaumaha, hiki iā ʻoe ke helu i ka hohonu o ka lāʻau. Pono no ke kaulike.
No ka hana ʻana i kēia, pono e hoʻopuni ʻia ke kaumaha o ka node o kēia manawa i ka helu mua i ka mana o 2 i ʻoi aku ka nui a i ʻole like me ka paona i hāʻawi ʻia a lawe i ka logarithm binary mai ia mea. Hāʻawi kēia iā mākou i ka hohonu o ka lāʻau, me ka manaʻo he kaulike. Kaulike ka lāʻau ma hope o ka hoʻokomo ʻana i kahi mea hou. ʻAʻole wau e hāʻawi i ka manaʻo e pili ana i ke kaulike ʻana i nā lāʻau. Hāʻawi nā code kumu i kahi hana kaulike.

Code no ka hoʻololi ʻana i ke kaumaha i ka hohonu.

/*
 * Возвращает первое число в степени 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));
}

Nā hopena

  • hoʻokomo ʻia kahi mea hou i loko ʻO (ʻeʻe n)
  • e holoi ana i kekahi mea ma ka helu serial ʻO (ʻeʻe n)
  • ka loaʻa ʻana o kahi mea ma ka helu serial ʻO (ʻeʻe n)

Ka māmā holo ʻO (ʻeʻe n) Uku mākou no ka mālama ʻia ʻana o nā ʻikepili a pau ma ke ʻano i koho ʻia.

ʻAʻole maopopo iaʻu kahi e pono ai kēlā ʻano hana. He puʻupuʻu wale nō e hoʻomaopopo hou i ka hana ʻana o nā lāʻau. Mahalo no kou noonoo.

kūmole

Aia ka papahana i ka ʻikepili hoʻāʻo e nānā i ka wikiwiki o ka hana. Ke piha nei ka laau 1000000 mau mea. A aia kahi holoi ʻana, hoʻokomo a hoʻihoʻi i nā mea 1000000 pākahi. ʻo ia 3000000 nā hana. Ua maikaʻi loa ka hopena ~ 8 kekona.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka