Cara Kerja Database Relasional (Bagian 1)

Hey Habr! Aku menehi perhatian marang terjemahan artikel kasebut
"Carane database relasional bisa digunakake".

Nalika nerangake database relasional, aku ora bisa mikir yen ana sing ilang. Padha digunakake ing ngendi wae. Ana akeh database beda kasedhiya, saka SQLite cilik lan migunani kanggo Teradata kuat. Nanging mung ana sawetara artikel sing nerangake cara kerja database. Sampeyan bisa nelusuri dhewe nggunakake "howdoesarelationaldatabasework" kanggo ndeleng carane sawetara asil ana. Kajaba iku, artikel iki cendhak. Yen sampeyan nggoleki teknologi buzzy paling anyar (BigData, NoSQL utawa JavaScript), sampeyan bakal nemokake artikel sing luwih jero sing nerangake cara kerjane.

Apa database relasional banget lawas lan mboseni kanggo diterangake ing njaba kursus universitas, makalah riset lan buku?

Cara Kerja Database Relasional (Bagian 1)

Minangka pangembang, aku sengit nggunakake soko aku ora ngerti. Lan yen database wis digunakake luwih saka 40 taun, mesthi ana alesan. Sajrone pirang-pirang taun, aku wis ngentekake atusan jam kanggo ngerteni kothak ireng aneh sing digunakake saben dina. Database relasional menarik banget amarga padha adhedhasar konsep migunani lan bisa digunakake maneh. Yen sampeyan kepengin ngerti database, nanging ora tau duwe wektu utawa karep kanggo nliti topik sing wiyar iki, sampeyan kudu seneng artikel iki.

Senajan judhul artikel iki eksplisit, tujuan artikel iki ora kanggo mangerteni carane nggunakake database. Akibate, sampeyan kudu wis ngerti carane nulis panjalukan sambungan prasaja lan pitakonan dhasar RAW; Yen ora, sampeyan bisa uga ora ngerti artikel iki. Mung iku sing perlu sampeyan ngerti, aku bakal nerangake liyane.

Aku bakal miwiti karo sawetara dhasar ilmu komputer, kayata kerumitan wektu algoritma (BigO). Aku ngerti sawetara sing sengit konsep iki, nanging tanpa iku sampeyan ora bakal bisa ngerti intricacies nang database. Amarga iki topik gedhe, Aku bakal fokus ing sing tak pikir penting: carane proses database SQL pitakon. Aku mung ngenalake konsep basis data dhasarsupaya ing pungkasan artikel sampeyan duwe gagasan babagan apa sing kedadeyan ing ngisor hood.

Amarga iki minangka artikel sing dawa lan teknis sing kalebu akeh algoritma lan struktur data, gunakake wektu kanggo maca. Sawetara konsep bisa uga angel dimangerteni; sampeyan bisa ngliwati lan isih entuk gagasan umum.

Kanggo sing luwih ngerti ing antarane sampeyan, artikel iki dibagi dadi 3 bagean:

  • Ringkesan komponen basis data tingkat rendah lan dhuwur
  • Ringkesan Proses Optimasi Kueri
  • Ringkesan Manajemen Transaksi lan Buffer Pool

Bali menyang dhasar

Taun kepungkur (ing galaksi sing adoh, adoh ...), pangembang kudu ngerti persis jumlah operasi sing dikode. Dheweke ngerti algoritma lan struktur data kanthi ati-ati amarga ora bisa mbuwang CPU lan memori komputer sing alon.

Ing bagean iki, aku bakal ngelingake sawetara konsep kasebut amarga penting kanggo mangerteni database. Aku uga bakal introduce konsep indeks database.

O(1) vs O(n2)

Saiki, akeh pangembang ora peduli babagan kerumitan wektu algoritma ... lan bener!

Nanging nalika sampeyan lagi dealing karo akèh data (Aku ora ngomong ewu) utawa yen sampeyan lagi berjuang ing milliseconds, iku dadi kritis kanggo ngerti konsep iki. Lan kaya sing sampeyan bayangake, database kudu ngatasi loro kahanan kasebut! Aku ora bakal nggawe sampeyan nglampahi wektu liyane saka perlu kanggo njaluk titik tengen. Iki bakal mbantu kita ngerti konsep optimasi adhedhasar biaya mengko (biaya adhedhasar Optimization).

Konsep

Kerumitan wektu algoritma digunakake kanggo ndeleng suwene algoritma bakal rampung kanggo jumlah data tartamtu. Kanggo njlèntrèhaké kerumitan iki, kita nggunakake notasi matématika O amba. Notasi iki digunakake karo fungsi sing njlèntrèhaké carane akeh operasi algoritma perlu kanggo nomer input tartamtu.

Contone, nalika aku ngomong "algoritma iki wis kerumitan O (some_function ())", iku tegese algoritma mbutuhake some_function (a_certain_amount_of_data) operasi kanggo proses jumlah tartamtu saka data.

mangkono Sing penting dudu jumlah data**, yen ora ** carane jumlah operasi mundhak karo nambah volume data. Kompleksitas wektu ora nyedhiyakake jumlah operasi sing tepat, nanging minangka cara sing apik kanggo ngira wektu eksekusi.

Cara Kerja Database Relasional (Bagian 1)

Ing grafik iki sampeyan bisa ndeleng jumlah operasi versus jumlah data input kanggo macem-macem jinis kerumitan wektu algoritma. Aku nggunakake skala logaritma kanggo nampilake. Ing tembung liya, jumlah data kanthi cepet mundhak saka 1 nganti 1 milyar. Kita bisa ndeleng manawa:

  • O(1) utawa kerumitan konstan tetep konstan (yen ora bakal diarani kerumitan konstan).
  • O(log(n)) tetep kurang sanajan karo milyaran data.
  • Kesulitan paling awon - O(n2), ing ngendi jumlah operasi mundhak kanthi cepet.
  • Loro komplikasi liyane mundhak kanthi cepet.

conto

Kanthi jumlah data sing cilik, prabédan antarane O (1) lan O (n2) bisa diabaikan. Contone, umpamane sampeyan duwe algoritma sing kudu ngolah 2000 unsur.

  • Algoritma O(1) bakal biaya 1 operasi
  • Algoritma O(log(n)) bakal biaya 7 operasi
  • Algoritma O(n) bakal biaya 2 operasi
  • Algoritma O(n*log(n)) bakal biaya 14 operasi
  • Algoritma O(n2) bakal biaya 4 operasi

Bentenipun antarane O (1) lan O (n2) katon amba (4 yuta operasi) nanging sampeyan bakal kelangan maksimum 2 ms, mung wektu kanggo kedhip mata. Pancen, prosesor modern bisa ngolah atusan yuta operasi per detik. Mulane kinerja lan optimasi ora dadi masalah ing akeh proyek IT.

Kaya sing dakkandhakake, isih penting kanggo ngerti konsep iki nalika nggarap data sing akeh banget. Yen wektu iki algoritma kudu ngolah 1 unsur (sing ora akeh kanggo database):

  • Algoritma O(1) bakal biaya 1 operasi
  • Algoritma O(log(n)) bakal biaya 14 operasi
  • Algoritma O(n) bakal biaya 1 operasi
  • Algoritma O(n*log(n)) bakal biaya 14 operasi
  • Algoritma O(n2) bakal biaya 1 operasi

Aku wis ora rampung math, nanging Aku ngomong sing karo O (n2) algoritma sampeyan duwe wektu kanggo ngombe kopi (malah loro!). Yen sampeyan nambahake 0 liyane menyang volume data, sampeyan bakal duwe wektu kanggo turu.

Ayo luwih jero

Kanggo referensi:

  • Panelusuran tabel hash sing apik nemokake unsur ing O (1).
  • Nggoleki wit sing seimbang ngasilake asil ing O(log(n)).
  • Nggoleki larik ngasilake asil ing O(n).
  • Algoritma ngurutake paling apik duwe kerumitan O(n*log(n)).
  • Algoritma ngurutake ala nduweni kerumitan O(n2).

Cathetan: Ing bagean ing ngisor iki kita bakal weruh algoritma lan struktur data kasebut.

Ana sawetara jinis kerumitan wektu algoritma:

  • skenario kasus rata-rata
  • skenario paling apik
  • lan skenario paling awon

Kerumitan wektu asring dadi skenario paling awon.

Aku mung ngomong babagan kerumitan wektu algoritma, nanging kerumitan uga ditrapake kanggo:

  • konsumsi memori saka algoritma
  • algoritma konsumsi disk I / O

Mesthi, ana komplikasi sing luwih elek tinimbang n2, contone:

  • n4: iki elek! Sawetara algoritma kasebut duwe kerumitan iki.
  • 3n: iki luwih elek! Salah sawijining algoritma sing bakal kita deleng ing tengah artikel iki nduweni kerumitan iki (lan bener digunakake ing akeh database).
  • faktorial n: sampeyan ora bakal entuk asil sanajan kanthi jumlah data sing sithik.
  • nn: Yen sampeyan nemoni kerumitan iki, sampeyan kudu takon dhewe apa iki pancen lapangan kegiatan sampeyan ...

Cathetan: Aku ora menehi definisi nyata babagan sebutan O gedhe, mung ide. Sampeyan bisa maca artikel iki ing Wikipedia kanggo definisi nyata (asimtotik).

MergeSort

Apa sing kudu ditindakake nalika sampeyan kudu ngurutake koleksi? opo? Sampeyan nelpon fungsi Urut () ... Ok, jawaban apik ... Nanging kanggo database, sampeyan kudu ngerti carane iki () fungsi fungsi.

Ana sawetara algoritma pangurutan sing apik, mula aku bakal fokus ing sing paling penting: nggabung urut. Sampeyan bisa uga ora ngerti kenapa ngurutake data migunani saiki, nanging sampeyan kudu sawise bagean optimasi pitakon. Kajaba iku, pangerten merge sort bakal mbantu kita ngerti operasi gabungan database umum sing diarani nggabung Gabung (asosiasi merger).

Gabung

Kaya pirang-pirang algoritma sing migunani, ngurutake gabungan gumantung ing trik: nggabungake 2 larik sing diurutake ukuran N/2 dadi array sing diurutake unsur N mung biaya operasi N. Operasi iki diarani gabung.

Ayo ndeleng apa tegese karo conto prasaja:

Cara Kerja Database Relasional (Bagian 1)

Tokoh iki nuduhake yen kanggo mbangun array 8-elemen sing diurutake pungkasan, sampeyan mung kudu ngulang sapisan liwat 2 array 4-elemen. Amarga loro 4-elemen array wis diurutake:

  • 1) sampeyan mbandhingake loro unsur saiki ing rong susunan (ing wiwitan saiki = pisanan)
  • 2) banjur njupuk sing paling cilik kanggo sijine menyang 8 unsur Uploaded
  • 3) lan pindhah menyang unsur sabanjuré ing Uploaded ngendi sampeyan njupuk unsur paling cilik
  • lan baleni 1,2,3 nganti sampeyan tekan unsur pungkasan siji saka susunan.
  • Banjur sampeyan njupuk unsur isih saka Uploaded liyane kanggo sijine menyang 8 unsur Uploaded.

Iki bisa digunakake amarga loro 4-elemen array diurutake lan sampeyan ora kudu "bali" ing array kasebut.

Saiki kita ngerti trik kasebut, iki pseudocode kanggo gabung:

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;

Gabung ngurutake ngilangi masalah dadi masalah sing luwih cilik lan banjur nemokake asil saka masalah sing luwih cilik kanggo entuk asil saka masalah asli (cathetan: algoritma jinis iki diarani divide and conquer). Yen sampeyan ora ngerti algoritma iki, aja padha sumelang; Aku ora ngerti nalika pisanan ndeleng. Yen bisa mbantu sampeyan, aku ndeleng algoritma iki minangka algoritma rong fase:

  • Fase divisi, ing ngendi array dipérang dadi array sing luwih cilik
  • Fase ngurutake yaiku ing ngendi array cilik digabungake (nggunakake union) kanggo mbentuk array sing luwih gedhe.

Fase divisi

Cara Kerja Database Relasional (Bagian 1)

Ing tataran divisi, array dipérang dadi array unitary ing 3 langkah. Jumlah langkah formal yaiku log(N) (wiwit N=8, log(N) = 3).

Kepiye carane aku ngerti iki?

Aku jenius! Ing tembung - matématika. Ing idea iku saben langkah dibagi ukuran Uploaded asli dening 2. Jumlah langkah iku nomer kaping sampeyan bisa dibagi Uploaded asli dadi loro. Iki minangka definisi sing tepat saka logaritma (basis 2).

Fase sortir

Cara Kerja Database Relasional (Bagian 1)

Ing fase ngurutake, sampeyan miwiti karo susunan kesatuan (elemen tunggal). Sajrone saben langkah sampeyan nggunakake sawetara operasi gabungan lan biaya total N = 8 operasi:

  • Ing tataran pisanan sampeyan duwe 4 merges sing biaya 2 operasi saben
  • Ing langkah kapindho sampeyan duwe 2 merges sing biaya 4 operasi saben
  • Ing langkah katelu sampeyan duwe 1 gabungan kang biaya 8 operasi

Amarga ana langkah log(N), total biaya N * operasi log(N)..

Kaluwihan saka merge sort

Yagene algoritma iki kuat banget?

Amarga:

  • Sampeyan bisa ngganti kanggo nyuda jejak memori supaya sampeyan ora nggawe larik anyar nanging langsung ngowahi larik input.

Cathetan: jinis algoritma iki diarani in-Panggonan (ngurutake tanpa memori tambahan).

  • Sampeyan bisa ngganti kanggo nggunakake spasi disk lan jumlah cilik saka memori ing wektu sing padha tanpa incurring disk I / O overhead signifikan. Ing idea iki kanggo mbukak menyang memori mung bagean sing saiki lagi diproses. Iki penting nalika sampeyan kudu ngurutake tabel multi-gigabyte mung karo buffer memori 100 megabyte.

Cathetan: jinis algoritma iki diarani Urut njaba.

  • Sampeyan bisa ngganti kanggo mbukak ing macem-macem pangolahan / thread / server.

Contone, urutan gabungan sing disebarake minangka salah sawijining komponen utama Hadoop (yaiku struktur ing data gedhe).

  • Algoritma iki bisa ngowahi timbal dadi emas (pancen!).

Algoritma ngurutake iki digunakake ing paling (yen ora kabeh) database, nanging ora mung siji. Yen sampeyan pengin ngerti liyane, sampeyan bisa maca iki karya riset, sing mbahas pro lan kontra saka algoritma pangurutan database umum.

Tabel Array, Wit lan Hash

Saiki kita ngerti ide babagan kerumitan wektu lan ngurutake, aku kudu ngandhani babagan 3 struktur data. Iki penting amarga padha minangka basis basis data modern. Aku uga bakal introduce konsep indeks database.

Array

Array loro-dimensi minangka struktur data sing paling gampang. Tabel bisa dianggep minangka array. Tuladhane:

Cara Kerja Database Relasional (Bagian 1)

Array 2 dimensi iki minangka tabel kanthi baris lan kolom:

  • Saben baris nggambarake entitas
  • Kolom nyimpen properti sing nggambarake entitas kasebut.
  • Saben kolom nyimpen data saka jinis tartamtu (integer, string, tanggal ...).

Iki trep kanggo nyimpen lan nggambarake data, nanging yen sampeyan kudu nemokake nilai tartamtu, iki ora cocog.

Contone, yen sampeyan pengin nemokake kabeh wong lanang sing kerja ing Inggris, sampeyan kudu ndeleng saben baris kanggo nemtokake manawa baris kasebut ana ing Inggris. Sampeyan bakal biaya N transaksingendi N - nomer baris, kang ora ala, nanging bisa ana cara luwih cepet? Saiki wayahe kita kenal karo wit-witan.

Cathetan: Umume database modern nyedhiyakake array lengkap kanggo nyimpen tabel kanthi efisien: heap-organizedtables lan index-organizedtables. Nanging iki ora ngganti masalah cepet nemokake kondisi tartamtu ing klompok kolom.

Pohon database lan indeks

Wit telusuran binar minangka wit binar kanthi properti khusus, kunci ing saben simpul kudu:

  • luwih gedhe tinimbang kabeh tombol sing disimpen ing subtree kiwa
  • kurang saka kabeh tombol sing disimpen ing subtree tengen

Ayo ndeleng apa tegese iki kanthi visual

Idea

Cara Kerja Database Relasional (Bagian 1)

Wit iki nduweni N = 15 unsur. Ayo ngomong aku nggoleki 208:

  • Aku miwiti ing ROOT sing kuncine 136. Wiwit 136<208, aku ndeleng subtree tengen simpul 136.
  • 398> 208 mula aku ndeleng subtree kiwa simpul 398
  • 250> 208 mula aku ndeleng subtree kiwa simpul 250
  • 200<208, mula aku ndeleng subtree tengen simpul 200. Nanging 200 ora duwe subtree tengen, nilai ora ana (amarga yen ana, bakal ana ing subtree tengen 200).

Saiki ayo ngomong yen aku nggoleki 40

  • Aku miwiti ing ROOT sing kuncine 136. Wiwit 136> 40, aku ndeleng subtree kiwa simpul 136.
  • 80> 40, mula aku ndeleng subtree kiwa simpul 80
  • 40= 40, simpul ana. Aku nompo ID baris nang simpul (ora ditampilake ing gambar) lan katon ing meja kanggo ID baris diwenehi.
  • Ngerti ID baris ngidini kula ngerti persis ing endi data ing tabel, supaya aku bisa langsung njupuk.

Pungkasane, loro telusuran bakal biaya aku nomer tingkat nang wit. Yen sampeyan maca bagean kasebut kanthi teliti, sampeyan kudu ndeleng manawa ana tingkat log (N). Pranyata, telusuran log biaya (N), ora ala!

Ayo bali menyang masalah kita

Nanging iki abstrak banget, mula ayo bali menyang masalah kita. Tinimbang integer prasaja, mbayangno senar sing makili negara wong ing tabel sadurungé. Contone, sampeyan duwe wit sing ngemot kolom "negara" (kolom 3) ing tabel:

  • Yen sampeyan pengin ngerti sapa sing kerja ing Inggris
  • sampeyan katon ing wit kanggo njaluk simpul sing makili Great Britain
  • nang "UKnode" sampeyan bakal nemokake lokasi cathetan buruh UK.

Panelusuran iki bakal biaya operasi log (N) tinimbang operasi N yen sampeyan nggunakake array langsung. Apa sampeyan mung presented indeks database.

Sampeyan bisa mbangun wit indeks kanggo sembarang klompok kolom (string, nomer, 2 baris, nomer lan string, tanggal ...) anggere sampeyan duwe fungsi kanggo mbandhingaké tombol (IE kelompok lapangan) supaya sampeyan bisa nyetel urutan antarane tombol (sing kasus kanggo jinis dhasar ing basis data).

B+TreeIndex

Nalika wit iki dianggo uga kanggo njupuk Nilai tartamtu, ana masalah BIG nalika sampeyan perlu entuk pirang-pirang unsur ing antarane rong nilai. Iki bakal biaya O(N) amarga sampeyan kudu ndeleng saben simpul ing wit lan priksa manawa ana ing antarane rong nilai kasebut (contone, kanthi traversal wit sing diurutake). Menapa malih, operasi iki ora disk I / O loropaken wiwit sampeyan kudu maca kabeh wit. Kita kudu golek cara kanggo nindakake kanthi efisien panjalukan sawetara. Kanggo ngatasi masalah iki, database modern nggunakake versi modifikasi saka wit sadurungé disebut B + Tree. Ing wit B+Tree:

  • mung simpul paling ngisor (godhong) informasi nyimpen (lokasi baris ing tabel sing gegandhengan)
  • liyane saka kelenjar kene kanggo nuntun menyang simpul sing bener sajrone panelusuran.

Cara Kerja Database Relasional (Bagian 1)

Kaya sing sampeyan ngerteni, ana luwih akeh kelenjar ing kene (kaping pindho). Pancen, sampeyan duwe simpul tambahan, "simpul keputusan", sing bakal mbantu sampeyan nemokake simpul sing bener (sing nyimpen lokasi baris ing tabel sing gegandhengan). Nanging kerumitan telusuran isih O(log(N)) (mung ana siji level maneh). Bentenipun gedhe iku simpul ing tingkat ngisor disambungake menyang penerus.

Kanthi B+Tree iki, yen sampeyan nggoleki nilai antarane 40 lan 100:

  • Sampeyan mung kudu nggoleki 40 (utawa nilai paling cedhak sawise 40 yen 40 ora ana) kaya sing ditindakake ing wit sadurunge.
  • Banjur kumpulake 40 ahli waris nggunakake tautan ahli waris langsung nganti tekan 100.

Contone, sampeyan nemokake penerus M lan wit kasebut duwe N simpul. Nemokake log biaya simpul tartamtu (N) kaya wit sadurunge. Nanging yen sampeyan entuk simpul iki, sampeyan bakal entuk penerus M ing operasi M kanthi referensi kanggo peneruse. Panelusuran iki mung biaya M+log(N) operasi dibandhingake N operasi ing wit sadurungé. Menapa malih, sampeyan ora kudu maca wit lengkap (mung M + log (N) simpul), kang tegese kurang panggunaan disk. Yen M cilik (contone 200 larik) lan N gedhe (1 larik), bakal ana prabédan BIG.

Nanging ana masalah anyar ing kene (maneh!). Yen sampeyan nambah utawa mbusak baris ing database (lan mulane ing indeks B+Tree sing gegandhengan):

  • sampeyan kudu njaga supaya antarane kelenjar nang B + Wit, yen ora, sampeyan ora bakal bisa nemokake kelenjar nang wit unsorted.
  • sampeyan kudu tetep nomer minimal bisa tingkat ing B + Tree, digunakake O (log (N)) kerumitan wektu dadi O (N).

Ing tembung liya, B + Tree kudu mandhiri lan seimbang. Untunge, iki bisa ditindakake kanthi operasi delete lan insert sing cerdas. Nanging iki ana biaya: sisipan lan pambusakan ing biaya wit B + O(log(N)). Mulane sawetara sing wis krungu nggunakake indeks sing akeh banget ora apik. tenan, sampeyan alon-alon nglebokake / nganyari / mbusak baris ing tabelamarga database kudu nganyari indeks tabel nggunakake operasi O (log(N)) larang kanggo saben indeks. Kajaba iku, nambah indeks tegese luwih akeh beban kerja manager transaksi (bakal diterangake ing pungkasan artikel).

Kanggo rincian liyane, sampeyan bisa ndeleng artikel Wikipedia ing B+Wit. Yen sampeyan pengin conto ngleksanakake B + Tree ing database, delengen artikel iki и artikel iki saka pangembang MySQL terkemuka. Loro-lorone fokus babagan carane InnoDB (mesin MySQL) nangani indeks.

Cathetan: A maca ngandhani yen, amarga optimasi tingkat rendah, wit B + kudu seimbang.

Hashtable

Struktur data penting pungkasan yaiku tabel hash. Iki migunani banget yen sampeyan pengin cepet nggoleki nilai. Kajaba iku, ngerteni tabel hash bakal mbantu kita ngerti operasi gabungan database umum sing diarani gabungan hash ( hash gabung). Struktur data iki uga digunakake dening database kanggo nyimpen sawetara bab internal (contone. meja kunci utawa blumbang panyangga, kita bakal weruh loro konsep kasebut mengko).

Tabel hash minangka struktur data sing cepet nemokake unsur kanthi kunci. Kanggo nggawe tabel hash sampeyan kudu nemtokake:

  • ключ kanggo unsur sampeyan
  • fungsi hash kanggo tombol. Hash tombol sing diitung menehi lokasi unsur (disebut perangan ).
  • fungsi kanggo mbandhingaké tombol. Sawise sampeyan nemokake bagean sing bener, sampeyan kudu nemokake unsur sing sampeyan goleki ing bagean kasebut kanthi nggunakake perbandingan iki.

Tuladha prasaja

Ayo njupuk conto sing jelas:

Cara Kerja Database Relasional (Bagian 1)

Tabel hash iki nduweni 10 segmen. Soale aku kesed, aku mung nggambar 5 segmen, nanging aku ngerti sampeyan pinter, mula aku bakal nggambar 5 liyane dhewe. Aku nggunakake fungsi hash modulo 10 tombol. Ing tembung liya, aku mung nyimpen digit pungkasan saka kunci unsur kanggo nemokake segmen kasebut:

  • yen digit pungkasan 0, unsur kasebut dadi segmen 0,
  • yen digit pungkasan 1, unsur kasebut dadi segmen 1,
  • yen digit pungkasan yaiku 2, unsur kasebut tiba ing area 2,
  • ...

Fungsi perbandingan sing digunakake mung kesetaraan antarane rong integer.

Contone, sampeyan pengin njaluk unsur 78:

  • Tabel hash ngitung kode hash kanggo 78, yaiku 8.
  • Tabel hash katon ing bagean 8, lan unsur pisanan sing ditemokake yaiku 78.
  • Dheweke bali item 78 kanggo sampeyan
  • Biaya panelusuran mung 2 operasi (siji kanggo ngetung nilai hash lan liyane kanggo nggoleki unsur ing bagean kasebut).

Saiki ayo ngomong sampeyan pengin njaluk unsur 59:

  • Tabel hash ngitung kode hash kanggo 59, yaiku 9.
  • Tabel hash nggoleki ing segmen 9, unsur pisanan sing ditemokake yaiku 99. Wiwit 99!=59, unsur 99 dudu unsur sing bener.
  • Nggunakake logika sing padha, unsur kapindho (9), katelu (79), ..., pungkasan (29) dijupuk.
  • Unsur ora ditemokake.
  • Panelusuran biaya 7 operasi.

Fungsi hash sing apik

Nalika sampeyan bisa ndeleng, gumantung ing Nilai sing looking for, biaya ora padha!

Yen saiki aku ngganti fungsi hash modulo 1 tombol (yaiku, njupuk 000 digit pungkasan), panelusur kapindho mung biaya 000 operasi amarga ora ana unsur ing segmen 6. Tantangan nyata yaiku nemokake fungsi hash sing apik sing bakal nggawe ember sing ngemot unsur sing sithik banget.

Ing contoku, nemokake fungsi hash sing apik iku gampang. Nanging iki minangka conto sing gampang, nemokake fungsi hash sing apik luwih angel yen kuncine yaiku:

  • string (contone - jeneng mburi)
  • 2 baris (contone - jeneng mburi lan jeneng ngarep)
  • 2 baris lan tanggal (contone - jeneng mburi, jeneng ngarep lan tanggal lair)
  • ...

Kanthi fungsi hash sing apik, goleki tabel hash biaya O(1).

Array vs tabel hash

Apa ora nggunakake array?

Hmm, pitakonan apik.

  • Tabel hash bisa sebagian dimuat menyang memori, lan bagean sing isih bisa tetep ana ing disk.
  • Kanthi larik sampeyan kudu nggunakake papan sing cedhak ing memori. Yen sampeyan ngemot meja gedhe iku banget angel kanggo golek papan terus cukup.
  • Kanggo tabel hash, sampeyan bisa milih tombol sing dikarepake (contone, negara lan jeneng mburi wong).

Kanggo informasi luwih lengkap, sampeyan bisa maca artikel babagan JawaHashmap, yaiku implementasine efisien saka tabel hash; sampeyan ora perlu ngerti basa Jawa kanggo ngerti konsep sing dibahas ing artikel iki.

Source: www.habr.com

Add a comment