Hash-tabel i datastruktur: Python Eksempel

Hvad er Hashing?

En hash er en vรฆrdi, der har en fast lรฆngde, og den genereres ved hjรฆlp af en matematisk formel. Hash-vรฆrdier bruges i datakomprimering, kryptologi osv. Ved dataindeksering bruges hashvรฆrdier, fordi de har en fast lรฆngdestรธrrelse uanset de vรฆrdier, der blev brugt til at generere dem. Det fรฅr hashvรฆrdier til at optage minimal plads sammenlignet med andre vรฆrdier af varierende lรฆngde.

En hash-funktion anvender en matematisk algoritme til at konvertere nรธglen til en hash. En kollision opstรฅr, nรฅr en hash-funktion producerer den samme hashvรฆrdi for mere end รฉn nรธgle.

Hvad er en Hash-tabel?

A HASH TABEL er en datastruktur, der gemmer vรฆrdier ved hjรฆlp af et par nรธgler og vรฆrdier. Hver vรฆrdi er tildelt en unik nรธgle, der genereres ved hjรฆlp af en hash-funktion.

Navnet pรฅ nรธglen bruges til at fรฅ adgang til dens tilknyttede vรฆrdi. Dette gรธr det meget hurtigt at sรธge efter vรฆrdier i en hash-tabel, uanset antallet af elementer i hash-tabellen.

Hash-funktioner

For eksempel, hvis vi รธnsker at gemme medarbejderregistreringer, og hver medarbejder er unikt identificeret ved hjรฆlp af et medarbejdernummer.

Vi kan bruge medarbejdernummeret som nรธglen og tildele medarbejderdataene som vรฆrdien.

Ovenstรฅende tilgang vil krรฆve ekstra ledig plads af stรธrrelsesordenen pรฅ (m * n2) hvor variablen m er stรธrrelsen af matrix, og variablen n er antallet af cifre for medarbejdernummeret. Denne tilgang introducerer et lagerpladsproblem.

En hash-funktion lรธser ovenstรฅende problem ved at hente medarbejdernummeret og bruge det til at generere en hash-heltalsvรฆrdi, faste cifre og optimere lagerplads. Formรฅlet med en hash-funktion er at skabe en nรธgle, der vil blive brugt til at referere til den vรฆrdi, vi รธnsker at gemme. Funktionen accepterer vรฆrdien, der skal gemmes, og bruger derefter en algoritme til at beregne vรฆrdien af โ€‹โ€‹nรธglen.

Det fรธlgende er et eksempel pรฅ en simpel hash-funktion

h(k) = k1 % m

HER,

  • h(k) er hash-funktionen, der accepterer en parameter k. Parameteren k er den vรฆrdi, som vi รธnsker at beregne nรธglen for.
  • k1 % m er algoritmen for vores hash-funktion, hvor k1 er den vรฆrdi, vi vil gemme, og m er stรธrrelsen pรฅ listen. Vi bruger modulusoperatoren til at beregne nรธglen.

Eksempel

Lad os antage, at vi har en liste med en fast stรธrrelse pรฅ 3 og fรธlgende vรฆrdier

[1,2,3]

Vi kan bruge ovenstรฅende formel til at beregne de positioner, som hver vรฆrdi skal besรฆtte.

Fรธlgende billede viser de tilgรฆngelige indekser i vores hash-tabel.

Hash-funktioner

Trin 1) Beregn den position, der vil blive besat af den fรธrste vรฆrdi som sรฅdan

h(1) = 1 % 3

= 1

Vรฆrdien 1 vil besรฆtte pladsen pรฅ indeks 1

Trin 2) Beregn den position, der vil blive optaget af den anden vรฆrdi

h(2) = 2 % 3

= 2

Vรฆrdien 2 vil besรฆtte pladsen pรฅ indeks 2

Trin 3) Beregn den position, der vil blive optaget af den tredje vรฆrdi.

h(3) = 3 % 3

= 0

Vรฆrdien 3 vil besรฆtte pladsen pรฅ indeks 0

Endeligt resultat

Vores udfyldte hash-tabel bliver nu som fรธlger.

Hash-funktioner

Kvaliteter ved en god hashfunktion

En god hashfunktion bรธr have fรธlgende egenskaber.

  • Formlen til generering af hashen skal bruge dataens vรฆrdi, der skal gemmes i algoritmen.
  • Hash-funktionen bรธr generere unikke hash-vรฆrdier selv for inputdata, der har samme mรฆngde.
  • Funktionen skal minimere antallet af kollisioner. Kollisioner opstรฅr, nรฅr den samme vรฆrdi genereres for mere end รฉn vรฆrdi.
  • Vรฆrdierne skal fordeles konsistent pรฅ tvรฆrs af alle mulige hashes.

Kollision

En kollision opstรฅr, nรฅr algoritmen genererer den samme hash for mere end รฉn vรฆrdi.

Lad os se pรฅ et eksempel.

Antag, at vi har fรธlgende liste over vรฆrdier

[3,2,9,11,7]

Lad os antage, at stรธrrelsen af โ€‹โ€‹hash-tabellen er 7, og vi vil bruge formlen (k1 % m) hvor m er stรธrrelsen af โ€‹โ€‹hashtabellen.

Fรธlgende tabel viser de hash-vรฆrdier, der vil blive genereret.

Nรธgle Hash-algoritme (k1 % m) Hash vรฆrdi
3 3% 7 3
2 3% 7 2
9 3% 7 2
11 3% 7 4
7 3% 7 0

Som vi kan se fra ovenstรฅende resultater, har vรฆrdierne 2 og 9 den samme hashvรฆrdi, og vi kan ikke gemme mere end รฉn vรฆrdi pรฅ hver position.

Det givne problem kan lรธses ved enten at bruge kรฆde eller sondere. De fรธlgende afsnit diskuterer kรฆde og sondering i detaljer.

Lรฆnkning

Kรฆdning er en teknik, der bruges til at lรธse kollisionsproblemet ved at bruge sammenkรฆdede lister, der hver har unikke indekser.

Fรธlgende billede visualiserer, hvordan en lรฆnket liste ser ud

Lรฆnkning

Bรฅde 2 og 9 optager det samme indeks, men de gemmes som sammenkรฆdede lister. Hver liste har en unik identifikator.

Fordele ved lรฆnkede lister

Fรธlgende er fordelene ved kรฆdede lister:

  • Kรฆdede lister har bedre ydeevne ved indsรฆttelse af data, fordi rรฆkkefรธlgen af โ€‹โ€‹indsรฆttelse er O(1).
  • Det er ikke nรธdvendigt at รฆndre stรธrrelsen pรฅ en hash-tabel, der bruger en kรฆdet liste.
  • Den kan nemt rumme et stort antal vรฆrdier, sรฅ lรฆnge der er ledig plads.

probing

Den anden teknik, der bruges til at lรธse kollision, er sondering. Nรฅr vi bruger sonderingsmetoden, kan vi, hvis der opstรฅr en kollision, simpelthen gรฅ videre og finde en tom plads til at gemme vores vรฆrdi.

Fรธlgende er metoderne til sondering:

Metode Beskrivelse
Lineรฆr sondering Ligesom navnet antyder, sรธger denne metode efter tomme pladser lineรฆrt startende fra den position, hvor kollisionen fandt sted og bevรฆger sig fremad. Hvis slutningen af โ€‹โ€‹listen er nรฅet, og der ikke findes nogen tom plads. Sonderingen starter i begyndelsen af โ€‹โ€‹listen.
Kvadratisk sondering Denne metode bruger kvadratiske polynomielle udtryk til at finde den nรฆste ledige plads.
Double hashing Denne teknik bruger en sekundรฆr hash-funktionsalgoritme til at finde den nรฆste ledige plads.

Ved at bruge vores ovenstรฅende eksempel vil hash-tabellen efter brug af sondering se ud som fรธlger:

probing

Hash tabel operationer

Her er de Operationer understรธttet af Hash-tabeller:

  • Indsรฆttelse - dette Operation bruges til at tilfรธje et element til hash-tabellen
  • Sรธgning - dette Operation bruges til at sรธge efter elementer i hash-tabellen ved hjรฆlp af tasten
  • Sletning - dette Operation bruges til at slette elementer fra hash-tabellen

Indsรฆttelse af data operation

Indsรฆt-operationen bruges til at gemme vรฆrdier i hash-tabellen. Nรฅr en ny vรฆrdi er gemt i hash-tabellen, tildeles den et indeksnummer. Indekstallet beregnes ved hjรฆlp af hash-funktionen. Hash-funktionen lรธser eventuelle kollisioner, der opstรฅr ved beregning af indekstallet.

Sรธg efter datadrift

Sรธgeoperationen bruges til at slรฅ vรฆrdier op i hash-tabellen ved hjรฆlp af indeksnummeret. Sรธgeoperationen returnerer den vรฆrdi, der er knyttet til sรธgeindeksnummeret. For eksempel, hvis vi gemmer vรฆrdien 6 ved indeks 2, vil sรธgeoperationen med indeksnummer 2 returnere vรฆrdien 6.

Slet datahandling

Sletningsoperationen bruges til at fjerne en vรฆrdi fra en hash-tabel. For at slette Operationen sker ved hjรฆlp af indeksnummeret. Nรฅr en vรฆrdi er blevet slettet, frigรธres indeksnummeret. Den kan bruges til at gemme andre vรฆrdier ved hjรฆlp af indsรฆttelsesoperationen.

Hash tabel implementering med Python Eksempel

Lad os se pรฅ et simpelt eksempel, der beregner hashvรฆrdien af โ€‹โ€‹en nรธgle

def hash_key( key, m):
    return key % m


m = 7

print(f'The hash value for 3 is {hash_key(3,m)}')
print(f'The hash value for 2 is {hash_key(2,m)}')
print(f'The hash value for 9 is {hash_key(9,m)}')
print(f'The hash value for 11 is {hash_key(11,m)}')
print(f'The hash value for 7 is {hash_key(7,m)}')

Forklaring af kode for hash-tabel

Forklaring af kode for hash-tabel

HER,

  1. Definerer en funktion hash_key, der accepterer parametrene nรธgle og m.
  2. Bruger en simpel moduloperation til at bestemme hashvรฆrdien
  3. Definerer en variabel m, der initialiseres til vรฆrdien 7. Dette er stรธrrelsen pรฅ vores hash-tabel
  4. Beregner og udskriver hashvรฆrdien pรฅ 3
  5. Beregner og udskriver hashvรฆrdien pรฅ 2
  6. Beregner og udskriver hashvรฆrdien pรฅ 9
  7. Beregner og udskriver hashvรฆrdien pรฅ 11
  8. Beregner og udskriver hashvรฆrdien pรฅ 7

Udfรธrelse af ovenstรฅende kode giver fรธlgende resultater.

The hash value for 3 is 3
The hash value for 2 is 2
The hash value for 9 is 2
The hash value for 11 is 4
The hash value for 7 is 0

Python Ordbogseksempel

Python leveres med en indbygget datatype kaldet Ordbog. En ordbog er et eksempel pรฅ en hash-tabel. Den gemmer vรฆrdier ved hjรฆlp af et par nรธgler og vรฆrdier. Hashvรฆrdierne genereres automatisk for os, og eventuelle kollisioner lรธses for os i baggrunden.

Fรธlgende eksempel viser, hvordan du kan bruge en ordbogsdatatype i python 3

employee = {
    'name': 'John Doe',
    'age': 36,
    'position': 'Business Manager.'
}

print (f"The name of the employee is {employee['name']}")
employee['position'] = 'Software Engineer'
print (f"The position of {employee['name']} is {employee['position']}")
employee.clear()

print (employee)

Python Ordbogseksempel

HER,

  1. Definerer en ordbogsvariabel medarbejder. Nรธglenavnet bruges til at gemme vรฆrdien John Doe, alder lagrer 36, og position gemmer vรฆrdien Business Manager.
  2. Henter vรฆrdien af โ€‹โ€‹nรธglenavnet og udskriver det i terminalen
  3. Opdaterer vรฆrdien af โ€‹โ€‹nรธglepositionen til vรฆrdien Software Engineer
  4. Udskriver vรฆrdierne for tasternes navn og position
  5. Sletter alle de vรฆrdier, der er gemt i vores ordbog variabel medarbejder
  6. Udskriver vรฆrdien af โ€‹โ€‹medarbejder

Kรธrsel af ovenstรฅende kode giver fรธlgende resultater.

The name of the employee is John Doe.
The position of John Doe is a Software Engineer.
{}

Kompleksitetsanalyse

Hash-tabeller har en gennemsnitlig tidskompleksitet pรฅ O (1) i det bedste tilfรฆlde. Den vรฆrste tidskompleksitet er O(n). Det vรฆrst tรฆnkelige scenarie opstรฅr, nรฅr mange vรฆrdier genererer den samme hash-nรธgle, og vi er nรธdt til at lรธse kollisionen ved at sondere.

Applikationer fra den virkelige verden

I den virkelige verden bruges hash-tabeller til at gemme data for

  • Databaser
  • Associative arrays
  • sรฆt
  • Memory cache

Fordele ved hash-tabeller

Her er fordele/fordele ved at bruge hashtabeller:

  • Hash-tabeller har hรธj ydeevne, nรฅr de slรฅr data op, indsรฆtter og sletter eksisterende vรฆrdier.
  • Tidskompleksiteten for hashtabeller er konstant uanset antallet af elementer i tabellen.
  • De klarer sig meget godt, selv nรฅr de arbejder med store datasรฆt.

Ulemper ved hashtabeller

Her er ulemperne ved at bruge hash-tabeller:

  • Du kan ikke bruge en null-vรฆrdi som en nรธgle.
  • Kollisioner kan ikke undgรฅs ved generering af nรธgler vha. hash-funktioner. Kollisioner opstรฅr, nรฅr en nรธgle, der allerede er i brug, genereres.
  • Hvis hashing-funktionen har mange kollisioner, kan dette fรธre til et fald i ydeevnen.

Resumรฉ

  • Hash-tabeller bruges til at gemme data ved hjรฆlp af et par nรธgler og vรฆrdier.
  • En hashfunktion bruger en matematisk algoritme til at beregne hashvรฆrdien.
  • En kollision opstรฅr, nรฅr den samme hashvรฆrdi genereres for mere end รฉn vรฆrdi.
  • Kรฆdning lรธser kollision ved at oprette linkede lister.
  • Sondering lรธser kollision ved at finde tomme pladser i hash-tabellen.
  • Lineรฆr sondering sรธger efter det nรฆste ledige slot for at gemme vรฆrdien startende fra det slot hvor kollisionen fandt sted.
  • Kvadratisk sondering bruger polynomielle udtryk til at finde den nรฆste ledige plads, nรฅr der opstรฅr en kollision.
  • Double hashing bruger en sekundรฆr hash-funktionsalgoritme til at finde det nรฆste ledige slot, nรฅr der opstรฅr en kollision.
  • Hash-tabeller har bedre ydeevne sammenlignet med andre datastrukturer.
  • Den gennemsnitlige tidskompleksitet for hashtabeller er O (1)
  • En ordbogsdatatype i python er et eksempel pรฅ en hash-tabel.
  • Hash-tabeller understรธtter indsรฆttelse, sรธgning og sletning.
  • En nulvรฆrdi kan ikke bruges som en indeksvรฆrdi.
  • Kollisioner kan ikke undgรฅs i hash-funktioner. En god hash-funktion minimerer antallet af kollisioner, der opstรฅr for at forbedre ydeevnen.

Opsummer dette indlรฆg med: