Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Hello, Habr! Waxaan dareenkaaga ku soo bandhigayaa tarjumaad maqaalka
"Sidee buu u shaqeeyaa kaydka xogta ee xidhiidhka".

Marka ay timaado xog-ururinta la xidhiidha ma caawin karo laakiin waxaan u malaynayaa inay wax maqan yihiin. Meel walba waa la adeegsadaa. Waxaa jira xog ururin badan oo kala duwan oo la heli karo, laga bilaabo SQLite yar oo faa'iido leh ilaa Teradata xoogga leh. Laakiin waxaa jira maqaallo kooban oo sharxaya sida xogtu u shaqeyso. Waxaad ku raadin kartaa naftaada adoo isticmaalaya "howdoesarelationaldatabasework" si aad u aragto inta ay le'eg tahay natiijooyinka ay jiraan. Waxaa intaa dheer, maqaalladani waa gaaban yihiin. Haddii aad raadinayso tignoolajiyada buzzy ugu dambeeyay (BigData, NoSQL ama JavaScript), waxaad ka heli doontaa maqaallo qoto dheer oo sharaxaya sida ay u shaqeeyaan.

Xogta la xidhiidha ma yihiin kuwo duug ah oo caajis badan in lagu sharaxo ka baxsan koorsooyinka jaamacadda, waraaqaha cilmi baarista iyo buugaagta?

Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Horumariye ahaan, waan necbahay isticmaalka wax aanan fahmin. Oo haddii xogta macluumaadka la isticmaalay in ka badan 40 sano, waa in ay jirto sabab. Sanado badan, waxaan ku qaatay boqolaal saacadood si aan si dhab ah u fahmo sanduuqyada madow ee qariibka ah ee aan isticmaalo maalin kasta. Xog-ururinta xidhiidhka aad u xiiso badan sababtoo ah waxay ku salaysan fikrado faa'iido leh oo dib loo isticmaali karo. Haddii aad xiisaynayso inaad fahanto kaydka kaydka, laakiin aanad waligaa wakhti u helin ama u janjeedhin inaad mawduucan balaadhan u dhex gasho, waa inaad ku raaxaysataa maqaalkan.

Inkastoo ciwaanka maqaalkani uu yahay mid cad, Ujeedada maqaalkani ma aha in la fahmo sida loo isticmaalo database-ka. Haddaba, waa inaad hore u ogaatay sida loo qoro codsi xidhiidh fudud iyo waydiimo aasaasi ah RAW; haddii kale waxaa laga yaabaa inaadan fahmin maqaalkan. Taasi waa waxa kaliya ee aad u baahan tahay inaad ogaato, waxaan sharxi doonaa inta kale.

Waxaan ku bilaabi doonaa qaar ka mid ah aasaaska sayniska kombiyuutarka, sida kakanaanta wakhtiga algorithms (BigO). Waan ogahay in qaarkiin ay neceb yihiin fikraddan, laakiin la'aanteed ma awoodid inaad fahamto qallafsanaanta ku jirta xogta macluumaadka. Maadaama kani yahay mawduuc weyn, Waxaan diirada saari doonaa waxa aan isleeyahay waa muhiim: sida database-ku u shaqeeyo SQL weydiin. Kaliya waan soo bandhigi doonaa fikradaha aasaasiga ah databasesi dhamaadka maqaalka aad fikrad uga hesho waxa ka socda daboolka hoostiisa.

Maadaama kani yahay maqaal dheer oo farsamo oo ku lug leh algorithms iyo qaab dhismeedka xogta, qaado wakhtigaaga si aad u akhrido. Fikradaha qaar ayaa laga yaabaa inay adagtahay in la fahmo; waad ka boodi kartaa iyaga oo weli waad heli kartaa fikradda guud.

Inta aqoonta badan ee idinka mid ah, maqaalkani waxa uu u qaybsan yahay 3 qaybood:

  • Dulmar guud ee qaybaha xogta hoose iyo heerka sare
  • Dulmar guud ee Habka Wanaajinta weydiinta
  • Dulmar guud oo ku saabsan Maareynta Ganacsiga iyo Barkadda Buffer

Ku noqo aasaaskii

Sannado ka hor (Galaxy fog, fog...), horumariyayaashu waxay ku qasbanaadeen inay ogaadaan tirada hawlgallada ay codaynayeen. Wadnaha ayay ku ogaayeen algorithms-kooda iyo qaab-dhismeedka xogta sababtoo ah ma awoodaan inay khasaariyaan CPU iyo xusuusta kombiyuutaradooda gaabis ah.

Qaybtan, waxaan ku xasuusin doonaa qaar ka mid ah fikradahan maadaama ay lama huraan u yihiin fahamka xogta xogta. Waxaan sidoo kale soo bandhigi doonaa fikradda database index.

O(1) vs O(n2)

Maalmahan, horumariyayaal badan ayaan dan ka lahayn kakanaanta wakhtiga algorithms... waana sax!

Laakiin marka aad la tacaalayso xog badan (ma hadlayo kumanyaal) ama haddii aad ku dhibtoonayso millise seconds, waxa ay noqonaysaa muhiim inaad fahamto fikraddan. Iyo sida aad qiyaasi karto, xog ururintu waa inay la tacaalaan labada xaaladoodba! Ka dhigi maayo inaad ku bixiso wakhti ka badan lagama maarmaanka ah si aad u fahanto nuxurka. Tani waxay naga caawin doontaa inaan fahanno fikradda hagaajinta ku salaysan kharashka hadhow (qiimaha ku saleysan Hagaajinta).

Fikrad

Kakanaanta wakhtiga algorithm loo isticmaalo si loo arko inta algorithm ay qaadan doonto si loo dhamaystiro qadarka xogta ah. Si loo qeexo kakanaantan, waxaanu isticmaalnaa qoraal xisaabeed weyn oo O. Tilmaantan waxa loo adeegsaday hawl qeexaysa inta hawlgal ee algorithm u baahan yahay tiro la soo galiyo.

Tusaale ahaan, marka aan idhaahdo "algorithmiyaddani waxay leedahay kakanaanta O(some_function())", waxay la macno tahay in algorithmisku uu u baahan yahay hawlo qaar (a_certain_amount_of_data) si loo farsameeyo xaddi xog ah.

Sayidka Ma aha cadadka xogta waxa muhiimka ah**, haddii kale ** sida tirada hawlgaladu u korodho iyadoo korodhka mugga xogta. Kakanaanta wakhtiga ma bixiso tiro sax ah oo hawlgal ah, laakiin waa hab fiican oo lagu qiyaaso wakhtiga fulinta.

Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Jaantuskan waxaad ku arki kartaa tirada hawlgallada iyo tirada xogta gelinta ee noocyada kala duwan ee kakanaanta wakhtiga algorithm. Waxaan isticmaalay cabirka logarithmic si aan u muujiyo. Si kale haddii loo dhigo, qadarka xogta ayaa si dhakhso ah uga kordheysa 1 ilaa 1 bilyan. Waxaan arki karnaa taas:

  • O(1) ama kakanaanta joogtada ahi waa joogto (haddii kale lama odhan karo kakanaanta joogtada ah).
  • O(gasho(n)) weli hooseeyo xitaa balaayiin xog ah.
  • Dhibaatada ugu xun - O(n2), halkaas oo tirada hawlgallada ay si degdeg ah u korto.
  • Labada dhibane ee kale waxay u kordhaan si dhakhso ah.

tusaalooyin

Iyada oo tiro yar oo xog ah, farqiga u dhexeeya O(1) iyo O(n2) waa mid dayacan. Tusaale ahaan, aan nidhaahno waxaad leedahay algorithm u baahan in lagu farsameeyo 2000 oo curiye.

  • Algorithm-ka O(1) wuxuu kugu kici doonaa 1 qalliin
  • Algorithm-ka O(log(n)) ayaa kugu kici doona 7 hawlood
  • Algorithm-ka O(n) wuxuu kugu kici doonaa 2 oo hawlgal ah
  • Algorithm-ka O(n*log(n)) wuxuu kugu kici doonaa 14 oo hawlgal ah
  • Algorithm-ka O(n2) wuxuu kugu kici doonaa 4 hawlgal

Farqiga u dhexeeya O(1) iyo O(n2) waxa uu u muuqdaa mid weyn (4 milyan oo hawlgal) laakiin waxa aad waayi doontaa ugu badnaan 2 ms, wakhtigaas oo ah wakhtiga aad indhahaaga libiqsanayso. Runtii, processor-rada casriga ah ayaa farsamayn kara boqollaal milyan oo hawlgal ilbiriqsikii. Tani waa sababta waxqabadka iyo tayaynta aysan ahayn arrin ku jirta mashruucyo badan oo IT ah.

Sida aan sheegay, weli waa muhiim in la ogaado fikraddan marka la shaqeynayo tiro badan oo xog ah. Haddi wakhtigan algorithmistu ay tahay in ay farsamayso 1 curiye (taas oo aan sidaa u badnayn kaydka xogta):

  • Algorithm-ka O(1) wuxuu kugu kici doonaa 1 qalliin
  • Algorithm-ka O(log(n)) ayaa kugu kici doona 14 hawlood
  • Algorithm-ka O(n) wuxuu kugu kici doonaa 1 hawlgal
  • Algorithm-ka O(n*log(n)) wuxuu kugu kici doonaa 14 oo hawlgal ah
  • Algorithm-ka O(n2) wuxuu kugu kici doonaa 1

Ma aanan samayn xisaabta, laakiin waxaan dhihi lahaa in O(n2) algorithm aad haysato wakhti aad ku cabto qaxwo (xitaa laba!). Haddii aad ku darto 0 kale mugga xogta, waxaad heli doontaa wakhti aad ku seexato.

Aan sii qoto dheeraano

Tixraac:

  • Miiska xashiishka ee wanaagsan wuxuu ka helaa curiye O(1).
  • Raadinta geed dheellitiran waxay soo saartaa natiijooyinka O(log(n)).
  • Raadinta array waxay soo saartaa natiijooyinka O(n).
  • Algorithms-yada ugu fiican waxay leeyihiin kakanaanta O(n*log(n)).
  • Algorithm-soocidda xun waxay leedahay kakanaanta O(n2).

Fiiro gaar ah: Qaybaha soo socda waxaan ku arki doonaa algorithms-yadan iyo qaab-dhismeedka xogta.

Waxaa jira dhowr nooc oo kakanaanta waqtiga algorithm:

  • celceliska kiis scenario
  • xaaladda ugu fiican
  • iyo xaaladda ugu xun

Kakanaanta wakhtiga inta badan waa xaalada ugu xun.

Kaliya waxaan ka hadlayay kakanaanta waqtiga algorithm, laakiin kakanaanta sidoo kale waxay khuseysaa:

  • isticmaalka xusuusta algorithm
  • disk I/O isticmaalka algorithm

Dabcan, waxaa jira dhibaatooyin ka daran n2, tusaale ahaan:

  • n4: tani waa wax laga cabsado! Qaar ka mid ah algorithms-yada la sheegay ayaa leh kakan.
  • 3n: tani waa ka sii daran! Mid ka mid ah algorithms-yada aan ku arki doono bartamaha maqaalkan ayaa leh kakanaantan (oo dhab ahaantii waxaa loo isticmaalaa xog-ururin badan).
  • factorial n: waligaa ma heli doontid natiijadaada xitaa qadar yar oo xog ah.
  • nn: Haddii aad la kulanto kakankan, waa inaad isweydiisaa haddii tani runtii tahay goobtaada waxqabadka

Fiiro gaar ah: Kuma aan siin qeexida dhabta ah ee magacaabista weyn ee O, kaliya fikrad. Waxaad ka akhrisan kartaa maqaalkan at Wikipedia qeexida dhabta ah (asymptotic).

Isku-dhafka

Maxaad sameyneysaa marka aad u baahan tahay inaad kala soocdo aruurinta? Waa maxay? Waxaad wacdaa nooca() function... Ok, jawaab wanaagsan... Laakin xog ururinta, waa inaad fahantaa sida shaqada noocaan ahi u shaqeyso.

Waxaa jira dhowr algorithms kala soocida wanaagsan, markaa waxaan diiradda saari doonaa kuwa ugu muhiimsan: isku darso. Waxaa laga yaabaa inaadan fahmin sababta kala-soocidda xogta ay faa'iido u leedahay hadda, laakiin waa inaad ka dib qaybta hagaajinta weydiinta. Waxaa intaa dheer, fahamka isku-dhafka isku-dhafka ayaa naga caawin doona hadhow inaan fahamno xogta ku biirista xogta guud ee la yiraahdo isku dar biiro (ururka midaynta).

Isku dar

Si la mid ah algorithms-ka faa'iido badan, isku-darka noocu wuxuu ku tiirsan yahay khiyaamo: isku darka 2 hannaan oo la kala soocay oo cabbirka N/2 ah oo la isku daray N-element oo la soocay kharashyada N oo keliya. Hawlgalkan waxaa loo yaqaan isku-dhafka.

Aan ku aragno tan macnaheedu yahay tusaale fudud:

Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Jaantuskani wuxuu muujinayaa in si aad u dhisto 8-element array ee ugu dambeeya, waxaad u baahan tahay oo kaliya inaad hal mar ku celceliso 2 4-element arrays. Mar haddii labada qaybood ee 4-cunsur mar hore la kala soocay:

  • 1) waxaad is barbardhigtaa labada walxood ee hadda jira laba qaybood (bilowga hadda = marka hore)
  • 2) ka dibna qaado kan ugu yar si aad ugu dhejiso 8 element array
  • 3) oo u gudub curiyaha xiga ee shaxanka oo aad qaadatay curiyaha ugu yar
  • oo ku celi 1,2,3 ilaa aad ka gaarto qaybta u dambaysa ee mid ka mid ah hababkii.
  • Kadibna waxaad soo qaadanaysaa walxaha hadhay ee shaxanka kale si aad ugu dhejiso 8 curiye.

Tani waxay u shaqeysaa sababtoo ah labada qaybood ee 4-element waa la kala soocay sidaas darteed uma baahnid inaad "ku laabato" safafkaas.

Hadda oo aan fahannay khiyaamada, waa kan pseudocode-kayga ee isku darka:

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;

Isku-darka kala-soocidda waxay u jebisaa mushkiladda dhibaatooyin yaryar ka dibna waxay helaysaa natiijooyinka dhibaatooyinka yaryar si ay u helaan natiijada dhibkii asalka ahaa (xusuusnow: Algorithm-ka noocan ah waxaa loo yaqaannaa qaybin iyo guul). Haddii aadan fahmin algorithm-kan, ha ka welwelin; Maan fahmin markii ugu horeysay ee aan arko. Haddii ay ku caawin karto, waxaan u arkaa algorithm-kan sida algorithm laba-waji ah:

  • Marxaladda qaybinta, halkaas oo hannaanku u qaybsan yahay habab yaryar
  • Marxaladda kala-soocidda waa halka habab yaryar la isku geeyo (iyadoo la adeegsanayo ururka) si loo sameeyo hannaan weyn.

Marxaladda qaybinta

Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Marxaladda qaybinta, arraygu wuxuu u qaybsan yahay hannaan midaysan oo 3 tallaabo ah. Tirada rasmiga ah ee tillaabooyinka waa log(N) (tan iyo N=8, log(N) = 3).

Sideen ku garan karaa tan?

Waxaan ahay garaad! Eray ahaan - xisaabta. Fikradda ayaa ah in tallaabo kasta ay u qaybiso cabbirka array-ga asalka ah 2. Tirada tillaabooyinka waa tirada jeer ee aad u qaybin karto shaxanka asalka ah laba. Tani waa qeexida saxda ah ee logarithm (saldhigga 2).

Marxaladda kala-soocidda

Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Marxaladda kala-soocidda, waxaad ku bilaabaysaa habab midaysan (hal-element). Inta lagu jiro tillaabo kasta waxaad dalbataa hawlgallo isku-darka badan, wadarta kharashkana waa N = 8 hawlgal:

  • Marxaladda koowaad waxaad haysataa 4 isku-dar ah oo midkiiba ku kacayo 2 qalliin
  • Talaabada labaad waxaad haysataa 2 isku dar ah oo midkiiba ku kacayo 4 hawlgal
  • Talaabada saddexaad waxaad leedahay 1 isku dar ah oo qiimahoodu yahay 8 hawlgal

Mar haddii ay jiraan talaabooyin log(N), wadarta qiimaha N * hawlaha log(N)..

Faa'iidooyinka isku-dhafka ah

Waa maxay sababta algorithm kani u awood badan yahay?

Sababtoo ah:

  • Waxaad u beddeli kartaa si aad u yarayso raad-reebka xusuusta si aanad u abuurin arraysyo cusub balse aad si toos ah wax uga bedesho habka wax gelinta.

Fiiro gaar ah: Algorithm noocan oo kale ah ayaa loo yaqaan in-meel (kala-soocida iyada oo aan lahayn xasuus dheeraad ah).

  • Waxaad u bedeli kartaa si aad u isticmaasho booska diskka iyo qadar yar oo xusuusta ah isku mar adiga oo aan ku dhicin diskka muhiimka ah ee I/O. Fikradda ayaa ah in lagu shubo xusuusta oo keliya qaybaha hadda la shaqeynayo. Tani waa muhiim marka aad u baahan tahay inaad kala soocdo miis badan oo gigabyte ah oo leh kaliya 100-megabyte kayd kayd ah.

Fiiro gaar ah: Algorithm noocan oo kale ah ayaa loo yaqaan nooc dibadda ah.

  • Waxaad u bedeli kartaa si uu ugu shaqeeyo habab badan/threads/servers.

Tusaale ahaan, noocyada isku-dhafka la qaybiyey waa mid ka mid ah qaybaha muhiimka ah Hadoop (taas oo ah qaab-dhismeedka xogta weyn).

  • Algorithm-kani wuxuu u rogi karaa sunta rasaasta dahab (dhab ahaantii!).

Algorithm-ka-soociddan waxa lagu isticmaalaa inta badan (haddii aanay ahayn dhammaan) xog ururinta, laakiin maaha ka keliya. Haddii aad rabto inaad wax badan ogaato, waad akhrin kartaa kan shaqada cilmi-baarista, kaas oo ka hadlaya faa'iidooyinka iyo khasaarooyinka kala soocidda xogta guud ee algorithms.

Array, Geed iyo miiska xashiishka

Hadda oo aan fahamno fikradda kakanaanta wakhtiga iyo kala-soocidda, waa inaan kuu sheego 3 qaab-dhismeedka xogta. Tani waa muhiim sababtoo ah iyaga waa saldhigga keydka xogta casriga ah. Waxaan sidoo kale soo bandhigi doonaa fikradda database index.

Array

Qaabka laba-geesoodka ah ayaa ah qaabka xogta ugu fudud. Miis waxaa loo malayn karaa inuu yahay hannaan. Tusaale ahaan:

Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Qaabka 2-cabbirka leh waa miis leh saf iyo tiirar:

  • Xariiq kastaa wuxuu matalaa qayb
  • Tiirarka waxay kaydiyaan guryaha qeexaya cidda.
  • Tiir kastaa waxa uu kaydiyaa xogta nooc gaar ah (integer, string, date...).

Tani waxay ku habboon tahay kaydinta iyo muuqaalka xogta, si kastaba ha ahaatee, markaad u baahan tahay inaad hesho qiimo gaar ah, tani kuma habboona.

Tusaale ahaan, haddii aad rabto inaad hesho dhammaan ragga ka shaqeeya UK, waxaad u baahan doontaa inaad eegto saf kasta si aad u go'aamiso haddii safkaas uu ka tirsan yahay UK. Waxay kugu kici doontaa N wax kala iibsigahalkaas oo N - tirada xariiqyada, taas oo aan xumayn, laakiin ma jiri kartaa hab degdeg ah? Hadda waa waqtigii aan geedaha baran lahayn.

Fiiro gaar ah: Inta badan xog-ururinta casriga ahi waxa ay bixiyaan habab la dheereeyey oo loogu kaydin karo miisaska si hufan: miisas-ku-habboon iyo jaantusyo habaysan. Laakiin tani ma beddeleyso dhibaatada si deg deg ah loo helo xaalad gaar ah koox tiirar ah.

Geedka xogta iyo tusmada

Geedka raadinta binary waa geed binary ah oo leh hanti gaar ah, furaha nood kasta waa inuu ahaadaa:

  • ka weyn dhammaan furayaasha ku kaydsan geed hoosaadka bidix
  • in ka yar dhammaan furayaasha ku kaydsan geed hoosaadka saxda ah

Aan aragno waxa tani ka dhigan tahay muuqaal ahaan

Fikradda

Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Geedkani wuxuu leeyahay N = 15 curiye. Aynu nidhaahno waxaan raadinayaa 208:

  • Waxaan ka bilaabayaa xididka furihiisa uu yahay 136. Laga soo bilaabo 136<208, waxaan eegayaa midigta hoose ee noode 136.
  • 398>208 sidaas darteed waxaan eegayaa bidixda hoose ee noode 398
  • 250>208 sidaas darteed waxaan eegayaa bidixda hoose ee noode 250
  • 200<208, sidaas darteed waxaan eegayaa midigta hoose ee noodhka 200. Laakiin 200 ma laha wax qumman. qiimo ma jiro (maxaa yeelay haddii ay jirto, waxay ku jiri doontaa geed hoosaadka saxda ah 200).

Hadda aan nidhaahno waxaan raadinayaa 40

  • Waxaan ka bilaabayaa xididka furihiisa uu yahay 136. Laga soo bilaabo 136> 40, waxaan eegayaa bidixda hoose ee noode 136.
  • 80> 40, markaa waxaan eegayaa bidixda hoose ee noodhka 80
  • 40= 40, noodh jira. Waxaan dib u soo ceshadaa aqoonsiga safka ee gudaha noodhka (oo aan sawirka ku muuqan) oo waxaan ka eegi shaxda aqoonsiga safka ee la bixiyay.
  • Ogaanshaha aqoonsiga safka ayaa ii ogolaanaya inaan si sax ah u ogaado halka ay xogta ku taal miiska, si aan isla markiiba u soo saaro.

Dhamaadka, labada baaritaanba waxay igu kici doonaan tirada heerarka geedka dhexdiisa. Haddii aad si taxadar leh u akhrido qaybta ku saabsan isku-dhafka, waa inaad aragto inay jiraan heerarka log(N). Waxaa soo baxday, Qiimaha raadinta (N), ma xuma!

Aan u soo noqono dhibkeena

Laakiin tani waa wax aan la taaban karin, markaa aan u soo laabano dhibkayaga. Halkii aad ka heli lahayd tiro fudud, qiyaas xadhig u taagan waddanka qof ee shaxda hore. Aynu nidhaahno waxaad haysaa geed ka kooban beerta "dalka" (tiirka 3) ee miiska:

  • Haddii aad rabto inaad ogaato cidda ka shaqeysa UK
  • waxaad eegtaa geedka si aad u hesho noodhka ka dhigan Great Britain
  • Gudaha "UKnode" waxaad ka heli doontaa goobta diiwaanka shaqaalaha UK.

Raadintan waxay ku kacaysaa hawlgallada log(N) halkii ay ka ahaan lahayd hawlgallada N haddii aad si toos ah u isticmaashid shaxanka. Waxa aad hadda soo bandhigtay ayaa ahaa database index.

Waxaad u dhisi kartaa geed index koox kasta oo garoomo ah (xadhig, nambar, 2 xariiq, nambar iyo xadhig, taariikhda...) ilaa iyo inta aad leedahay hawl isbarbardhigga furayaasha (sida kooxaha garoonka) si aad u dejisan kartaa. ka dalbo furayaasha dhexdooda (taas oo ah kiiska nooc kasta oo aasaasiga ah ee kaydka xogta).

B+TreeIndex

Inkasta oo geedkani si fiican ugu shaqeeyo helitaanka qiimo gaar ah, waxaa jira dhibaato weyn markaad u baahan tahay hel xubno badan oo u dhexeeya laba qiime. Tani waxay ku kici doontaa O (N) sababtoo ah waa inaad fiirisaa noode kasta oo geedka ku yaal oo aad hubiso inay u dhexeyso labadan qiyam (tusaale amar lagu amray geedka). Intaa waxaa dheer, qalliinkani maaha mid saxan I/O saaxiibtinimo maadaama ay tahay inaad akhrido geedka oo dhan. Waxaan u baahanahay inaan helno hab aan si hufan u fulino codsi kala duwan. Si loo xalliyo dhibaatadan, xog-ururinta casriga ahi waxay adeegsadaan geedkii hore oo la beddelay oo la beddelay oo la yidhaahdo B+Tree. Geedka B+ Geedka:

  • kaliya qanjidhada ugu hooseeya (caleemaha) kaydinta macluumaadka (meesha safafka ee shaxda la xidhiidha)
  • inta kale ee noodhka ayaa halkan jooga daabulka uda saxda ah inta lagu guda jiro raadinta.

Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Sida aad arki karto, waxaa jira noodes badan halkan (laba jeer). Runtii, waxaad haysataa qanjidhada dheeraadka ah, "nodes go'aan", kaas oo kaa caawin doona inaad hesho noodhka saxda ah (kaas oo kaydiya goobta safafka ee miiska la xidhiidha). Laakin kakanaanta raadinta wali waa O(log(N)) (waxaa jira hal heer oo kaliya). Farqiga weyni waa kaas qanjidhada heerka hoose waxay ku xidhan yihiin kuwa ka dambeeya.

Geedkan B +, haddii aad raadinayso qiyamka u dhexeeya 40 iyo 100:

  • Kaliya waxaad u baahan tahay inaad raadiso 40 (ama qiimaha ugu dhow 40 ka dib haddii 40 aysan jirin) sida aad ku samaysay geedkii hore.
  • Kadibna soo aruuri 40 dhaxle adiga oo isticmaalaya xiriiriyaha dhaxalka tooska ah ilaa aad ka gaarto 100.

Aynu nidhaahno waxaad heshay M ku-xigeen, geedkuna wuxuu leeyahay N nodes. Helitaanka kharshka noodhka gaarka ah log(N) sida geedkii hore. Laakiin marka aad hesho noodhkan, waxa aad ku heli doontaa M ku-xigeennada ee Hawlaha iyaga oo tixraacaya kuwa beddelaya. Raadintan kaliya waxay ku kacaysaa M+log(N) hawlgallada marka la barbar dhigo hawlgallada N ee geedkii hore. Waxaa intaa dheer, uma baahnid inaad akhrido geedka buuxa (kaliya M+log(N) nodes), taas oo macnaheedu yahay isticmaalka diskka oo yar. Haddii M yar yahay (tusaale 200 saf) oo N weyn yahay (1 saf), farqi weyn ayaa jiri doona.

Laakiin waxaa jira dhibaatooyin cusub halkan (mar kale!). Haddii aad ku darto ama tirtirto saf ku jira kaydka xogta (iyo sidaas awgeed tusmada B+Tree ee la xidhiidha):

  • Waa inaad ilaalisaa nidaamka u dhexeeya qanjidhada B+Tree, haddii kale ma awoodid inaad ka hesho noodhka gudaha geed aan la kala soocin.
  • Waa inaad ku haysaa tirada ugu yar ee suurtogalka ah ee heerarka B+Tree, haddii kale kakanaanta wakhtiga O(log(N)) waxay noqotaa O(N).

Si kale haddii loo dhigo, B+Tree waa in uu ahaado mid is-dalbanaya oo isku dheeli tiran. Nasiib wanaag, tani waxay suurtogal u tahay tirtirka smart oo geli hawlgallada. Laakiin tani waxay ku timaadaa kharash: gelinta iyo tirtirida qiimaha geedka B+ O(log(N)). Waa sababta qaarkiin taas u maqashay Isticmaalka tusmooyin badan fikrad fiican maaha. Runtii, waxaad si degdeg ah u gaabinaysaa gelista/cusboonaynta/ tirtirida safka miiska ku jirasababtoo ah xog-ururintu waxay u baahan tahay inay cusboonaysiiso tusmooyinka miiska iyadoo la isticmaalayo hawlgal qaali ah oo O(log(N) ah oo tusmo kasta ah. Intaa waxaa dheer, ku darida tusmooyinka waxay ka dhigan tahay culeys shaqo oo dheeraad ah maamulaha wax kala iibsiga (waxaa lagu sharxi doonaa dhamaadka maqaalka).

Faahfaahin dheeraad ah, waxaad arki kartaa maqaalka Wikipedia B+Tree. Haddii aad rabto tusaale fulinta B+Tree ee kaydka xogta, eeg maqaalkan и maqaalkan laga bilaabo horumariyaha MySQL ee hormuudka ah. Labaduba waxay diiradda saaraan sida InnoDB (matoorka MySQL) u maamulo tusmooyinka.

Fiiro gaar ah: Akhriste ayaa ii sheegay sababtoo ah hagaajinta heerka hoose, geedka B+ waa inuu noqdaa mid isku dheelitiran.

Hashtable

Qaab dhismeedka xogta muhiimka ah ee ugu dambeeya waa miiska xashiishka. Tani aad bay faa'iido u leedahay markaad rabto inaad si degdeg ah u eegto qiyamka. Waxaa intaa dheer, fahamka miiska xashiishka ayaa naga caawin doona hadhow inaan fahamno xogta ku biirista xogta guud ee loo yaqaan 'hash join' ( xashiish ku biir). Qaab dhismeedka xogtan waxa kale oo ay isticmaashaa kaydka xogta si ay u kaydiso qaar ka mid ah waxyaabaha gudaha ah (tusaale. miiska quful ama barkadda kaydka, waxaan arki doonaa labadan fikradood gadaal).

Shaxda xashiishku waa qaab-dhismeedka xogta si dhakhso ah u hela shay furihiisa. Si aad u dhisto miiska xashiishka waxaad u baahan tahay inaad qeexdo:

  • furaha curiyayaashaada
  • shaqada xashiishka furayaasha. Xashiishyada furaha la xisaabiyay waxay siinayaan meesha curiyayaasha (loo yaqaan qaybaha ).
  • shaqeynta isbarbardhigga furayaasha. Markaad hesho qaybta saxda ah, waa inaad ka dhex heshaa qaybta aad ka raadinayso qaybta adoo isticmaalaya isbarbardhigga.

Tusaale fudud

Aan tusaale cad soo qaadano:

Sida Xogta Xidhiidhku u Shaqeeyaan (Qaybta 1)

Shaxda xashiishka ayaa ka kooban 10 qaybood. Sababtoo ah caajis baan ahay, kaliya waxaan sawiray 5 qaybood, laakiin waxaan ogahay inaad caqli badan tahay, markaa waxaan kuu ogolaanayaa inaad sawirto 5 kale adiga. Waxaan isticmaalay hab-shaqeedka xashiishka modulo 10 ee furaha. Si kale haddii loo dhigo, waxaan kaydiyaa lambarka ugu dambeeya ee furaha curiyaha si aan u helo qaybtiisa:

  • haddii lambarka u dambeeya uu yahay 0, curiyaha wuxuu u dhacayaa qaybta 0,
  • haddii lambarka u dambeeya uu yahay 1, curiyaha wuxuu u dhacayaa qaybta 1,
  • haddii lambarka ugu dambeeya uu yahay 2, curiyaha wuxuu ku dhacayaa aagga 2,
  • ...

Shaqada isbarbardhigga ee aan isticmaalay waa sinaanta u dhaxaysa laba tirooyin.

Aynu nidhaahno waxaad doonaysaa inaad hesho curiyaha 78:

  • Jadwalka xashiishku wuxuu xisaabiyaa koodhka xashiishka ee 78, kaas oo ah 8.
  • Shaxda xashiishku waxa ay eegtaa qaybta 8, cunsurka ugu horeeya ee ay heshona waa 78.
  • Waxay kuu soo celisaa shayga 78
  • Goobiddu waxay ku kacaysaa 2 hawlood oo keliya (mid si loo xisaabiyo qiimaha xashiishka iyo kan kale si loo eego curiyaha qaybta).

Hadda aan nidhaahno waxaad doonaysaa inaad hesho curiyaha 59:

  • Jadwalka xashiishku wuxuu xisaabiyaa koodhka xashiishka ee 59, kaas oo ah 9.
  • Shaxda xashiishku waxa ay ka raadisaa qaybta 9, curiyaha ugu horeeya ee la helay waa 99. Tan iyo 99!=59, element 99 ma aha cunsur sax ah.
  • Iyadoo isla macquul ah la adeegsanayo, ayaa la qaadayaa cunsurka labaad (9), ta saddexaad (79), ..., kan u dambeeya (29).
  • Qayb lama helin
  • Baadhitaanku wuxuu ku kacay 7 hawlgal.

Shaqada xashiishka wanaagsan

Sida aad arki karto, iyada oo ku xidhan qiimaha aad raadinayso, kharashku isku mid maaha!

Haddii aan hadda beddelo shaqada xashiishka modulo 1 ee furaha (taas oo ah, qaadashada 000da lambar ee ugu dambeeya), raadinta labaad kaliya waxay ku kacaysaa 000 hawlgal maadaama aysan jirin curiye qaybta 6. Caqabadda dhabta ah waa in la helo shaqo xashiish wanaagsan oo abuuri doonta baaldiyo ay ku jiraan tiro aad u yar oo walxo ah.

Tusaalahayga, helida shaqo xashiish wanaagsan waa sahlan tahay. Laakin kani waa tusaale fudud, in la helo shaqo xashiish oo wanaagsan aad ayay u adagtahay marka furuhu yahay:

  • xadhig (tusaale ahaan - magaca dambe)
  • 2 sadar (tusaale ahaan - magaca dambe iyo magaca hore)
  • 2 sadar iyo taariikhda (tusaale ahaan - magaca dambe, magaca koowaad iyo taariikhda dhalashada)
  • ...

Iyada oo leh shaqo xashiish oo wanaagsan, miiska raadinta xashiishku waa O(1).

Array vs miiska xashiishka

Waa maxay sababta aan loo isticmaalin diyaarin?

Hmm, su'aal wanaagsan.

  • Miiska xashiishka wuxuu noqon karaa qayb ahaan lagu shubay xusuusta, iyo qaybaha soo haray waxay ku sii jiri karaan saxanka.
  • Qalabaynta waa inaad isticmaashaa meel bannaan oo iskuxiran oo xusuusta ah. Haddii aad ku shubanayso miis weyn aad bay u adagtahay in la helo meel ku filan oo joogto ah.
  • Miiska xashiishka, waxaad dooran kartaa furaha aad rabto (tusaale, waddanka iyo magaca dambe ee qofka).

Wixii macluumaad dheeraad ah, waxaad ka akhrisan kartaa maqaalka ku saabsan JavaHashMap, kaas oo si hufan u fulinaya miiska xashiishka; uma baahnid inaad fahanto Java si aad u fahanto fikradaha ku xusan maqaalkan.

Source: www.habr.com

Add a comment