Структуре података и алгоритми

Водич за структуру података хеш табела

Водич за структуру података хеш табела
У рачунарству реч „мапа“ значи повезивање предмета из једног скупа са другим предметом у другом скупу. Замислите да се на страници на левој страни налазе речи у кругу, а на десној страни исте странице налази се још један круг у коме се налазе друге речи. Претпоставимо да су у сваком кругу речи написане насумично, расуте унутар круга. Такође, претпоставимо да се речи у левом кругу називају кључеви, а речи у десном кругу вредности. Ако се од сваке речи лево повуче стрелица до сваке речи десно, тада би се рекло да су кључеви мапирани у вредности.

Претпоставите да сте власник велике продавнице намирница у округу у којем живите. Претпоставимо да живите на великом подручју, што није комерцијално подручје. Нисте једини који имају продавницу намирница у околини; имате неколико конкурената. А онда вам падне на памет да телефонске бројеве својих купаца забележите у књигу вежби. Књига вежби је наравно мала и не можете да снимите све бројеве телефона за све своје купце.

Дакле, одлучили сте да снимате само бројеве телефона својих редовних купаца. И тако имате табелу са две колоне. У колони на левој страни налазе се имена купаца, а у колони на десној страни одговарајуће телефонске бројеве. На овај начин постоји мапирање између имена купаца и бројева телефона. Десна колона табеле може се сматрати основном хеш-табелом. Имена купаца сада се називају кључеви, а бројеви телефона вредности. Имајте на уму да када купац пређе на пренос, мораћете да откажете његов ред, дозвољавајући ред празан или да буде замењен редом новог редовног купца. Такође имајте на уму да се с временом број сталних купаца може повећати или смањити, а самим тим и сто може расти или се смањивати.

Као још један пример мапирања, претпоставимо да у округу постоји клуб пољопривредника. Наравно, неће сви пољопривредници бити чланови клуба. Неки чланови клуба неће бити редовни чланови (уз присуство и допринос). Адвокат може одлучити да забележи имена чланова и њихов избор пића. Развија табелу од две колоне. У леву колону уписује имена чланова клуба. У десну колону уписује одговарајући избор пића.

Овде постоји проблем: у десној колони су дупликати. Односно, исто име пића се налази више пута. Другим речима, различити чланови пију исто слатко пиће или исто алкохолно пиће, док други чланови пију различито слатко или алкохолно пиће. Адвокат одлучује да овај проблем реши уметањем уске колоне између две колоне. У овој средњој колони, почевши од врха, он броји редове који почињу од нуле (тј.е. 0, 1, 2, 3, 4 итд.), надоле, један индекс по реду. Овим је његов проблем решен, јер се име члана сада пресликава на индекс, а не на име пића. Дакле, како се пиће идентификује индексом, име купца се пресликава у одговарајући индекс.

Само колона вредности (пића) чини основну хеш таблицу. У измењеној табели, колона индекса и њима придружене вредности (са дупликатима или без њих) чине нормалну хеш-табелу - потпуна дефиниција хеш-табеле дата је у наставку. Кључеви (прва колона) не чине нужно део хеш табеле.

Као још један пример, размотримо мрежни сервер где корисник са свог клијентског рачунара може додати неке информације, избрисати неке информације или изменити неке информације. Постоји много корисника за сервер.  Свако корисничко име одговара лозинци која је сачувана на серверу. Они који одржавају сервер могу да виде корисничка имена и одговарајућу лозинку и тако могу да оштете рад корисника.

Дакле, власник сервера одлучује да произведе функцију која шифрира лозинку пре него што је сачувана. Корисник се пријављује на сервер са својом нормално разумљивом лозинком. Међутим, сада се свака лозинка чува у шифрованом облику. Ако неко види шифровану лозинку и покуша да се пријави помоћу ње, то неће успети, јер се пријављивањем сервер добија разумљиву лозинку, а не шифровану лозинку.

У овом случају је разумљива лозинка кључ, а шифрована лозинка вредност. Ако се шифрована лозинка налази у колони шифрованих лозинки, онда је та колона основна хеш табела. Ако тој колони претходи друга колона са индексима који почињу од нуле, тако да је свака шифрована лозинка повезана са индексом, тада и колона индекса и колона шифроване лозинке чине нормалну хеш табелу. Тастери нису нужно део хеш табеле.

У овом случају имајте на уму да сваки кључ, који је разумљива лозинка, одговара корисничком имену. Дакле, постоји корисничко име које одговара кључу који је пресликан у индекс, а које је повезано са вредношћу која је шифровани кључ.

Дефиниција хеш функције, пуна дефиниција хеш табеле, значење низа и други детаљи дати су у наставку. Морате имати знање о показивачима (референцама) и повезаним листама да бисте уважили остатак овог водича.

Значење функције хеширања и табеле хеширања

Арраи

Низ је скуп узастопних меморијских локација. Све локације су исте величине. Вредности на првој локацији се приступа индексом 0; вредности на другој локацији се приступа индексом 1; трећој вредности се приступа индексом 2; четврти са индексом, 3; и тако даље. Низ се нормално не може повећати или смањити. Да би се променила величина (дужина) низа, мора се створити нови низ и копирати одговарајуће вредности у нови низ. Вредности низа су увек истог типа.

Хасх функција

У софтверу, хеш функција је функција која узима кључ и производи одговарајући индекс за ћелију низа. Низ је фиксне величине (фиксне дужине). Број кључева је произвољне величине, обично већи од величине низа. Индекс који је резултат хеш функције назива се хеш вредност или сажетак или хеш код или једноставно хеш.

Хасх Табле

Хеш табела је низ са вредностима, на чије се индексе пресликавају кључеви. Кључеви се индиректно пресликавају на вредности. У ствари, каже се да се кључеви пресликавају на вредности, јер је сваки индекс повезан са вредношћу (са дупликатима или без њих). Међутим, функција која врши мапирање (тј.е. хасхинг) односи кључеве на индексе низа, а не на вредности, јер у вредностима могу бити дупликати. Следећи дијаграм илуструје хеш-табелу за имена људи и њихове бројеве телефона. Ћелије низа (слотови) називају се сегменти.

Приметите да су неке канте празне. Хеш табела не мора нужно имати вредности у свим својим сегментима. Вредности у сегментима не морају нужно бити у растућем редоследу. Међутим, индекси са којима су повезани растући су. Стрелице означавају мапирање. Приметите да кључеви нису у низу. Не морају бити у било којој структури. Хасх функција узима било који кључ и хешира индекс низа. Ако у сегменту нема вредности повезаног са хешираним индексом, у тај сегмент може се ставити нова вредност. Логична веза је између кључа и индекса, а не између кључа и вредности повезане са индексом.

Вредности низа, попут вредности ове хеш табеле, увек су истог типа података. Табела хеширања (сефови) могу да повежу кључеве са вредностима различитих типова података. У овом случају, вредности низа су сви показивачи, који упућују на различите типове вредности.

Табела хеширања је низ са хеш функцијом. Функција узима кључ и хешира одговарајући индекс и тако повезује кључеве са вредностима у низу. Кључеви не морају бити део хеш табеле.

Зашто низ, а не повезана листа за хеш табелу

Низ за хеш табелу може бити замењен повезаном структуром података листе, али би постојао проблем. Први елемент повезане листе је природно на индексу, 0; други елемент је природно у индексу 1; трећи је по природи индекс 2; и тако даље. Проблем повезане листе је тај да се за дохватање вредности листа мора прелистати, а то захтева време. Приступ вредности у низу врши се случајним приступом. Једном када је индекс познат, вредност се добија без понављања; овај приступ је бржи.

Судар

Хасх функција узима кључ и хешира одговарајући индекс, за читање придружене вредности или за уметање нове вредности. Ако је сврха очитавање вредности, засад нема проблема (нема проблема). Међутим, ако је сврха уметање вредности, хеширани индекс можда већ има придружену вредност, а то је колизија; нова вредност се не може ставити тамо где већ постоји вредност. Постоје начини за решавање судара - погледајте доле.

Зашто долази до судара

У горњем примеру продавнице провизија, имена купаца су кључеви, а имена пића вредности. Приметите да је купаца превише, иако низ има ограничену величину и не може да прими све купце. Дакле, у низу се чувају само пића редовних купаца. До судара би дошло када нередовни купац постане редован. Купци радње чине велики сет, док је број сефа за купце у низу ограничен.

Код хеш табела бележе се вредности кључева које су врло вероватно. Када кључ који није био вероватан, постане вероватан, вероватно би дошло до судара. У ствари, колизија се увек дешава са хеш табелама.

Основе решавања судара

Два приступа решавању судара називају се одвојено уланчавање и отворено адресирање. У теорији, кључеви не би смели бити у структури података или не би требало да буду део хеш табеле. Међутим, оба приступа захтевају да кључна колона претходи хеш таблици и постане део укупне структуре. Уместо да су кључеви у колони кључева, показивачи на тастере могу бити у колони кључева.

Практична хеш табела укључује колону кључева, али ова колона кључа званично није део хеш табеле.

Оба приступа за решавање могу имати празна сегмента, не нужно на крају низа.

Одвојени ланац

У одвојеном ланцу, када дође до судара, нова вредност се додаје десно (не изнад или испод) сударане вредности. Дакле, две или три вредности на крају имају исти индекс. Ретко више од три треба да имају исти индекс.

Може ли више од једне вредности заиста имати исти индекс у низу? - Не. Дакле, у многим случајевима прва вредност индекса је показивач на повезану структуру података листе, која садржи једну, две или три сударане вредности. Следећи дијаграм је пример хеш-табеле за одвојено уланчавање купаца и њихових бројева телефона:

Празне канте су означене словом к. Остатак слотова има показиваче на повезане листе. Сваки елемент повезане листе има два поља података: једно за име купца и друго за телефонски број. До сукоба долази код кључева: Петер Јонес и Сузан Лее. Одговарајуће вредности састоје се од два елемента једне повезане листе.

За неусаглашене кључеве критеријум за уметање вредности је исти критеријум који се користи за лоцирање (и читање) вредности.

Отворено адресирање

Са отвореним адресирањем, све вредности се чувају у низу сегмената. Када дође до сукоба, нова вредност се убацује у празан сегмент, нова одговарајућа вредност за сукоб, следећи неки критеријум. Критеријум који се користи за уметање вредности у сукобу је исти критеријум који се користи за лоцирање (претраживање и читање) вредности.

Следећи дијаграм илуструје решавање сукоба са отвореним адресирањем:

Хасх функција узима кључ, Петер Јонес и хешира индекс, 152, и чува свој телефонски број у придруженом сегменту. После неког времена, хасх функција хешира исти индекс, 152 од кључа, Сузан Лее, сударајући се са индексом за Петер Јонес. Да би се то решило, вредност за Сузан Лее чува се у серији следећег индекса 153, који је био празан. Хасх функција хешира индекс, 153 за кључ, Робин Хоод, али овај индекс је већ коришћен за решавање сукоба за претходни кључ. Дакле, вредност за Робин Хоода ставља се у следећу празну канту, а то је вредност индекса 154.

Методе решавања сукоба за одвојено уланчавање и отворено адресирање

Одвојено уланчавање има своје методе решавања сукоба, а отворено адресирање такође има своје методе решавања сукоба.

Методе за решавање сукоба раздвојених ланаца

Методе за одвојено уланчавање хеш-таблица су укратко објашњене:

Одвојено повезивање повезаним листама

Овај метод је како је горе објашњено. Међутим, сваки елемент повезане листе не мора нужно имати кључно поље (нпр.г. горње поље за име купца).

Одвојено уланчавање с главним ћелијама листе

У овој методи, први елемент повезане листе чува се у серији низа. То је могуће ако је тип података за низ елемент повезане листе.

Одвојено уланчавање другим структурама

Било која друга структура података, попут самобалансирајућег бинарног стабла претраживања која подржава потребне операције, може се користити уместо повезане листе - погледајте касније.

Методе за решавање сукоба отвореног адресирања

Метода за решавање сукоба у отвореном адресирању назива се секвенца сонде. Три добро позната низа сонди сада су укратко објашњена:

Линеарно сондирање

Са линеарним испитивањем, када се догоди сукоб, тражи се најближе празно ведро испод ведра у сукобу. Такође, код линеарног сондирања, и кључ и његова вредност чувају се у истом сегменту.

Квадратно сондирање

Претпоставимо да се сукоб јавља код индекса Х. Следеће празно место (ведро) са индексом Х + 12 се користи; ако је то већ заузето, онда следећи празан на Х + 22 користи се, ако је то већ заузето, онда следећи празан на Х + 32 се користи итд. Постоје варијанте овога.

Доубле Хасхинг

Са двоструким хеширањем постоје две хеш функције. Први израчунава (хешира) индекс. Ако дође до сукоба, други помоћу истог кључа одређује колико треба убацити вредност. Има још овога - погледајте касније.

Савршена хеш функција

Савршена хеш функција је хеш функција која не може довести до било каквог судара. То се може догодити када је скуп кључева релативно мален и сваки кључ се пресликава на одређени цели број у хеш табели.

У АСЦИИ скупу знакова, велика слова могу се пресликати у одговарајућа мала слова помоћу хеш функције. Слова су у меморији рачунара представљена као бројеви. У АСЦИИ скупу знакова, А је 65, Б је 66, Ц је 67 итд. а а је 97, б је 98, ц је 99 итд. За мапирање од А до а додајте 32 до 65; за мапирање од Б до б додајте 32 до 66; за мапирање од Ц до ц додати 32 до 67; и тако даље. Овде су велика слова кључеви, а мала слова вредности. Табела хеша за ово може бити низ чије су вредности придружени индекси. Запамтите, сегменти низа могу бити празни. Дакле, сегменти у низу од 64 до 0 могу бити празни. Хасх функција једноставно додаје 32 великом броју кода да би се добио индекс, а тиме и мало слово. Таква функција је савршена хеш функција.

Хеширање од целобројних до целобројних индекса

Постоје различите методе за хеширање целог броја. Један од њих назива се Модуло Дивисион Метход (Фунцтион).

Функција распршивања дивизије Модуло

Функција у рачунарском софтверу није математичка функција. У рачунарству (софтвер), функција се састоји од скупа изјава којима претходе аргументи. За функцију Модуло Дивисион, кључеви су цели бројеви и мапирају се у индексе низа сегмената. Скуп кључева је велик, па ће се мапирати само кључеви за које је врло вероватно да ће се појавити у активности. Дакле, долази до судара када се морају мапирати мало вероватноће.

У изјави,

20/6 = 3Р2

20 је дивиденда, 6 је делилац, а 3 остатак 2 је количник. Остатак 2 се такође назива модулом. Напомена: могуће је имати модул 0.

За ово хеширање величина табеле је обично степена 2, нпр.г. 64 = 26 или 256 = 28, итд.  Делитељ за ову функцију хеширања је прост број близу величине низа. Ова функција дели кључ делиоцем и враћа модул. Модуло је индекс низа сегмената. Повезана вредност у сегменту је вредност по вашем избору (вредност за кључ).

Хасхинг тастери променљиве дужине

Овде су тастери скупа кључева текстови различитих дужина. Различити цели бројеви могу се сачувати у меморији користећи исти број бајтова (величина енглеског карактера је бајт). Када су различити кључеви различитих величина бајтова, каже се да су променљиве дужине. Једна од метода хеширања променљивих дужина назива се Радик конверзија хеширање.

Радик конверзија хеширање

У низу, сваки знак у рачунару је број. У овој методи,

Хасх код (индекс) = к0ак − 1+Икс1ак − 2+… + Кск − 2а1+Икск − 1а0

Где су (к0, к1,…, кк − 1) знакови улазног низа, а а је радикс, е.г. 29 (видети касније). к је број знакова у низу. Има још овога - погледајте касније.

Кључеви и вредности

У пару кључ / вредност, вредност не мора нужно бити број или текст. То може бити и рекорд. Запис је списак написан водоравно. У пару кључ / вредност, сваки кључ се заправо може односити на неки други текст или број или запис.

Асоцијативни низ

Листа је структура података, где су ставке листе повезане, и постоји скуп операција које делују на листи. Свака ставка листе може се састојати од пара ставки. Општа хеш-табела са својим кључевима може се сматрати структуром података, али она је више систем него структура података. Тастери и њихове одговарајуће вредности не зависе једни од других. Нису у међусобној вези.

С друге стране, асоцијативни низ је слична ствар, али кључеви и њихове вредности веома зависе једни од других; веома су повезани једни с другима. На пример, можете добити асоцијативни низ плодова и њихових боја. Свако воће природно има своју боју. Кључно је име плода; боја је вредност. Током уметања сваки кључ се убацује са својом вредношћу. Приликом брисања сваки кључ се брише са његовом вредношћу.

Асоцијативни низ је структура података хеш табеле састављена од парова кључ / вредност, где не постоји дупликат за кључеве. Вредности могу имати дупликате. У овој ситуацији, кључеви су део структуре. Односно, кључеви морају да се чувају, док, са општом табелом хаста, кључеви не морају да се чувају. Проблем дуплираних вредности природно се решава индексима низа сегмената. Не бркајте између дуплираних вредности и судара у индексу.

Будући да је асоцијативни низ структура података, он има најмање следеће операције:

Операције асоцијативног низа

убаци или додај

Ово у колекцију убацује нови пар кључ / вредност, пресликавајући кључ у његову вредност.

поново доделити

Ова операција замењује вредност одређеног кључа новом вредношћу.

избриши или уклони

Ово уклања кључ плус одговарајућу вредност.

потражити

Ова операција тражи вредност одређеног кључа и враћа вредност (без уклањања).

Закључак

Структура података хеш табеле састоји се од низа и функције. Функција се назива хеш функција. Функција пресликава кључеве у вредности у низу кроз индексе низа. Кључеви не морају нужно бити део структуре података. Скуп кључева је обично већи од сачуваних вредности. Када дође до судара, то се решава или приступом одвојеног уланчавања или приступом отвореног адресирања. Асоцијативни низ је посебан случај структуре података хеш табеле.

Средњи тастер миша не ради у оперативном систему Виндовс 10
Тхе средње дугме миша помаже вам да се крећете кроз дугачке веб странице и екране са пуно података. Ако се то заустави, на крају ћете користити тастат...
Како да промените леви и десни тастер миша на рачунару са Виндовс 10
Сасвим је нормално да су сви уређаји рачунарског миша ергономски дизајнирани за дешњаке. Али постоје доступни уређаји за миш који су посебно дизајнира...
Емулирајте кликове мишем лебдењем помоћу миша без клика у оперативном систему Виндовс 10
Коришћење миша или тастатуре у погрешном положају прекомерне употребе може резултирати многим здравственим проблемима, укључујући напрезање, синдром к...