hash table c programs implement hash table
Овај водич објашњава Ц ++ хеш табеле и хеш мапе. Такође ћете научити о примени и примени хеш табела у Ц ++:
Хеширање је техника помоћу које можемо мапирати велику количину података у мању табелу помоћу „хеш функције“.
Користећи технику хеширања, можемо претраживати податке брже и ефикасније у поређењу са другим техникама претраживања попут линеарне и бинарне претраге.
Да разумемо технику хеширања на примеру из овог водича.
=> Прочитајте серију Еаси Ц ++ Траининг Сериес.
Шта ћете научити:
Хасхинг у Ц ++
Узмимо пример факултетске библиотеке у којој се налазе хиљаде књига. Књиге су распоређене према темама, одељењима итд. Али, ипак, сваки одељак ће имати бројне књиге које тиме чине претрагу књига изузетно тешком.
Стога, да бисмо превазишли ову потешкоћу, свакој књизи додељујемо јединствени број или кључ тако да одмах знамо где се књига налази. То се заиста постиже хеширањем.
Настављајући са нашим примером из библиотеке, уместо да идентификујемо сваку књигу на основу њеног одељења, предмета, одељка итд. Што може резултирати врло дугим низом, израчунавамо јединствену целобројну вредност или кључ за сваку књигу у библиотеци користећи јединствену функцију и чувајте ове кључеве у посебној табели.
Горе наведена јединствена функција назива се „Хасх функција“, а одвојена табела назива се „Хасх таблица“. Хасх функција се користи за мапирање дате вредности на одређени јединствени кључ у хеш табели. То резултира бржим приступом елементима. Што је ефикаснија функција хеширања ефикасније ће бити мапирање сваког елемента у јединствени кључ.
Размотримо хеш функцију х (к) која мапира вредност „ Икс ”У„ к% 10 ”У низу. За дате податке можемо направити хеш табелу која садржи кључеве или хеш кодове или хешеве како је приказано на доњем дијаграму.
На горњем дијаграму можемо видети да се уноси у низу пресликавају на своја места у хеш табели помоћу хеш функције.
Стога можемо рећи да се хеширање спроводи у два корака како је доле споменуто:
# 1) Вредност се претвара у јединствени целобројни кључ или хеш помоћу хеш функције. Користи се као индекс за чување оригиналног елемента, који спада у хеш табелу.
У горњем дијаграму, вредност 1 у хеш таблици је јединствени кључ за чување елемента 1 из низа података датих на ЛХС дијаграма.
#два) Елемент из низа података чува се у хеш таблици где се може брзо доћи помоћу хешираног кључа. У горњем дијаграму видели смо да смо ускладиштили све елементе у хеш табели након израчунавања њихових одговарајућих локација помоћу хеш функције. Следеће изразе можемо користити за преузимање хеш вредности и индекса.
hash = hash_func(key) index = hash % array_size
Хасх функција
Већ смо споменули да ефикасност мапирања зависи од ефикасности хеш функције коју користимо.
Хеш функција у основи треба да испуњава следеће захтеве:
- Једноставно за израчунавање: Хасх функција би требала бити једноставна за израчунавање јединствених кључева.
- Мање судара: Када се елементи изједначе са истим кључним вредностима, долази до судара. Требало би да има минималних колизија што је више могуће у хеш функцији која се користи. Како ће доћи до судара, морамо да користимо одговарајуће технике решавања судара да бисмо се побринули за сударе.
- Дистрибуција униформи: Хасх функција треба да резултира уједначеном расподелом података кроз хеш табелу и на тај начин спречава груписање.
Табела хеширања Ц ++
Табела хеширања или хеш мапа је структура података која чува показиваче на елементе оригиналног низа података.
У нашем примеру библиотеке, хеш табела за библиотеку садржаће показиваче на сваку од књига у библиотеци.
Имајући уносе у хеш табели олакшава се тражење одређеног елемента у низу.
Као што је већ виђено, хеш табела користи хеш функцију за израчунавање индекса у низ сегмената или слотова помоћу којих се може пронаћи жељена вредност.
Размотрите још један пример са следећим низом података:
Претпоставимо да имамо хеш табелу величине 10 као што је приказано доле:
Сада искористимо хеш функцију која је дата у наставку.
Hash_code = Key_value % size_of_hash_table
Ово ће се изједначити са Хасх_цоде = Кључна_вредност% 10
Користећи горњу функцију, мапирамо кључне вредности на локације хеш табеле, као што је приказано доле.
Ставка података | Хасх функција | Хасх_цоде |
---|---|---|
22 | 22% 10 = 2 | два |
25 | 25% 10 = 5 | 5 |
27 | 27% 10 = 7 | 7 |
46 | 46% 10 = 6 | 6 |
70 | 70% 10 = 0 | 0 |
89 | 89% 10 = 9 | 9 |
31 | 31% 10 = 1 | 1 |
Користећи горњу табелу, хеш таблицу можемо представити на следећи начин.
Дакле, када треба да приступимо елементу из хеш табеле, биће потребно само О (1) време да претражимо.
основна ХТМЛ и ЦСС питања за интервјуе
Судар
Обично израчунавамо хеш код помоћу хеш функције тако да можемо пресликати вредност кључа на хеш код у хеш табели. У горњи пример низа података убацимо вредност 12. У том случају, хасх_цоде за кључну вредност 12 биће 2. (12% 10 = 2).
Али у хеш табели већ имамо мапирање на кључ / вредност 22 за хасх_цоде 2, као што је приказано доле:
Као што је горе приказано, имамо исти хеш код за две вредности, 12 и 22, тј. 2. Када се једна или више кључних вредности изједначе на истој локацији, то резултира колизијом. Према томе, локацију хасх кода већ заузима једна вредност кључа, а постоји још једна вредност кључа коју треба поставити на исто место.
У случају хеширања, чак и ако имамо хеш табелу врло велике величине, судар ће сигурно бити присутан. То је зато што уопште проналазимо малу јединствену вредност за велики кључ, па је стога потпуно могуће да једна или више вредности имају исти хеш-код у било ком тренутку.
С обзиром на то да је колизија неизбежна у хеширању, увек бисмо требали тражити начине да спречимо или решимо колизију. Постоје разне технике решавања колизије које можемо користити за решавање колизије која се догоди током хеширања.
Технике решавања судара
Следе технике које можемо користити за решавање колизије у хеш табели.
Одвојени ланци (отворено хеширање)
Ово је најчешћа техника решавања судара. Ово је такође познато као отворено хеширање и примењује се помоћу повезане листе.
У засебној техници уланчавања, сваки унос у хеш табелу је повезана листа. Када се кључ подудара са хасх кодом, он се уноси на листу која одговара том одређеном хасх коду. Дакле, када два кључа имају исти хасх код, тада се оба уноса уносе на повезану листу.
За горњи пример, одвојено уланчавање је представљено у наставку.
Горњи дијаграм представља уланчавање. Овде користимо функцију мод (%). Видимо да када се две кључне вредности изједначе са истим хеш-кодом, онда повезујемо ове елементе са тим хеш-кодом помоћу повезане листе.
Ако су кључеви равномерно распоређени по хеш табели, тада просечна цена тражења одређеног кључа зависи од просечног броја кључева на тој повезаној листи. Стога раздвојени ланци остају на снази чак и када се повећа број уноса него слотова.
Најгори случај за одвојено уланчавање је када се сви кључеви изједначавају са истим хеш-кодом и тако се убацују само у једну повезану листу. Стога морамо да потражимо све уносе у хеш табелу и трошкове који су пропорционални броју кључева у табели.
Линеарно сондирање (отворено адресирање / затворено хеширање)
У техници отвореног адресирања или линеарног сондирања, сви уноси се чувају у самој хеш табели. Када се кључ-вредност преслика на хеш код и позиција на коју указује хеш код није заузета, тада се вредност кључа убацује на ту локацију.
Ако је позиција већ заузета, помоћу секвенце сондирања вредност кључа се убацује у следећу позицију која је незаузета у хеш табели.
За линеарно сондирање, хасх функција се може променити како је приказано доле:
хасх = хасх% хасхТаблеСизе
хасх = (хасх + 1)% хасхТаблеСизе
хасх = (хасх + 2)% хасхТаблеСизе
хасх = (хасх + 3)% хасхТаблеСизе
Видимо да је у случају линеарног сондирања интервал између прореза или узастопних сонди константан, тј. 1.
На горњем дијаграму видимо да је у 0тхлокација уносимо 10 помоћу хеш функције „хасх = хасх% хасх_таблеСизе“.
Сада се елемент 70 такође изједначава са локацијом 0 у хеш табели. Али та локација је већ заузета. Стога ћемо помоћу линеарног сондирања пронаћи следећу локацију која је 1. Како је ова локација незаузета, на ову локацију постављамо кључ 70 како је приказано стрелицом.
Добијена табела хеширања приказана је испод.
Линеарно сондирање може патити од проблема „Примарног груписања“ у којем постоји шанса да се непрекидне ћелије заузму и вероватноћа уметања новог елемента смањи.
Такође, ако два елемента добију исту вредност при првој хеш функцији, тада ће оба ова елемента следити исту секвенцу сонде.
Квадратно сондирање
Квадратно сондирање је исто што и линеарно сондирање, једина разлика је интервал који се користи за сондирање. Као што и само име говори, ова техника користи нелинеарну или квадратну удаљеност да би заузела прорезе када дође до судара уместо линеарне удаљености.
У квадратном сондирању, интервал између слотова израчунава се додавањем произвољне полиномске вредности у већ хеширани индекс. Ова техника у значајној мери смањује примарно груписање, али не побољшава секундарно груписање.
Доубле Хасхинг
Техника двоструког распршивања слична је линеарном сондирању. Једина разлика између двоструког хеширања и линеарног сондирања је у томе што се у техници двоструког хеширања интервал који се користи за сондирање израчунава помоћу две хеш функције. Будући да хеш функцију примењујемо на кључ један за другим, она елиминише примарно и секундарно кластерирање.
Разлика између ланчаног (отворено хеширање) и линеарног сондирања (отворено адресирање)
Ланац (отворено хеширање) | Линеарно сондирање (отворено адресирање) |
---|---|
Вредности кључева могу се сачувати изван табеле помоћу засебне повезане листе. | Вредности кључева треба чувати само унутар табеле. |
Број елемената у хеш табели може премашити величину хеш табеле. | Број елемената присутних у хеш табели неће премашити број индекса у хеш табели. |
Делеција је ефикасна у техници уланчавања. | Брисање може бити гломазно. Може се избећи ако није потребно. |
Будући да се за сваку локацију одржава засебна повезана листа, заузети простор је велик. | Будући да су сви уноси смештени у истој табели, заузети простор је мањи. |
Примена Х ++ табеле Ц ++
Хеширање можемо имплементирати помоћу низова или повезаних листа за програмирање хеш табела. У Ц ++ такође имамо функцију која се назива „хасх мап“ која је структура слична хеш табели, али сваки унос је пар кључ / вредност. У Ц ++-у се зове хеш мапа или једноставно мапа. Мапа хеша у Ц ++-у је обично неуређена.
Постоји заглавље дефинисано у Стандард Темплате Либрари (СТЛ) на Ц ++ које имплементира функционалност мапа. Покрили смо СТЛ мапе детаљно у нашем водичу о СТЛ-у.
Следећа примена је за хеширање користећи повезане листе као структуру података за хеш табелу. Такође користимо „Цхаининг“ као технику решавања судара у овој имплементацији.
#include #include using namespace std; class Hashing { int hash_bucket; // No. of buckets // Pointer to an array containing buckets list *hashtable; public: Hashing(int V); // Constructor // inserts a key into hash table void insert_key(int val); // deletes a key from hash table void delete_key(int key); // hash function to map values to key int hashFunction(int x) { return (x % hash_bucket); } void displayHash(); }; Hashing::Hashing(int b) { this->hash_bucket = b; hashtable = new list (hash_bucket); } //insert to hash table void Hashing::insert_key(int key) { int index = hashFunction(key); hashtable(index).push_back(key); } void Hashing::delete_key(int key) { // get the hash index for key int index = hashFunction(key); // find the key in (inex)th list list :: iterator i; for (i = hashtable(index).begin(); i != hashtable(index).end(); i++) { if (*i == key) break; } // if key is found in hash table, remove it if (i != hashtable(index).end()) hashtable(index).erase(i); } // display the hash table void Hashing::displayHash() { for (int i = 0; i ' << x; cout << endl; } } // main program int main() { // array that contains keys to be mapped int hash_array() = {11,12,21, 14, 15}; int n = sizeof(hash_array)/sizeof(hash_array(0)); Hashing h(7); // Number of buckets = 7 //insert the keys into the hash table for (int i = 0; i < n; i++) h.insert_key(hash_array(i)); // display the Hash table cout<<'Hash table created:'< Излаз:
Израђена хеш табела:
0 -> 21 -> 14
1 -> 15
два
3
4 -> 11
5 -> 12
6
Табела хеширања након брисања кључа 12:
0 -> 21 -> 14
1 -> 15
два
3
4 -> 11
5
6
Излаз приказује хеш табелу која је креирана величине 7. Користимо уланчавање да бисмо решили колизију. Хеш табелу приказујемо након брисања једног од тастера.
Апликације хеширања
# 1) Верификација лозинки: Верификација лозинки се обично врши коришћењем криптографских хеш функција. Када се лозинка унесе, систем израчунава хеш лозинке и затим се шаље серверу на проверу. На серверу се чувају хеш вредности оригиналних лозинки.
# 2) Структуре података: Различите структуре података попут унордеред_сет и унурдеред_мап у Ц ++, речници у питхону или Ц #, ХасхСет и хасх мап у Јави користе пар кључ / вредност у коме су кључеви јединствене вредности. Вредности могу бити исте за различите кључеве. Хасхинг се користи за примену ових структура података.
# 3) Сажетак поруке: Ово је још једна апликација која користи криптографски хеш. У сажетцима порука израчунавамо хеш за податке који се шаљу и примају или чак датотеке и упоређујемо их са сачуваним вредностима како бисмо осигурали да датотеке података не буду неовлашћене. Овде је најчешћи алгоритам „СХА 256“.
# 4) Рад компајлера: Када компајлер компајлира програм, кључне речи за програмски језик чувају се другачије од осталих идентификованих. Компајлер користи хеш табелу за чување ових кључних речи.
# 5) Индексирање базе података: Хасх табеле се користе за индексирање базе података и структуре података засноване на диску.
# 6) Асоцијативни низови: Асоцијативни низови су низови чији су индекси типа података који нису целобројни низови или други типови објеката. Табеле хеша могу се користити за примену асоцијативних низова.
Закључак
Хеширање је најчешће коришћена структура података јер је потребно константно време О (1) за операције уметања, брисања и претраживања. Хасхинг се углавном примењује коришћењем хеш функције која израчунава јединствену мању вредност кључа за велике уносе података. Хеширање можемо применити помоћу низова и повезаних листа.
Кад год се један или више уноса података изједначе са истим вредностима кључева, то резултира колизијом. Видели смо различите технике решавања колизије, укључујући линеарно сондирање, ланце итд. Приметили смо и примену хеширања у Ц ++.
Да закључимо, можемо рећи да је хеширање далеко најефикаснија структура података у свету програмирања.
=> Овде потражите целу серију обука за Ц ++.
Препоручено читање
- Како писати сложене сценарије теста пословне логике помоћу технике табеле одлучивања
- Табела за валидацију поља (ФВТ): Техника дизајна теста за валидацију поља
- КТП водич # 15 - Коришћење контролних тачака за подручје текста, табеле и странице у КТП-у
- КАРТЕ У СТЛ
- Све о рутерима: типови рутера, табела рутирања и ИП рутирање
- 40 најбољих питања и одговора за интервју за МиСКЛ (2021 питање)
- Врхунских 90 питања и одговора за СКЛ интервју (НАЈНОВИЈЕ)
- Наредбе програма Уник услужни програми: Који, Човек, Пронађи Су, Судо (Део Д)