Pehea e hana ai nā ʻikepili pili (Mahele 1)

Aloha, Habr! Ke hāʻawi aku nei au iā ʻoe i kahi unuhi o ka ʻatikala
"Pehea e hana ai kahi waihona pili".

I ka wā e pili ana i nā ʻikepili pili ʻaʻole hiki iaʻu ke noʻonoʻo ua nalowale kekahi mea. Hoʻohana ʻia lākou ma nā wahi āpau. Nui nā ʻikepili like ʻole i loaʻa, mai ka SQLite liʻiliʻi a pono hoʻi i ka Teradata ikaika. Akā he mau ʻatikala wale nō e wehewehe i ka hana ʻana o ka waihona. Hiki iā ʻoe ke ʻimi iā ʻoe iho me ka "howdoesarelationaldatabasework" e ʻike i ka liʻiliʻi o nā hopena. Eia kekahi, pōkole kēia mau ʻatikala. Inā ʻoe e ʻimi nei i nā ʻenehana buzzy hou loa (BigData, NoSQL a i ʻole JavaScript), e ʻike ʻoe i nā ʻatikala hohonu hou aʻe e wehewehe ana i kā lākou hana.

He ʻelemakule loa nā ʻikepili pili i ka wehewehe ʻana ma waho o nā papa kulanui, nā pepa noiʻi a me nā puke?

Pehea e hana ai nā ʻikepili pili (Mahele 1)

Ma ke ʻano he mea hoʻomohala, inaina wau i ka hoʻohana ʻana i kahi mea aʻu i maopopo ʻole ai. A inā ua hoʻohana ʻia nā ʻikepili ma mua o 40 mau makahiki, pono ke kumu. I loko o nā makahiki, ua hoʻohana wau i mau haneli mau hola e hoʻomaopopo maoli i kēia mau pahu ʻeleʻele ʻē aʻe aʻu e hoʻohana ai i kēlā me kēia lā. ʻIkepili pili hoihoi loa no ka mea ma muli o nā manaʻo pono a hoʻohana hou ʻia. Inā makemake ʻoe i ka hoʻomaopopo ʻana i kahi waihona, akā ʻaʻole i loaʻa ka manawa a i ʻole ka makemake e komo i kēia kumuhana ākea, pono ʻoe e hauʻoli i kēia ʻatikala.

ʻOiai maopopo ke poʻo o kēia ʻatikala, ʻO ke kumu o kēia ʻatikala ʻaʻole ia e hoʻomaopopo i ka hoʻohana ʻana i ka waihona. No laila, pono ʻoe e ʻike pehea e kākau ai i kahi noi pili maʻalahi a me nā nīnau kumu RAW; a i ʻole, ʻaʻole maopopo ʻoe i kēia ʻatikala. ʻO ia wale nō ka mea e pono ai ʻoe e ʻike, e wehewehe wau i ke koena.

E hoʻomaka wau me kekahi mau kumu ʻepekema kamepiula, e like me ka paʻakikī o ka manawa o nā algorithms (BigO). ʻIke wau i kekahi o ʻoukou inaina i kēia manaʻo, akā inā ʻaʻole hiki iā ʻoe ke hoʻomaopopo i nā mea paʻakikī i loko o ka waihona. No ka mea, he kumuhana nui keia, E kālele ana au ka mea a'u i manao ai he mea nui: pehea ka hana o ka waihona SQL ninau. E hoʻolauna wale wau nā manaʻo waihona waihonano laila ma ka hopena o ka ʻatikala e loaʻa iā ʻoe kahi manaʻo o ka mea e hana nei ma lalo o ka pā.

No ka mea he ʻatikala lōʻihi a ʻenehana kēia e pili ana i ka nui o nā algorithms a me nā hoʻolālā data, e lawe i kou manawa e heluhelu ai. Paʻakikī paha ke hoʻomaopopo ʻana i kekahi mau manaʻo; hiki iā ʻoe ke hoʻokuʻu iā lākou a loaʻa mau ka manaʻo nui.

No ka poʻe ʻike i waena o ʻoukou, ua māhele ʻia kēia ʻatikala i 3 mau ʻāpana:

  • ʻO ka nānā nui o nā mea haʻahaʻa haʻahaʻa a me ka pae kiʻekiʻe
  • Nānā o ke kaʻina hana hoʻoponopono nīnau
  • ʻO ka nānā ʻana o ka hoʻokele waiwai a me ka Buffer Pool

Hoʻi i nā kumu

I nā makahiki i hala aku nei (ma kahi galaxy mamao, mamao loa ...), pono e ʻike pono nā mea hoʻomohala i ka helu o nā hana a lākou e hoʻopili nei. Ua ʻike lākou i kā lākou algorithms a me nā hoʻonohonoho ʻikepili ma ka puʻuwai no ka mea ʻaʻole hiki iā lākou ke hoʻopau i ka CPU a me ka hoʻomanaʻo ʻana i kā lākou kamepiula lohi.

Ma kēia ʻāpana, e hoʻomanaʻo wau iā ʻoe i kekahi o kēia mau manaʻo no ka mea he mea nui ia i ka hoʻomaopopo ʻana i ka waihona. E hoʻolauna pū wau i ka manaʻo waihona waihona.

O(1) vs O(n2)

I kēia mau lā, nui nā mea hoʻomohala ʻaʻole mālama i ka paʻakikī o ka manawa o nā algorithms ... a ua pololei lākou!

Akā inā pili ʻoe i ka ʻikepili he nui (ʻaʻole wau e kamaʻilio mau tausani) a inā ʻoe e hakakā nei i nā milliseconds, lilo ia i mea koʻikoʻi e hoʻomaopopo i kēia manaʻo. A e like me kāu e noʻonoʻo ai, pono nā ʻikepili i nā kūlana ʻelua! ʻAʻole wau e hoʻolilo iā ʻoe i kahi manawa hou aʻe ma mua o ka mea e pono ai e kiʻi i ka manaʻo. E kōkua kēia iā mākou e hoʻomaopopo i ka manaʻo o ka loiloi kumu kūʻai ma hope (kāki ka nānā ' hiʻona).

Kuhi

Paʻakikī manawa o ka algorithm hoʻohana e ʻike i ka lōʻihi o kahi algorithm e hoʻopau ai no ka nui o ka ʻikepili. No ka wehewehe ʻana i kēia paʻakikī, hoʻohana mākou i ka helu makemakika nui O. Hoʻohana ʻia kēia notation me kahi hana e wehewehe ana i ka nui o nā hana e pono ai kahi algorithm no kahi helu o nā mea hoʻokomo.

No ka laʻana, i kaʻu ʻōlelo ʻana "he paʻakikī kēia algorithm O (some_function ())", ʻo ia ka mea e koi ai ka algorithm i kekahi hana_function (a_certain_amount_of_data) e hana i kahi nui o ka ʻikepili.

pela ʻAʻole ka nui o ka ʻikepili ka mea nui**, i ole ia ** pehea e hoʻonui ai ka nui o nā hana me ka hoʻonui ʻana i ka nui o ka ʻikepili. ʻAʻole hāʻawi ka paʻakikī o ka manawa i ka helu pololei o nā hana, akā he ala maikaʻi ia e koho ai i ka manawa hoʻokō.

Pehea e hana ai nā ʻikepili pili (Mahele 1)

Ma kēia pakuhi hiki iā ʻoe ke ʻike i ka helu o nā hana me ka nui o ka ʻikepili hoʻokomo no nā ʻano like ʻole o ka algorithm manawa paʻakikī. Ua hoʻohana au i ka unahi logarithmic e hōʻike iā lākou. I nā huaʻōlelo ʻē aʻe, piʻi koke ka nui o ka ʻikepili mai ka 1 a hiki i ka 1 biliona. Hiki iā mākou ke ʻike i kēlā:

  • ʻO (1) a i ʻole ka paʻakikī mau e mau ana (inā ʻaʻole e kapa ʻia ʻo ia ka paʻakikī mau).
  • O(mōʻaukala(n)) noho haʻahaʻa me nā piliona ʻikepili.
  • ʻO ka pilikia nui loa - O(n2), kahi e ulu wikiwiki ai ka nui o na hana.
  • Piʻi aʻe nā pilikia ʻelua e like me ka wikiwiki.

examples

Me ka liʻiliʻi o ka ʻikepili, hiki ʻole ke ʻokoʻa ma waena o O(1) a me O(n2). No ka laʻana, e ʻōlelo mākou he algorithm kāu e pono ai e hoʻoponopono i nā mea 2000.

  • ʻO ka algorithm O(1) e uku iā ʻoe i 1 hana
  • ʻO ka O(log(n)) algorithm e uku iā ʻoe i 7 mau hana
  • E lilo ana ka O(n) algorithm iā ʻoe i 2 mau hana
  • ʻO ka algorithm O(n*log(n)) e uku iā ʻoe i 14 mau hana
  • ʻO ka algorithm O(n2) e uku iā ʻoe i 4 mau hana

ʻO ka ʻokoʻa ma waena o O(1) a me O(n2) me he mea lā nui (4 miliona mau hana) akā e nalowale ana ʻoe i ka 2 ms ka lōʻihi, ʻo ka manawa wale nō e ʻapo ai kou mau maka. ʻOiaʻiʻo, hiki i nā mea hana hou ke hana he mau haneli miliona mau hana i kekona. ʻO kēia ke kumu ʻaʻole pilikia ka hana a me ka loiloi i nā papahana IT he nui.

E like me kaʻu i ʻōlelo ai, he mea nui ia e ʻike i kēia manaʻo i ka wā e hana ai me ka nui o ka ʻikepili. Inā i kēia manawa e hoʻoponopono ka algorithm i nā mea 1 (ʻaʻole ia he nui no kahi waihona):

  • ʻO ka algorithm O(1) e uku iā ʻoe i 1 hana
  • ʻO ka O(log(n)) algorithm e uku iā ʻoe i 14 mau hana
  • ʻO ka algorithm O(n) e uku iā ʻoe i 1 mau hana
  • ʻO ka algorithm O(n*log(n)) e uku iā ʻoe i 14 mau hana
  • ʻO ka algorithm O(n2) e uku iā ʻoe i 1 mau hana.

ʻAʻole wau i hana i ka makemakika, akā e ʻōlelo wau me ka algorithm O(n2) loaʻa iā ʻoe ka manawa e inu ai i kahi kofe (ʻelua paha!). Inā hoʻohui ʻoe i kahi 0 hou i ka nui o ka ʻikepili, e loaʻa iā ʻoe ka manawa e hiamoe ai.

E hele hohonu kākou

No kaʻike:

  • ʻIke ʻia ka ʻimi papaʻaina hash maikaʻi i kahi mea ma O(1).
  • ʻO ka ʻimi ʻana i kahi lāʻau kaulike maikaʻi e hoʻopuka i nā hopena ma O(log(n)).
  • ʻO ka huli ʻana i kahi laʻana e loaʻa ai nā hopena ma O(n).
  • Loaʻa ka paʻakikī O (n*log(n)) nā algorithms sorting maikaʻi loa.
  • He paʻakikī O(n2) ka algorithm sorting maikaʻi ʻole.

'Ōlelo Aʻo: Ma nā ʻāpana aʻe e ʻike mākou i kēia mau algorithm a me nā hoʻonohonoho ʻikepili.

Aia kekahi mau ʻano o ka paʻakikī manawa algorithm:

  • kūlana hihia maʻamau
  • ʻo ke kūlana maikaʻi loa
  • a me ke kūlana ʻino loa

ʻO ka paʻakikī o ka manawa ka mea ʻino loa.

Ke kamaʻilio wale nei wau e pili ana i ka paʻakikī o ka manawa o ka algorithm, akā pili pū ka paʻakikī i:

  • hoʻohana hoʻomanaʻo o ka algorithm
  • disk I/O hoʻohana algorithm

ʻOiaʻiʻo, aia nā pilikia i ʻoi aku ka maikaʻi ma mua o n2, no ka laʻana:

  • n4: weliweli kēia! ʻO kekahi o nā algorithms i ʻōlelo ʻia he paʻakikī kēia.
  • 3n: ʻoi aku ka ʻino o kēia! ʻO kekahi o nā algorithms a mākou e ʻike ai ma waena o kēia ʻatikala he paʻakikī kēia (a ua hoʻohana maoli ʻia i nā ʻikepili he nui).
  • factorial n: ʻaʻole loaʻa ʻoe i kāu mau hopena me ka liʻiliʻi o ka ʻikepili.
  • nn: Inā ʻike ʻoe i kēia paʻakikī, pono ʻoe e nīnau iā ʻoe iho inā ʻo kēia kāu kahua hana...

'Ōlelo Aʻo: ʻAʻole wau i hāʻawi iā ʻoe i ka wehewehe maoli o ka inoa O nui, he manaʻo wale nō. Hiki iā ʻoe ke heluhelu i kēia ʻatikala ma ʻO Wikipedia no ka wehewehe maoli (asymptotic).

MergeSort

He aha kāu e hana ai inā pono ʻoe e hoʻokaʻawale i kahi hōʻiliʻili? He aha? Kāhea ʻoe i ka hana ʻano () ... ʻAe, pane maikaʻi ... Akā no kahi waihona, pono ʻoe e hoʻomaopopo i ka hana ʻana o kēia ʻano ().

Aia kekahi mau algorithms sorting maikaʻi, no laila e nānā au i ka mea nui loa: hoʻohui ʻano. ʻAʻole paha ʻoe e maopopo i ke kumu e pono ai ka hoʻokaʻawale ʻana i ka ʻikepili i kēia manawa, akā pono ʻoe ma hope o ka ʻāpana hulina hulina. Eia kekahi, ʻo ka hoʻomaopopo ʻana i ke ʻano merge e kōkua iā mākou e hoʻomaopopo i ka hana hoʻohui maʻamau i kapa ʻia Ho'ohui hui (hui hui).

Hoʻohui

E like me ka nui o nā algorithms pono, e hilinaʻi ana ka hoʻohui ʻana i kahi hoʻopunipuni: ʻo ka hui ʻana i 2 mau pūʻulu i hoʻokaʻawale ʻia o ka nui N/2 i loko o kahi papa kuhikuhi N-element e kūʻai i nā hana N wale nō. Kapa ʻia kēia hana ʻo ka hui ʻana.

E ʻike kākou i ke ʻano o kēia me kahi laʻana maʻalahi:

Pehea e hana ai nā ʻikepili pili (Mahele 1)

Hōʻike kēia kiʻi i ke kūkulu ʻana i ka hoʻonohonoho hope 8-element, pono ʻoe e hoʻololi i hoʻokahi manawa ma luna o nā ʻāpana 2 4-element. No ka mea, ua hoʻokaʻawale mua ʻia nā ʻāpana 4-element ʻelua:

  • 1) hoʻohālikelike ʻoe i nā mea ʻelua i kēia manawa i ʻelua arrays (ma ka hoʻomaka ʻana i kēia manawa = mua)
  • 2) a laila e lawe i ka mea liʻiliʻi loa e hoʻokomo iā ia i loko o kahi ʻāpana 8 element
  • 3) a neʻe i ka mea aʻe i loko o ka array kahi āu i lawe ai i ka mea liʻiliʻi loa
  • a e hana hou i ka 1,2,3 a hiki i ka mea hope loa o kekahi o nā arrays.
  • A laila, lawe ʻoe i nā mea i koe o ka ʻāpana ʻē aʻe e hoʻokomo iā lākou i loko o kahi ʻano mea 8.

Hana ʻia kēia no ka mea ua hoʻokaʻawale ʻia nā ʻāpana 4-element ʻelua a no laila ʻaʻole pono ʻoe e "hoʻi" i kēlā mau papa.

I kēia manawa ke hoʻomaopopo nei mākou i ka hoʻopunipuni, eia kaʻu pseudocode no ka hui ʻana:

array mergeSort(array a)
   if(length(a)==1)
      return a[0];
   end if

   //recursive calls
   [left_array right_array] := split_into_2_equally_sized_arrays(a);
   array new_left_array := mergeSort(left_array);
   array new_right_array := mergeSort(right_array);

   //merging the 2 small ordered arrays into a big one
   array result := merge(new_left_array,new_right_array);
   return result;

Hoʻokaʻawale ka ʻano hoʻohui i kahi pilikia i nā pilikia liʻiliʻi a laila ʻike i nā hopena o nā pilikia liʻiliʻi e loaʻa ai ka hopena o ka pilikia kumu (e hoʻomaopopo: ua kapa ʻia kēia ʻano algorithm he divide and conquer). Inā ʻaʻole ʻoe maopopo i kēia algorithm, mai hopohopo; ʻAʻole maopopo iaʻu i ka manawa mua aʻu i ʻike ai. Inā hiki ke kōkua iā ʻoe, ʻike wau i kēia algorithm ma ke ʻano he ʻelua-phase algorithm:

  • Māhele mahele, kahi e māhele ʻia ai ka laha i nā ʻāpana liʻiliʻi
  • ʻO ka ʻāpana hoʻokaʻawale kahi i hui ʻia ai nā ʻāpana liʻiliʻi (me ka hoʻohana ʻana i ka union) e hana i kahi ʻano nui.

Māhele mahele

Pehea e hana ai nā ʻikepili pili (Mahele 1)

Ma ka mahele mahele, ua maheleia ka laha i na huikau hookahi i 3 mau kapuai. ʻO ka helu maʻamau o nā ʻanuʻu he log(N) (no ka mea, N=8, log(N) = 3).

Pehea wau e ʻike ai i kēia?

He akamai wau! Ma kahi huaʻōlelo - makemakika. ʻO ka manaʻo, ʻo kēlā me kēia ʻanuʻu e puʻunaue i ka nui o ka papa kuhikuhi mua me 2. ʻO ka helu o nā ʻanuʻu ka helu o nā manawa hiki iā ʻoe ke puʻunaue i ka hui kumu i ʻelua. ʻO kēia ka wehewehe pololei o ka logarithm (base 2).

Māhele koho

Pehea e hana ai nā ʻikepili pili (Mahele 1)

I ka papa hoʻokaʻawale, hoʻomaka ʻoe me nā ʻano hui pū kekahi (hoʻokahi-element). I loko o kēlā me kēia kaʻina e hoʻohana ʻoe i nā hana hoʻohui he nui a ʻo ka huina kālā he N = 8 mau hana:

  • I ka pae mua loaʻa iā ʻoe nā hui 4 e kūʻai ana i 2 mau hana i kēlā me kēia
  • Ma ka ʻanuʻu ʻelua, loaʻa iā ʻoe nā hui 2 e uku ana i 4 mau hana i kēlā me kēia
  • Ma ka ʻanuʻu ʻekolu, loaʻa iā ʻoe ka hui ʻana 1 e uku ana i nā hana 8

No ka mea aia nā ʻanuʻu log(N), huina kālā N * log(N) hana.

Nā pōmaikaʻi o ka hoʻohui ʻana

No ke aha i ikaika loa ai kēia algorithm?

No ka mea:

  • Hiki iā ʻoe ke hoʻololi iā ia e hōʻemi i ka wāwae hoʻomanaʻo i ʻole ʻoe e hana i nā arrays hou akā hoʻololi pololei i ka array input.

Hoʻomaopopo: ua kapa ʻia kēia ʻano algorithm in-wahi (ka hoʻokaʻawale ʻana me ka hoʻomanaʻo ʻole).

  • Hiki iā ʻoe ke hoʻololi iā ia no ka hoʻohana ʻana i kahi diski a me kahi hoʻomanaʻo liʻiliʻi i ka manawa like me ka loaʻa ʻole o ka nui o ka disk I/O ma luna. ʻO ka manaʻo e hoʻouka i loko o ka hoʻomanaʻo i nā ʻāpana wale nō e hana ʻia nei. He mea koʻikoʻi kēia inā pono ʻoe e hoʻokaʻawale i kahi papaʻaina multi-gigabyte me kahi pahu hoʻomanaʻo 100-megabyte wale nō.

Hoʻomaopopo: ua kapa ʻia kēia ʻano algorithm ʻano waho.

  • Hiki iā ʻoe ke hoʻololi iā ia e holo ma nā kaʻina hana / thread / server.

No ka laʻana, ʻo ke ʻano hui pū ʻia i hoʻokaʻawale ʻia kekahi o nā mea nui Hadoop (ʻo ia kahi hoʻolālā i ka ʻikepili nui).

  • Hiki i kēia algorithm ke hoʻohuli i ke alakaʻi i ke gula (ʻoiaʻiʻo!).

Hoʻohana ʻia kēia algorithm sorting ma ka hapa nui (inā ʻaʻole nā ​​​​mea āpau) ʻikepili, akā ʻaʻole ia wale nō. Inā makemake ʻoe e ʻike hou aku, hiki iā ʻoe ke heluhelu i kēia hana noiʻi, e kūkākūkā ana i nā pono a me nā pōʻino o nā algorithms sorting database maʻamau.

Papa Laau, Laau a me Hash

I kēia manawa ke hoʻomaopopo nei mākou i ka manaʻo o ka paʻakikī o ka manawa a me ka hoʻokaʻawale ʻana, pono wau e haʻi iā ʻoe e pili ana i 3 mau hanana data. He mea nui kēia no lākou ʻo ia ke kumu o nā ʻikepili hou. E hoʻolauna pū wau i ka manaʻo waihona waihona.

Hoʻoulu

ʻO ka papa hana ʻelua-dimensional ka mea maʻalahi loa. Hiki ke noʻonoʻo ʻia kahi papaʻaina ma ke ʻano he array. ʻo kahi laʻana:

Pehea e hana ai nā ʻikepili pili (Mahele 1)

He papa ʻaina kēia ʻāpana ʻelua me nā lālani a me nā kolamu:

  • Hōʻike kēlā me kēia laina i kahi hui
  • Mālama nā kolamu i nā waiwai e wehewehe ana i ka hui.
  • Mālama kēlā me kēia kolamu i ka ʻikepili o kahi ʻano kikoʻī (integer, string, date...).

He mea maʻalahi kēia no ka mālama ʻana a me ka nānā ʻana i ka ʻikepili, akā, inā pono ʻoe e ʻimi i kahi waiwai kikoʻī, ʻaʻole kūpono kēia.

No ka laʻana, inā makemake ʻoe e ʻimi i nā kāne a pau e hana ana ma UK, pono ʻoe e nānā i kēlā me kēia lālani e hoʻoholo ai inā no UK kēlā lālani. E uku ia iā ʻoe i nā hana Nkahi N - ka helu o nā laina, ʻaʻole hewa, akā hiki ke ala wikiwiki? ʻO ka manawa kēia e kamaʻāina ai kākou i nā lāʻau.

'Ōlelo Aʻo: Hāʻawi ka hapa nui o nā ʻikepili hou i nā papa kuhikuhi no ka mālama pono ʻana i nā papa: heap-organizedtables a index-organizedtables. Akā,ʻaʻole kēia e hoʻololi i ka pilikia o ka loaʻa kokeʻana o kahi kūlana kūikawā ma kahi hui o nā kolamu.

lāʻau waihona a me ka helu kuhikuhi

ʻO ka lāʻau huli binary he lāʻau binary me kahi waiwai kūikawā, pono ke kī ma kēlā me kēia node:

  • ʻoi aku ka nui ma mua o nā kī āpau i mālama ʻia ma ka subtree hema
  • liʻiliʻi ma mua o nā kī āpau i mālama ʻia ma ka subtree ʻākau

E ʻike kākou i ke ʻano o kēia ma ka ʻike maka

Manaʻo

Pehea e hana ai nā ʻikepili pili (Mahele 1)

He N = 15 mau mea keia laau. E ʻōlelo kākou e ʻimi ana au i 208:

  • Hoʻomaka wau ma ke kumu nona ke kī he 136. Mai ka 136<208, nānā au i ka ʻaoʻao ʻākau o ka node 136.
  • 398>208 no laila ke nānā nei au i ka subtree hema o ka node 398
  • 250>208 no laila ke nānā nei au i ka subtree hema o ka node 250
  • 200<208, no laila ke nānā nei au i ka ʻaoʻao ʻākau o ka node 200. Akā, ʻaʻohe kumu kumu kūpono o 200. ʻaʻohe waiwai (no ka mea, inā loaʻa, aia ia ma ka ʻaoʻao ʻākau 200).

E ʻōlelo kākou e ʻimi nei au i 40

  • Hoʻomaka wau ma ke kumu nona ke kī he 136. Mai ka 136 > 40, nānā au i ka subtree hema o ka node 136.
  • 80 > 40, no laila ke nānā nei au i ka subtree hema o ka node 80
  • 40= 40, aia node. Hoʻihoʻi au i ka ID lālani i loko o ka node (ʻaʻole i hōʻike ʻia ma ke kiʻi) a nānā i ka papa no ka ID lālani i hāʻawi ʻia.
  • ʻO ka ʻike ʻana i ka ID lālani e hiki iaʻu ke ʻike pono i kahi o ka ʻikepili i ka papaʻaina, no laila hiki iaʻu ke kiʻi koke.

I ka hopena, e uku iaʻu nā hulina ʻelua i ka helu o nā pae i loko o ka lāʻau. Inā heluhelu ʻoe i ka ʻāpana e pili ana i ka hoʻohui ʻana me ke akahele, pono ʻoe e ʻike aia nā pae log (N). ʻIke ʻia, mooolelo kumu kuai huli(N), ʻaʻole maikaʻi ʻole!

E hoʻi kākou i ko kākou pilikia

Akā, he abstract loa kēia, no laila e hoʻi kākou i ko kākou pilikia. Ma kahi o ka integer maʻalahi, e noʻonoʻo i kahi kaula e hōʻike ana i ka ʻāina o kekahi ma ka papa mua. E ʻōlelo kākou he lāʻau kāu i loaʻa ka māla "'āina" (kolu 3) o ka papaʻaina:

  • Inā makemake ʻoe e ʻike i ka mea hana ma UK
  • e nānā ʻoe i ke kumulāʻau e kiʻi i ka node e hōʻike ana iā Great Britain
  • i loko o "UKnode" e ʻike ʻoe i kahi o nā moʻolelo limahana UK.

E uku ana kēia hulina i nā hana log(N) ma mua o nā hana N inā hoʻohana pololei ʻoe i ka array. ʻO ka mea āu i hōʻike ai waihona waihona.

Hiki iā ʻoe ke kūkulu i kahi lāʻau kuhikuhi no kēlā me kēia pūʻulu o nā māla (ka laina, helu, 2 laina, helu a me ke kaula, lā...) inā loaʻa iā ʻoe kahi hana e hoʻohālikelike ai i nā kī (ʻo ia hoʻi nā hui kahua) i hiki iā ʻoe ke hoʻonohonoho. hoʻonohonoho i waena o nā kī (ʻo ia ka hihia no nā ʻano kumu ma ka waihona).

B+LaauIndex

ʻOiai ke hana maikaʻi nei kēia kumulāʻau no ka loaʻa ʻana o kahi waiwai kikoʻī, aia kahi pilikia NUI ke pono ʻoe loaʻa i nā mea he nui ma waena o nā waiwai ʻelua. E lilo kēia i O(N) no ka mea pono ʻoe e nānā i kēlā me kēia node o ka lāʻau a nānā inā aia ma waena o kēia mau waiwai ʻelua (e laʻa me ka hele ʻana o ka lāʻau). Eia kekahi, ʻaʻole ia he disk I/O friendly no ka mea pono ʻoe e heluhelu i ka lāʻau holoʻokoʻa. Pono mākou e ʻimi i kahi ala e hoʻokō pono ai noi laula. No ka hoʻoponopono ʻana i kēia pilikia, hoʻohana nā ʻikepili hou i kahi mana hoʻololi o ka lāʻau mua i kapa ʻia ʻo B+Tree. Ma kahi kumulāʻau B+:

  • ʻo nā node haʻahaʻa wale nō (lau) hale kūʻai ʻike (kahi o nā lālani ma ka pākaukau pili)
  • ke koena o na node maanei no ke alahele i ka node pololei i ka wā huli.

Pehea e hana ai nā ʻikepili pili (Mahele 1)

E like me kāu e ʻike ai, ʻoi aku ka nui o nā nodes ma aneʻi (ʻelua ʻelua). ʻOiaʻiʻo, loaʻa iā ʻoe nā node hou, "nā nodes hoʻoholo", e kōkua iā ʻoe e ʻimi i ka node kūpono (e mālama ana i kahi o nā lālani i ka pākaukau pili). Akā, ʻo O(log(N)) ka paʻakikī o ka ʻimi (he hoʻokahi pae hou aʻe). ʻO ka ʻokoʻa nui kēlā hoʻopili ʻia nā nodes ma ka pae haʻahaʻa i ko lākou mau hope.

Me kēia B+Tree, inā ʻoe e ʻimi nei i nā waiwai ma waena o 40 a me 100:

  • Pono ʻoe e ʻimi no 40 (a i ʻole ka waiwai kokoke loa ma hope o 40 inā ʻaʻole 40) e like me kāu i hana ai me ka lāʻau mua.
  • A laila e hōʻiliʻili i 40 mau hoʻoilina me ka hoʻohana ʻana i nā loulou hoʻoilina pololei a hiki i ka 100.

E ʻōlelo kākou ua loaʻa iā ʻoe nā mea pani M a he N nodes ka lāʻau. Ke ʻimi nei i kahi lāʻau koina node kūikawā (N) e like me ka lāʻau mua. Akā ke loaʻa iā ʻoe kēia node, e loaʻa iā ʻoe nā mea pani M i nā hana M me nā kuhikuhi i ko lākou mau hope. ʻO kēia hulina ke kumu kūʻai M+log(N) wale nō nā hana i hoʻohālikelike ʻia me nā hana N ma ka lāʻau mua. Eia kekahi, ʻaʻole pono ʻoe e heluhelu i ka lāʻau piha (wale nō M+log(N) nodes), ʻo ia hoʻi ka liʻiliʻi o ka hoʻohana ʻana i ka disk. Inā liʻiliʻi ka M (eg 200 lālani) a nui ka N (1 lālani), e loaʻa ka ʻokoʻa NUI.

Akā aia nā pilikia hou ma ʻaneʻi (hou!). Inā ʻoe e hoʻohui a holoi paha i kahi lālani ma ka waihona (a no laila i ka papa kuhikuhi B+Tree pili):

  • Pono ʻoe e mālama i ka hoʻonohonoho ma waena o nā nodes i loko o kahi B+Tree, i ʻole ʻaʻole hiki iā ʻoe ke ʻike i nā nodes i loko o kahi lāʻau i hoʻokaʻawale ʻole ʻia.
  • Pono ʻoe e mālama i ka helu haʻahaʻa loa o nā pae ma B+Tree, i ʻole e lilo ka paʻakikī o ka manawa O(log(N)) i O(N).

I nā huaʻōlelo ʻē aʻe, pono ʻo B + Tree e hoʻonohonoho ponoʻī a kaulike. ʻO ka mea pōmaikaʻi, hiki kēia me nā hana holoi a hoʻokomo. Akā, hiki mai kēia ma ke kumu kūʻai: nā hoʻokomo a me ka holoi ʻana i kahi kumulāʻau B+ ke kumu kūʻai O(log(N)). ʻO ia ke kumu i lohe ai kekahi o ʻoukou ʻAʻole maikaʻi ka hoʻohana ʻana i nā index he nui. ʻOiaʻiʻo, ke hoʻolohi nei ʻoe i ka hoʻokomo wikiwiki ʻana/hōʻano hou/holo i kahi lālani ma ka papaʻainano ka mea, pono ka waihona e hoʻololi i nā papa kuhikuhi o ka papaʻaina me ka hoʻohana ʻana i kahi hana O(log(N)) pipiʻi no kēlā me kēia papa kuhikuhi. Eia kekahi, ʻo ka hoʻohui ʻana i nā index ʻoi aku ka nui o ka hana no luna kālepa (e wehewehe ʻia ma ka hope o ka ʻatikala).

No nā kikoʻī hou aku, hiki iā ʻoe ke ʻike i ka ʻatikala Wikipedia ma B+Tree. Inā makemake ʻoe i kahi laʻana o ka hoʻokō ʻana i ka B+Tree i kahi waihona, e nānā kēia ʻatikala и kēia ʻatikala mai kahi mea hoʻomohala MySQL alakaʻi. Ke nānā aku nei lāua ʻelua i ka hana ʻana o InnoDB (ke ʻenekini MySQL) i nā kuhikuhi.

Nānā: Ua haʻi mai kahi mea heluhelu iaʻu, ma muli o ka haʻahaʻa haʻahaʻa haʻahaʻa, pono e kaulike ka lāʻau B+.

Hashtable

ʻO kā mākou hoʻolālā ʻikepili koʻikoʻi hope loa ʻo ka papa hash. He mea maikaʻi loa kēia inā makemake ʻoe e ʻimi wikiwiki i nā waiwai. Eia kekahi, ʻo ka hoʻomaopopo ʻana i kahi papa hash e kōkua iā mākou ma hope e hoʻomaopopo i kahi hana hoʻohui maʻamau i kapa ʻia ʻo hash join ( hoʻohui i ka hash). Hoʻohana pū ʻia kēia ʻano ʻikepili e ka waihona e mālama i kekahi mau mea o loko (e.g. paʻa paʻa ai ole ia, loko hoʻopaʻa, e ʻike mākou i kēia mau manaʻo ʻelua ma hope).

ʻO ka papaʻaina hash kahi ʻano ʻikepili e ʻike koke i kahi mea ma kāna kī. No ke kūkulu ʻana i kahi papa hash pono ʻoe e wehewehe:

  • ʻike no kāu mau mea
  • hana hash no na ki. Hāʻawi nā hashes kī helu i kahi o nā mea (kapa ʻia ʻāpana ).
  • hana no ka hoohalike ana i na ki. Ke loaʻa iā ʻoe ka ʻāpana kūpono, pono ʻoe e ʻimi i ka mea āu e ʻimi nei i loko o ka māhele me ka hoʻohana ʻana i kēia hoʻohālikelike.

Laʻana maʻalahi

E lawe kākou i kekahi laʻana maopopo.

Pehea e hana ai nā ʻikepili pili (Mahele 1)

He 10 mau ʻāpana kēia pākaukau hash. No ka moloā, ua kiʻi wale au i 5 mau ʻāpana, akā ʻike wau he akamai ʻoe, no laila e ʻae wau iā ʻoe e kiʻi i nā ʻāpana ʻē aʻe ma kāu iho. Ua hoʻohana au i kahi hana hash modulo 5 o ke kī. I nā huaʻōlelo ʻē aʻe, mālama wau i ka helu hope loa o ke kī o ka mea e ʻike ai i kāna ʻāpana:

  • inā he 0 ka huahelu hope, hāʻule ka mea i ka māhele 0,
  • inā he 1 ka huahelu hope, hāʻule ka mea i ka māhele 1,
  • inā he 2 ka huahelu hope, hāʻule ka mea i ka ʻāpana 2,
  • ...

ʻO ka hana hoʻohālikelike aʻu i hoʻohana ai he kaulike ma waena o ʻelua integer.

E ʻōlelo mākou makemake ʻoe e kiʻi i ka element 78:

  • Heluhelu ka papa hash i ke code hash no 78, ʻo ia ka 8.
  • Nānā ka papa hash i ka māhele 8, a ʻo ka mea mua i loaʻa iā ia he 78.
  • Hoʻihoʻi ʻo ia iā ʻoe i ka helu 78
  • He 2 hana wale no ka huli ana (hoʻokahi e helu i ka waiwai hash a ʻo kekahi e nānā i ka mea i loko o ka māhele).

I kēia manawa e ʻōlelo mākou makemake ʻoe e kiʻi i ka element 59:

  • Heluhelu ka papa hash i ke code hash no 59, ʻo ia ka 9.
  • Huli ka papaʻaina hash ma ka māhele 9, ʻo ka mea mua i loaʻa ʻo 99. Mai ka 99!=59, ʻaʻole he mea kūpono ka element 99.
  • Ma ka hoʻohana ʻana i ka lokahi like, lawe ʻia ka mea ʻelua (9), ke kolu (79), ..., ka hope (29).
  • ʻAʻole i ʻike ʻia ka mea.
  • ʻO ka huli ʻana he 7 mau hana.

ʻO ka hana hash maikaʻi

E like me kāu e ʻike ai, ma muli o ka waiwai āu e ʻimi nei, ʻaʻole like ke kumukūʻai!

Inā hoʻololi au i ka hana hash modulo 1 o ke kī (ʻo ia hoʻi, e lawe ana i nā huahelu 000 hope loa), ʻo ka lua o ka huli ʻana he 000 hana wale nō no ka mea ʻaʻohe mea i ka māhele 6. ʻO ka paʻakikī maoli ka loaʻa ʻana o kahi hana hash maikaʻi e hana i nā bākeke i loaʻa kahi helu liʻiliʻi o nā mea.

I kaʻu laʻana, maʻalahi ka loaʻa ʻana o kahi hana hash maikaʻi. Akā he laʻana maʻalahi kēia, ʻoi aku ka paʻakikī o ka loaʻa ʻana o kahi hana hash maikaʻi inā ʻo ke kī:

  • string (no ka laʻana - inoa hope)
  • 2 laina (no ka laʻana - inoa hope a me ka inoa mua)
  • 2 laina a me ka lā (no ka laʻana - inoa hope, inoa mua a me ka lā hānau)
  • ...

Me ka hana hash maikaʻi, ke kumu kūʻai o ka nānā ʻana i ka papaʻaina hash O(1).

ʻO ka papaʻaina ʻo Array vs hash

No ke aha e hoʻohana ʻole ai i kahi array?

Hmm, nīnau maikaʻi.

  • Hiki i ka papa hash hoʻouka hapa i loko o ka hoʻomanaʻo, a hiki i nā ʻāpana i koe ke noho ma ka disk.
  • Me kahi array pono ʻoe e hoʻohana i nā wahi pili i ka hoʻomanaʻo. Inā ʻoe e hoʻouka ana i kahi pākaukau nui he mea paʻakikī loa ka loaʻa ʻana o kahi ākea hoʻomau.
  • No ka papaʻaina hash, hiki iā ʻoe ke koho i ke kī āu e makemake ai (no ka laʻana, ka ʻāina a me ka inoa hope o ke kanaka).

No ka ʻike hou aku, hiki iā ʻoe ke heluhelu i ka ʻatikala e pili ana IawaHashMap, ʻo ia ka hoʻokō pono ʻana i kahi papaʻaina hash; ʻAʻole pono ʻoe e hoʻomaopopo iā Java e hoʻomaopopo i nā manaʻo i uhi ʻia ma kēia ʻatikala.

Source: www.habr.com

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