Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Hey Habr! Atolotro ho anareo ny fandikana ilay lahatsoratra
"Ahoana no fiasan'ny database relational".

Raha ny momba ny angona momba ny fifandraisana dia tsy afaka ny tsy hieritreritra aho fa misy zavatra tsy ampy. Izy ireo dia ampiasaina na aiza na aiza. Misy tahiry maro samihafa azo alaina, manomboka amin'ny SQLite kely sy mahasoa ka hatramin'ny Teradata mahery. Saingy misy lahatsoratra vitsivitsy manazava ny fomba fiasan'ny database. Azonao atao ny mikaroka ny tenanao amin'ny alalan'ny "howdoesarelationaldatabasework" hahitana hoe vitsy ny valiny. Ankoatra izany, dia fohy ireo lahatsoratra ireo. Raha mitady ny teknolojia buzzy farany (BigData, NoSQL na JavaScript) ianao dia hahita lahatsoratra lalindalina kokoa manazava ny fomba fiasan'izy ireo.

Efa antitra loatra sy mankaleo loatra ve ny angon-drakitra momba ny fifandraisana raha hazavaina ivelan'ny fianarana eny amin'ny oniversite, taratasy fikarohana ary boky?

Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Amin'ny maha-mpamorona ahy dia tsy tiako ny mampiasa zavatra tsy azoko. Ary raha efa 40 taona mahery no nampiasaina ny angon-drakitra dia tsy maintsy misy antony. Nandritra ny taona maro, nandany ora an-jatony aho mba hahatakarana marina ireo boaty mainty hafahafa izay ampiasaiko isan'andro. Angon-drakitra mifandraika tena mahaliana satria izy ireo mifototra amin'ny hevitra mahasoa sy azo ampiasaina indray. Raha liana amin'ny fahazoana angon-drakitra ianao, nefa tsy mbola nanam-potoana na nirona handalina an'io lohahevitra midadasika io, dia tokony hankafy ity lahatsoratra ity ianao.

Na dia mazava aza ny lohatenin'ity lahatsoratra ity, Ny tanjon'ity lahatsoratra ity dia ny tsy hahatakatra ny fomba fampiasana ny angon-drakitra. Noho izany, tokony efa fantatrao ny fomba fanoratana fangatahana fifandraisana tsotra sy fanontaniana fototra manta; raha tsy izany dia mety tsy azonao ity lahatsoratra ity. Izay ihany no tokony ho fantatrao, hazavaiko ny tohiny.

Hanomboka amin'ny fototry ny siansa informatika aho, toy ny hamaroan'ny fotoana ny algorithm (BigO). Fantatro fa ny sasany aminareo dia mankahala an'io foto-kevitra io, saingy raha tsy misy izany dia tsy ho azonao ny pitsopitsony ao anatin'ny tahiry. Satria lohahevitra lehibe ity, Hifantoka amin'ny aho izay heveriko fa zava-dehibe: ahoana ny fizotran'ny database SQL nanontany. Hampahafantatra fotsiny aho foto-kevitra fototra momba ny angonaka amin'ny faran'ny lahatsoratra dia manana hevitra momba ny zava-mitranga eo ambanin'ny satroka ianao.

Satria lahatsoratra lava sy ara-teknika ity izay misy algorithms sy rafitra data marobe, makΓ  fotoana hamakiana azy io. Mety ho sarotra takarina ny hevitra sasany; azonao atao ny mandingana azy ireo ary mbola mahazo ny hevitra ankapobeny.

Ho an'ny fahalalana bebe kokoa aminareo dia mizara 3 ity lahatsoratra ity:

  • Fijerena ireo singa angon-drakitra ambany sy avo lenta
  • Topimaso momba ny fizotry ny fanatsarana ny fanontaniana
  • Overview ny Transaction and Buffer Pool Management

Hiverina any amin'ny Basics

Taona maro lasa izay (tany amin'ny vahindanitra lavitra, lavitra ...), dia tsy maintsy fantatr'ireo mpamorona tsara ny isan'ny asa nokarakarainy. Fantatr'izy ireo am-po ny algorithm sy ny firafitry ny angon-drakitra satria tsy afaka mandany ny CPU sy ny fitadidiana ny solosainy miadana izy ireo.

Amin'ity ampahany ity dia hampahatsiahy anao ny sasany amin'ireo hevitra ireo aho satria tena ilaina amin'ny fahatakarana ny angon-drakitra. Hampahafantatra ny hevitra ihany koa aho index database.

O(1) vs O(n2)

Amin'izao fotoana izao, maro amin'ireo mpamorona no tsy miraharaha ny fahasarotan'ny algorithm amin'ny fotoana ... ary marina izany!

Saingy rehefa miatrika angona be dia be ianao (tsy miresaka an'arivony aho) na raha sahirana ao anatin'ny milisegondra ianao, dia lasa zava-dehibe ny mahatakatra an'io hevitra io. Ary araka ny azonao an-tsaina, ny angon-drakitra dia tsy maintsy miatrika toe-javatra roa! Tsy hanao anao handany fotoana mihoatra noho izay ilaina aho mba hampitana ny hevitra. Izany dia hanampy antsika hahatakatra ny foto-kevitry ny fanatsarana mifototra amin'ny vidiny any aoriana (vidin'ny mifototra Optimization).

foto-kevitra

Fotoana sarotra ny algorithm ampiasaina hijerena ny faharetan'ny algorithm iray mba hamitana ny angona nomena. Mba hamaritana an'io fahasarotana io, dia mampiasa marika matematika lehibe O. Ity fanamarihana ity dia ampiasaina miaraka amin'ny fiasa izay mamaritra hoe firy ny asa ilain'ny algorithm iray amin'ny isa nomena.

Ohatra, rehefa miteny aho hoe "io algorithm io dia manana fahasarotana O (some_function ())", midika izany fa ny algorithm dia mitaky asa_miasa (a_certain_amount_of_data) mba hikarakarana angon-drakitra.

Noho izany Tsy ny habetsaky ny angona no zava-dehibe**, raha tsy izany ** ny fitomboan'ny isan'ny asa miaraka amin'ny fitomboan'ny habetsaky ny angona. Ny fahasarotan'ny fotoana dia tsy manome isa marina ny asa, fa fomba tsara hanombanana ny fotoana famonoana.

Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Ao amin'ity grafika ity ianao dia afaka mahita ny isan'ny asa mifanohitra amin'ny habetsaky ny angona fampidirana ho an'ny karazana fahasarotana amin'ny fotoana algorithm. Nampiasa mizana logaritma aho mba hampisehoana azy ireo. Raha lazaina amin'ny teny hafa, mitombo haingana ny habetsaky ny angona avy amin'ny 1 ka hatramin'ny 1 lavitrisa. Hitantsika fa:

  • O(1) na ny fahasarotana tsy tapaka dia mijanona ho tsy miova (raha tsy izany dia tsy azo antsoina hoe fahasarotana tsy miova).
  • O(hiditra(n)) mbola ambany na dia misy angon-drakitra an'arivony tapitrisa aza.
  • Ny fahasahiranana ratsy indrindra - O(n2), izay mitombo haingana ny isan'ny asa.
  • Ny fahasarotana roa hafa dia mitombo haingana.

ohatra

Miaraka amin'ny angon-drakitra kely, ny fahasamihafana eo amin'ny O (1) sy O (n2) dia tsinontsinona. Ohatra, andao atao hoe manana algorithm ianao izay mila manamboatra singa 2000.

  • Ny algorithm O(1) dia handoa anao fandidiana 1
  • Ny algorithm O(log(n)) dia handany 7 fandidiana
  • Ny algorithm O(n) dia handany 2 asa
  • Ny algorithm O(n*log(n)) dia mitentina 14 ariary
  • Ny algorithm O(n2) dia mitentina 4

Ny fahasamihafana misy eo amin'ny O(1) sy ny O(n2) dia toa lehibe (4 tapitrisa asa) fa ho very 2 ms fara-fahakeliny ianao, fotoana fotsiny hamipiratra ny masonao. Eny tokoa, ny processeur maoderina dia afaka manodina asa an-jatony tapitrisa isan-tsegondra. Izany no mahatonga ny fampisehoana sy ny fanatsarana dia tsy olana amin'ny tetikasa IT maro.

Araka ny nolazaiko dia mbola zava-dehibe ny mahafantatra io foto-kevitra io rehefa miasa miaraka amin'ny angon-drakitra be dia be. Raha amin'ity indray mitoraka ity ny algorithm dia mila manamboatra singa 1 (izay tsy dia be loatra amin'ny angon-drakitra):

  • Ny algorithm O(1) dia handoa anao fandidiana 1
  • Ny algorithm O(log(n)) dia handany 14 fandidiana
  • Ny algorithm O(n) dia handany 1 asa
  • Ny algorithm O(n*log(n)) dia mitentina 14 ariary
  • Ny algorithm O(n2) dia mitentina 1 asa.

Tsy nanao ny matematika aho, fa lazaiko fa amin'ny algorithm O(n2) dia manam-potoana hisotro kafe ianao (na roa aza!). Raha manampy 0 hafa amin'ny habetsahan'ny data ianao dia hanana fotoana hatoriana.

Andao hiroso lalindalina kokoa

For reference:

  • Ny fitadiavana latabatra tenifototra tsara dia mahita singa iray ao amin'ny O(1).
  • Ny fitadiavana hazo voalanjalanja tsara dia miteraka O(log(n)).
  • Ny fitadiavana lasy dia miteraka vokatra ao amin'ny O(n).
  • Ny algorithm fanasokajiana tsara indrindra dia manana fahasarotana O(n*log(n)).
  • Ny algorithm fanasokajiana ratsy dia manana fahasarotana O (n2).

Fanamarihana: Ao amin'ireto ampahany manaraka ireto dia ho hitantsika ireo algorithm sy firafitry ny data.

Misy karazany maromaro ny fahasarotan'ny fotoana algorithm:

  • toe-javatra antonony
  • toe-javatra tsara indrindra
  • ary ny tranga ratsy indrindra

Ny fahasarotan'ny fotoana dia matetika ny tranga ratsy indrindra.

Ny fahasarotan'ny fotoanan'ny algorithm ihany no noresahako, fa mihatra amin'ny fahasarotana ihany koa:

  • fanjifΓ na fahatsiarovana ny algorithm
  • algorithm fanjifana I/O disk

Mazava ho azy fa misy fahasarotana ratsy kokoa noho ny n2, ohatra:

  • n4: tena ratsy! Ny sasany amin'ireo algorithm voalaza dia manana izany fahasarotana izany.
  • 3n: mbola ratsy kokoa aza izany! Ny iray amin'ireo algorithm ho hitantsika eo afovoan'ity lahatsoratra ity dia manana io fahasarotana io (ary tena ampiasaina amin'ny tahiry maro).
  • factorial n: tsy ho azonao mihitsy ny vokatrao na dia misy angona kely aza.
  • nn: Raha sendra an'io fahasarotana io ianao dia tokony hanontany tena raha tena sahan-asanao tokoa ve ity...

Fanamarihana: Tsy nomeko anao ny tena famaritana ny anarana O lehibe, hevitra fotsiny. Azonao atao ny mamaky ity lahatsoratra ity amin'ny Wikipedia ho an'ny famaritana tena izy (asymptotic).

MergeSort

Inona no ataonao rehefa mila mandamina fanangonana ianao? Inona? Antsoinao hoe karazana () asa ... Ok, valiny tsara ... Fa ho an'ny tahiry iray, tsy maintsy azonao ny fomba fiasan'ity karazana () ity.

Misy algorithm fanasokajiana tsara maromaro, ka hifantoka amin'ny zava-dehibe indrindra aho: manambatra karazana. Mety tsy azonao ny antony maha-ilaina ny fanasokajiana angona amin'izao fotoana izao, fa tokony aorian'ny ampahany amin'ny fanatsarana ny fangatahana. Fanampin'izay, ny fahatakarana ny karazana merge dia hanampy antsika amin'ny fahatakarana ny fiasan'ny database iombonana antsoina hoe mandeha anjara (fikambanana mitambatra).

mampiray

Sahala amin'ny algorithms mahasoa maro, miantehitra amin'ny fika iray ny fampifangaroana karazana: ny fampifangaroana laharan-tariby 2 voasokajy amin'ny habe N/2 ho lasa laharan'ny N-element dia mitaky asa N ihany. Ity hetsika ity dia antsoina hoe fampivondronana.

Andeha hojerentsika ny dikan'izany amin'ny ohatra tsotra:

Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Ity tarehimarika ity dia mampiseho fa mba hananganana ny laharan'ny singa 8 voasokajy farany, dia mila mamerina indray mandeha monja amin'ireo laharan'ny singa 2 4 ianao. Satria samy efa voalahatra ny array 4-element:

  • 1) ampitahainao ny singa roa amin'izao fotoana izao amin'ny array roa (eo am-piandohana ankehitriny = voalohany)
  • 2) avy eo alao ny kely indrindra mba hametraka azy ao amin'ny 8 singa array
  • 3) ary mifindra any amin'ny singa manaraka ao amin'ny array izay nakanao ny singa kely indrindra
  • ary avereno 1,2,3 mandra-pahatonganao ny singa farany amin'ny iray amin'ireo array.
  • Avy eo dia alainao ireo singa sisa amin'ny laharan-tariby hafa mba hametrahana azy ireo ao anaty laharan'ny singa 8.

Mandeha izany satria samy voalahatra ny array 4-element ary noho izany dia tsy mila "miverina" amin'ireo array ireo ianao.

Ankehitriny rehefa azontsika ny fika, ity ny pseudocode ho an'ny merge:

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;

Ny merge sort dia mamadika olana ho olana kely kokoa ary avy eo mahita ny vokatry ny olana kely mba hahazoana ny vokatry ny olana tany am-boalohany (fanamarihana: ity karazana algorithm ity dia antsoina hoe divide and conquer). Raha tsy azonao ity algorithm ity dia aza manahy; Tsy azoko ilay izy tamin'ny voalohany nahitako azy. Raha afaka manampy anao izany dia hitako ho toy ny algorithm dingana roa ity algorithm ity:

  • Fizarana fizarana, izay mizara ho array kely kokoa ny array
  • Ny dingan'ny fanasokajiana dia ny fampifandraisana ireo array kely (mampiasa union) mba hamoronana array lehibe kokoa.

Dingana fizarana

Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Ao amin'ny dingana fizarana, ny array dia mizara ho unitary arrays amin'ny dingana 3. Ny isan'ny dingana ofisialy dia log(N) (satria N=8, log(N) = 3).

Ahoana no ahalalako an'izany?

mahay aho! Amin'ny teny iray - matematika. Ny hevitra dia ny dingana tsirairay dia mizara ny haben'ny array tany am-boalohany amin'ny 2. Ny isan'ny dingana dia ny isan'ny fotoana azonao zaraina ho roa ny laharana voalohany. Izany no tena famaritana ny logaritma (fototra 2).

Dingana fanasokajiana

Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Ao amin'ny dingana fanasokajiana, manomboka amin'ny arrays tokana (singa tokana) ianao. Amin'ny dingana tsirairay dia mampihatra asa fanakambanana maromaro ianao ary ny totalin'ny fandaniana dia N = 8 asa:

  • Ao amin'ny dingana voalohany dia manana merges 4 izay mitentina 2 ny asa tsirairay
  • Ao amin'ny dingana faharoa dia manana merges 2 izay mitentina 4 ny asa tsirairay
  • Ao amin'ny dingana fahatelo dia manana 1 mitambatra izay mitentina 8 fandidiana

Satria misy log (N) dingana, ny totalin'ny vola N * log(N) asa.

Ny tombony amin'ny merge sort

Nahoana no mahery vaika io algorithm io?

Satria:

  • Azonao atao ny manova azy io mba hampihenana ny dian-tongotra fitadidiana mba tsy hamorona array vaovao ianao fa hanova mivantana ny array fampidirana.

Fanamarihana: ity karazana algorithm ity dia antsoina in-toerana (fandaminana tsy misy fitadidiana fanampiny).

  • Azonao atao ny manova azy io mba hampiasana habaka kapila sy fitadidiana kely miaraka amin'ny fotoana iray nefa tsy misy overhead I/O kapila lehibe. Ny hevitra dia ny hampiditra ao amin'ny fitadidiana afa-tsy ireo ampahany izay karakaraina amin'izao fotoana izao. Zava-dehibe izany rehefa mila mandamina latabatra maromaro gigabyte ianao miaraka amin'ny buffer fahatsiarovana 100 megabyte.

Fanamarihana: ity karazana algorithm ity dia antsoina karazana ivelany.

  • Azonao atao ny manova azy io mba handehanana amin'ny dingana maro / kofehy / mpizara.

Ohatra, iray amin'ireo singa manan-danja ny karazana fampiraisana zaraina Hadoop (izay rafitra amin'ny angon-drakitra lehibe).

  • Ity algorithm ity dia afaka mamadika firaka ho volamena (tena!).

Ity algorithm fanasokajiana ity dia ampiasaina amin'ny ankamaroan'ny angon-drakitra (raha tsy ny rehetra), fa tsy izy irery ihany. Raha te hahalala bebe kokoa ianao dia afaka mamaky ity asa fikarohana, izay miresaka momba ny tombony sy ny tsy fahampian'ny algorithm fanasokajiana angon-drakitra mahazatra.

Array, Hazo ary Hash Table

Ankehitriny rehefa azontsika ny hevitry ny fahasarotan'ny fotoana sy ny fanasokajiana, dia tokony hilaza aminao momba ny rafitra data 3 aho. Zava-dehibe izany satria izy ireo no fototry ny angon-drakitra maoderina. Hampahafantatra ny hevitra ihany koa aho index database.

fihaingoana

Ny laharan-droa dimanjato no rafitra angona tsotra indrindra. Ny latabatra dia azo heverina ho toy ny array. Ohatra:

Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Ity array 2 dimensional ity dia latabatra misy andalana sy tsanganana:

  • Ny andalana tsirairay dia maneho singa iray
  • Ny tsanganana dia mitahiry fananana izay mamaritra ny enti-manana.
  • Ny tsanganana tsirairay dia mitahiry angon-drakitra amin'ny karazana manokana (integer, string, date...).

Mety amin'ny fitahirizana sy fijerena angon-drakitra izany, na izany aza, rehefa mila mitady sanda manokana ianao dia tsy mety izany.

Ohatra, raha te hahita ny lehilahy rehetra miasa any Angletera ianao dia mila mijery ny laharana tsirairay mba hamaritana raha an'ny UK io laharana io. Handaniana anao N transaction izanyizay N - isan'ny andalana, izay tsy ratsy, fa mety misy fomba haingana kokoa? Fotoana tokony hifankahalalana amin’ny hazo izao.

Fanamarihana: Ny ankabeazan'ny angona maoderina dia manome laharana mivelatra amin'ny fitehirizana latabatra amin'ny fomba mahomby: heap-organizedtables sy index-organizedtables. Saingy tsy manova ny olana amin'ny fitadiavana haingana fepetra manokana amin'ny vondrona tsanganana.

Hazo database sy index

Ny hazo fikarohana binary dia hazo mimari-droa manana fananana manokana, ny fanalahidy isaky ny node dia tsy maintsy:

  • lehibe noho ny fanalahidy rehetra voatahiry ao amin'ny zana-kazo havia
  • latsaky ny fanalahidy rehetra voatahiry ao amin'ny zana-kazo havanana

Andeha hojerentsika ny dikan'izany amin'ny maso

hevitra

Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Ity hazo ity dia manana singa N = 15. Andeha atao hoe mitady 208 aho:

  • Manomboka amin'ny fakany aho izay manana lakile 136. Hatramin'ny 136<208 dia mijery ny zana-kazo havanana amin'ny node 136 aho.
  • 398> 208 noho izany dia mijery ny zana-kazo havia amin'ny node 398 aho
  • 250> 208 noho izany dia mijery ny zana-kazo havia amin'ny node 250 aho
  • 200<208, noho izany dia mijery ny zana-kazo havanana amin'ny node 200 aho. Fa ny 200 dia tsy manana zana-kazo havanana, tsy misy ny sandany (satria raha misy izy dia ho eo amin'ny zana-kazo havanana 200).

Andeha atao hoe mitady 40 aho

  • Manomboka amin'ny fakany aho izay manana fanalahidin'ny 136. Hatramin'ny 136 > 40 dia mijery ny zana-kazo havia amin'ny node 136 aho.
  • 80> 40, noho izany dia mijery ny zana-kazo havia amin'ny node 80 aho
  • 40= 40, misy node. Raisiko ny ID andalana ao anatin'ny node (fa tsy eo amin'ny sary) ary jereo eo amin'ny latabatra ny ID laharana nomena.
  • Ny fahafantarako ny ID andalana dia ahafahako mahafantatra tsara ny toerana misy ny angona ao amin'ny latabatra, mba ahafahako maka azy avy hatrany.

Amin'ny farany, ireo fikarohana roa ireo dia handoa ahy ny isan'ny ambaratonga ao anatin'ilay hazo. Raha mamaky tsara ny ampahany momba ny fanakambanana ianao dia tokony ho hitanao fa misy ny haavon'ny log(N). Hay, ny vidin'ny fikarohana (N), tsy ratsy!

Andao hiverina amin'ny olana misy antsika

Saingy tena abstract izany, ka andao hiverina amin'ny olanay. Ho solon'ny fanisana tsotra, alaivo sary an-tsaina ny tady iray maneho ny tanin'olona iray eo amin'ny latabatra teo aloha. Andeha atao hoe manana hazo misy ny saha "firenena" (tsanganana 3) amin'ny latabatra ianao:

  • Raha te hahafantatra ianao hoe iza no miasa any UK
  • mijery ny hazo ianao mba hahazoana ny node izay maneho an'i Grande-Bretagne
  • Ao anatin'ny "UKnode" dia ho hitanao ny toerana misy ny firaketana mpiasa any UK.

Ity fikarohana ity dia handany ny asa log(N) fa tsy ny asa N raha mampiasa mivantana ny array ianao. Izay vao natolotrao dia index database.

Azonao atao ny manangana hazo fanondro ho an'ny vondron'ny saha rehetra (tady, isa, andalana 2, isa sy tady, daty...) raha toa ka manana asa mampitaha ny fanalahidy ianao (izany hoe vondrona saha) mba hahafahanao mametraka. filaharana eo amin'ny fanalahidy (izay mitranga amin'ny karazana fototra rehetra ao amin'ny tahiry).

B+TreeIndex

Na dia miasa tsara aza ity hazo ity amin'ny fahazoana sanda manokana, dia misy olana lehibe rehefa ilainao mahazo singa maromaro eo anelanelan'ny soatoavina roa. Hividy O(N) izany satria tsy maintsy mijery ny node tsirairay amin'ny hazo ianao ary manamarina raha eo anelanelan'ireo soatoavina roa ireo (oh: miaraka amin'ny baikon'ny hazo). Ankoatr'izay, ity hetsika ity dia tsy disk I/O namana satria tsy maintsy mamaky ny hazo manontolo ianao. Mila mitady fomba hanatanterahana mahomby isika fangatahana faritra. Mba hamahana ity olana ity dia mampiasa dikan-teny novaina tamin'ny hazo teo aloha antsoina hoe B+Tree ny tahiry maoderina. Amin'ny hazo B+Tree:

  • ny nodes ambany indrindra (ravina) ihany mitahiry vaovao (toerana misy andalana ao amin'ny latabatra mifandraika)
  • ny sisa nodes eto ho an'ny zotra mankany amin'ny node marina mandritra ny fikarohana.

Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Araka ny hitanao dia misy nodes bebe kokoa eto (indroa). Eny tokoa, manana node fanampiny ianao, "nodes decision", izay hanampy anao hahita ny node marina (izay mitahiry ny toerana misy ny andalana ao amin'ny latabatra mifandray). Saingy ny fahasarotan'ny fikarohana dia mbola O(log(N)) (tsy misy afa-tsy ambaratonga iray hafa). Ny fahasamihafana lehibe dia izany nodes amin'ny ambaratonga ambany dia mifandray amin'ny mpandimby azy.

Miaraka amin'ity B+Tree ity, raha mitady sanda eo anelanelan'ny 40 sy 100 ianao:

  • Mila mitady 40 fotsiny ianao (na ny sanda akaiky indrindra aorian'ny 40 raha tsy misy 40) toy ny nataonao tamin'ny hazo teo aloha.
  • Avy eo manangona mpandova 40 amin'ny alΓ lan'ny rohy mpandova mivantana mandra-pahatonganao 100.

Aoka hatao hoe mahita mpandimby M ianao ary manana N nodes ny hazo. Ny fitadiavana node manokana dia mitentina log(N) toy ny hazo teo aloha. Saingy rehefa azonao ity node ity dia hahazo mpandimby M amin'ny M ​​operations miaraka amin'ireo mpandimby azy ianao. M+log(N) ihany no vidin'ity fikarohana ity asa raha oharina amin'ny asa N teo amin'ny hazo teo aloha. Ankoatra izany, tsy mila mamaky ny hazo feno ianao (M+log(N) nodes), izay midika fa kely kokoa ny fampiasana kapila. Raha kely ny M (ohatra 200 andalana) ary N lehibe (1 andalana), dia hisy fahasamihafana lehibe.

Saingy misy olana vaovao eto (indray!). Raha manampy na mamafa andalana iray ao amin'ny angon-drakitra ianao (ary noho izany ao amin'ny index B+Tree mifandraika):

  • tsy maintsy mitazona ny filaminana eo anelanelan'ny node ao anatin'ny B+Tree ianao, raha tsy izany dia tsy ho hitanao ny node ao anaty hazo tsy voasoroka.
  • tsy maintsy mitazona ny isan'ny ambaratonga ambany indrindra amin'ny B+Tree ianao, raha tsy izany dia lasa O(N) ny fahasarotan'ny fotoana O(log(N)).

Raha lazaina amin'ny teny hafa, ny B+Tree dia tsy maintsy mahafehy tena sy mandanjalanja. Soa ihany fa azo atao izany amin'ny famafana marani-tsaina sy ny fampidirana. Saingy misy vidiny izany: ny fampidirana sy ny famafana amin'ny hazo B+ dia mitentina O(log(N)). Izany no nahatonga ny sasany aminareo nandre izany tsy hevitra tsara ny mampiasa index be loatra. tena, ianao dia miadana haingana ny fampidirana/fanavaozana/famafana andalana iray ao anaty latabatrasatria ny angon-drakitra dia mila manavao ny tondron'ny latabatra amin'ny fampiasana O(log(N)) lafo vidy ho an'ny tondro tsirairay. Ankoatr'izay, ny fampidirana index dia midika hoe enta-mavesatra kokoa ho an'ny mpitantana ny varotra (holazaina any amin'ny faran'ny lahatsoratra).

Raha mila fanazavana fanampiny dia azonao jerena ny lahatsoratra Wikipedia momba ny B+Tree. Raha mila ohatra amin'ny fampiharana B+Tree amin'ny angon-drakitra ianao dia jereo ity lahatsoratra ity ΠΈ ity lahatsoratra ity avy amin'ny mpamorona MySQL malaza. Samy mifantoka amin'ny fomba itondran'ny InnoDB (ny motera MySQL) ny index.

Fanamarihana: Nilaza tamiko ny mpamaky iray fa, noho ny fanatsarana ambany kokoa, ny hazo B+ dia tokony handanjalanja tanteraka.

Hashtable

Ny rafitra angon-drakitra manan-danja farany dia ny latabatra hash. Tena ilaina izany rehefa te hijery haingana ny soatoavina ianao. Ankoatr'izay, ny fahatakarana ny latabatra hash dia hanampy antsika amin'ny fahatakarana ny fiasan'ny database iraisana antsoina hoe hash join ( hash join). Ity rafitra angon-drakitra ity dia ampiasain'ny angon-drakitra mba hitahirizana zavatra anatiny (oh. latabatra hidin-trano na dobo buffer, ho hitantsika any aoriana ireo hevitra roa ireo).

Ny latabatra hash dia rafitra angon-drakitra izay mahita haingana singa iray mifototra amin'ny fanalahidiny. Mba hamoronana tabilao hash dia mila mamaritra ianao:

  • manan-danja ho an'ny singanao
  • asa hash ho an'ny fanalahidy. Ny hash key computed dia manome ny toerana misy ireo singa (antsoina hoe fizarana ).
  • asa fampitahana fanalahidy. Rehefa hitanao ny fizarana marina dia tsy maintsy mahita ny singa tadiavinao ao anatin'ilay fizarana mampiasa an'io fampitahana io ianao.

Ohatra tsotra

Andeha isika haka ohatra mazava:

Ahoana ny fiasan'ny angon-drakitra mifandraika (fizarana 1)

Ity latabatra hash ity dia misy fizarana 10. Satria kamo aho dia 5 ihany no naka sary, fa fantatro fa hendry ianao, dia avelako sary an-tsaina ny 5 hafa. Nampiasa hash function modulo 10 amin'ny fanalahidy aho. Raha lazaina amin'ny teny hafa, ny isa farany amin'ny fanalahidin'ny singa ihany no tahiriziko mba hahitana ny ampahany:

  • raha 0 ny isa farany dia latsaka ao anatin'ny fizarana 0 ny singa,
  • raha 1 ny isa farany dia latsaka ao anatin'ny fizarana 1 ny singa,
  • raha 2 ny isa farany dia latsaka ao amin'ny faritra 2 ny singa,
  • ...

Ny fampitahana nampiasaiko dia ny fitovian'ny isa roa fotsiny.

Andeha atao hoe te hahazo singa 78 ianao:

  • Ny latabatra hash dia manisa ny code hash ho an'ny 78, izany hoe 8.
  • Ny latabatra hash dia mijery ny fizarana 8, ary ny singa voalohany hitany dia 78.
  • Averiny aminao ny laharana faha-78
  • Fikarohana 2 ihany no sandan'ny asa (ny iray hanombantombana ny sandan'ny hash ary ny iray hijerena ny singa ao anatin'ilay fizarana).

Andeha atao hoe te hahazo singa 59 ianao:

  • Ny latabatra hash dia manisa ny code hash ho an'ny 59, izany hoe 9.
  • Ny tabilao hash dia mikaroka ao amin'ny fizarana 9, ny singa voalohany hita dia 99. Hatramin'ny 99!=59, ny singa 99 dia tsy singa manan-kery.
  • Amin'ny fampiasana lojika mitovy, dia raisina ny singa faharoa (9), ny fahatelo (79), ..., ny farany (29).
  • Singa tsy hita.
  • Nahatratra 7 ny asa fikarohana.

Fampiasa hash tsara

Araka ny hitanao, miankina amin'ny sanda tadiavinao dia tsy mitovy ny vidiny!

Raha ovaiko izao ny hash function modulo 1 amin'ny lakile (izany hoe, maka ny isa 000 farany), ny fitadiavana faharoa dia mitentina 000 fotsiny satria tsy misy singa ao amin'ny fizarana 6. Ny tena fanamby dia ny fitadiavana asa hash tsara izay hamorona siny misy singa vitsivitsy.

Amin'ny ohatra nataoko dia mora ny mahita asa hash tsara. Saingy ohatra tsotra ity, sarotra kokoa ny fitadiavana asa hash tsara raha ny fanalahidy dia:

  • string (ohatra - anarana)
  • Andalana 2 (ohatra - anarana sy anarana)
  • 2 andalana sy daty (ohatra - anarana, anarana sy daty nahaterahana)
  • ...

Miaraka amin'ny fiasan'ny hash tsara, ny vidin'ny fitadiavana latabatra hash O(1).

Array vs hash table

Nahoana no tsy mampiasa array?

Hmm, fanontaniana tsara.

  • Ny latabatra hash dia mety ho ampidirina ao anaty fitadidiana ny ampahany, ary ny ampahany sisa dia afaka mijanona ao amin'ny kapila.
  • Miaraka amin'ny array dia tsy maintsy mampiasa toerana mifanakaiky amin'ny fitadidiana ianao. Raha mametraka latabatra lehibe ianao tena sarotra ny mahita toerana tsy tapaka ampy.
  • Ho an'ny latabatra tenifototra dia azonao atao ny misafidy ny lakile tianao (ohatra, firenena sy anaran'olona).

Raha mila fanazavana fanampiny dia afaka mamaky ny lahatsoratra momba ny JavaHashMap, izay fampiharana mahomby amin'ny latabatra hash; tsy mila mahazo an'i Java ianao vao mahazo ireo hevitra voaresaka ato amin'ity lahatsoratra ity.

Source: www.habr.com

Add a comment