Линеарно попуњавање

С Википедије, слободне енциклопедије

Линеарно попуњавање (енгл. Linear probing) је један од начина за обраду хеш колизија вредности хеш функција. То је једноставно решење које подразумева да, у случају да је место у хеш табели заузето, уписује нову вредност на прву следећу слободну локацију од ове одређене хеш функцијом.[1] Ово се постиже коришћењем две вредности, оне добијене хеш функцијом за задату вредност(кључ) и помоћне. Помоћна вредност је почетно 0 и представља удаљење до потенцијално слободне локације. Ово удаљење заправо представља кретање функције у табели, од вредности предвиђене хеш функцијом до прве слободне локације.

Ако је h1(x) хеш функција за кључ x, н димензија хеш табеле, а и удаљење, тада функција линеарног попуњавања х(x,и) има облик:

Део је неопходан како би иза локације н-1 следила локација 0. У овој формули i се повећава за 1 када је локација на коју тренутно показује формула заузета.

Проблеми и ефикасност[уреди | уреди извор]

Линеарно попуњавање је ефикасно ако је табела релативно ретко попуњена. У противном долазиће до много секундарних колизија,[2] односно колизија проузрокованих случајевима са различитим вредностима хеш функције (а не истим, као у случају обичне колизије). На пример, нека је локација i заузета, а локација i+1 слободна. Нови кључ који се пресликава у i проузрокује колизију, и смешта се на локацију i+1. До овог тренутка проблеми су решени ефикасно, уз минимални напор. Међутим, ако се нови кључ преслика у i+1, имамо случај секундарне колизије, а локација i+2 постаје заузета (ако већ није била). Сваки нови кључ пресликан у i, i+1 или i+2, не само да изазива нову секундарну колизију, него и повећава величину овог попуњеног одсечка, што касније изазива још више секундарних колизија. Ово је тзв. ефекат груписања. Кад је табела скоро пуна, број секундарних колизија при линеарном попуњавњу је врло велики,па се претрага деградира у линеарну.[3]

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

Види још[уреди | уреди извор]

Референце[уреди | уреди извор]

  1. ^ Дале, Нелл (2003). C++ Плус Дата Струцтурес. Судбурy, МА: Јонес анд Бартлетт Цомпутер Сциенце. ИСБН 978-0-7637-0481-0. 
  2. ^ Морин, Пат (2004), „Хасх таблес”, Ур.: Мехта, Динесх П.; Сахни, Сартај, Хандбоок оф Дата Струцтурес анд Апплицатионс, Цхапман & Халл / ЦРЦ, стр. 9-15, ИСБН 9781420035179 .
  3. ^ Миодраг, Живковић, Алгоритми (ПДФ) 

Литература[уреди | уреди извор]

  • Дале, Нелл (2003). C++ Плус Дата Струцтурес. Судбурy, МА: Јонес анд Бартлетт Цомпутер Сциенце. ИСБН 978-0-7637-0481-0. 

Спољашње везе[уреди | уреди извор]