Геш-таблиця

Геш-таблиця[1] — структура даних, що реалізує інтерфейс асоціативного масиву, а саме, вона дозволяє зберігати пари (ключ, значення) і здійснювати три операції: операцію додавання нової пари, операцію пошуку і операцію видалення за ключем.

Вступ

Існує два основних варіанта геш-таблиць: з ланцюжками і з відкритою адресацією. Геш-таблиця містить в собі деякий масив H, елементами якого є пари (геш-таблиця з відкритою адресацією) або списки пар (геш-таблиця з ланцюжками).

Виконання операцій в геш-таблиці починається з обчислення геш-функції від ключа. Отримане геш-значення i = hash(key) відіграє роль індексу в масиві H. Після цього операція (додавання, видалення, пошук) перенаправляється об'єктові, який зберігається у відповідній комірці масиву H[i].

Ситуація, коли для різних ключів отримується одне й те саме геш-значення, називається колізією. Такі події непоодинокі — наприклад, при додаванні в геш-таблицю розміром 365 комірок усього лише 23-х елементів ймовірність колізії вже перевищує 50 відсотків (якщо кожний елемент може з однаковою ймовірністю потрапити в будь-яку комірку)  — див. парадокс днів народження. Через це механізм розв'язання колізій — важлива складова будь-якої геш-таблиці.

В деяких особливих випадках вдається взагалі уникнути колізій. Наприклад, якщо всі ключі елементів відомі заздалегідь (або дуже рідко змінюються), тоді для них можна знайти деяку досконалу геш-функцію[en], яка розподілить їх за комірками геш-таблиці без колізій. Геш-таблиці, які використовують подібні геш-функції, не потребують механізму розв'язання колізій, і називаються геш-таблицями з прямою адресацією.

Властивості геш-таблиці

Важлива властивість геш-таблиць полягає в тому, що, при деяких розумних припущеннях, всі три операції (пошук, вставлення і видалення елементів) зазвичай виконується за час O(1). Але при цьому не гарантується, що час виконання окремої операції малий, з певною імовірністю час може бути сумірним із пошуком у списку. З ростом коефіцієнта заповнення таблиці ця імовірність, і, відповідно, середній час виконання операцій, ростуть. Тому при досягненні деякого значення коефіцієнта заповнення необхідно здійснювати перебудову індексу геш-таблиці: збільшити розміри масиву H і заново додати в порожню геш-таблицю всі пари.

Розв'язання колізій

Існує декілька способів розв'язання колізій.

Метод ланцюжків

Розв'язання колізій за допомогою ланцюжків.

Кожна комірка масиву H є вказівником на зв'язаний список (ланцюжок) пар ключ-значення, відповідних одному і тому самому геш-значенню ключа. Колізії просто призводять до того, що з'являються ланцюжки довжиною більше одного елемента.

Операції пошуку або видалення елемента вимагають перегляду всіх елементів відповідного ланцюжка, щоб знайти в ньому елемент з заданим ключем. Для додавання нового елемента необхідно додати елемент в кінець або початок відповідного списку, і, у випадку якщо коефіцієнт заповнення стане занадто великим, збільшити розмір масиву H і перебудувати таблицю.

При припущенні, що кожний елемент може потрапити в будь-яку позицію таблиці H з однаковою ймовірністю і незалежно від того, куди потрапив будь-який елемент, пересічний час роботи операції пошуку елемента складає Θ(1 + α), де α — коефіцієнт заповнення таблиці.

Відкрита адресація

Приклад розв'язку колізій в геш-таблиці з відкритою адресацією та лінійним перебором (інтервал = 1). Зауважте, «Ted Baker» має унікальне геш-значення, але все одно утворює колізію з «Sandra Dee», яка перед цим створила колізію з «John Smith».

В стратегії, названій відкритою адресацією[en], всі записи зберігаються в самому масиві H. Коли додається новий запис, масив перевіряється в певному порядку, доки не буде знайдена вільна комірка, куди буде доданий елемент. У випадку пошуку елемента, масив сканується в тій самій послідовності, доки потрібний запис або порожня комірка не буде знайдена. Останнє — означає відсутність елемента.[2] Назва «відкрита адресація» показує, що положення («адреса») елемента не визначається його геш-значенням. Цей метод також називають закритим гешуванням.

Загалом, послідовність, у якій переглядаються комірки геш-таблиці, залежить лише від ключа елемента. Тобто це послідовність h0(x), h1(x), …, hn-1(x), де x — ключ елемента, а hi(x) — довільна функція, яка порівнює кожен ключ комірки з геш-таблицею. Перший елемент послідовності, зазвичай, дорівнює значенню деякої геш-функції від ключа, а наступні обчислюються одним з наведених нижче способів. Для успішної роботи алгоритму пошуку, послідовність перебору має бути такою, щоб всі комірки геш-таблиці виявились переглянутими рівно по одному разу.

Алгоритм пошуку переглядає всі комірку геш-таблиці в тому самому порядку, що і при вставці, доки не знайдеться або елемент з шуканим ключем, або вільна комірка (що означає відсутність елемента в геш-таблиці).

Видалення елементів у такій схемі складніше. Зазвичай воно здійснюється таким чином: заводять булевий прапорець для кожної комірки. Він має означати видалений цей елемент з таблиці чи ні. Тобто видалення елемента означає встановлення цього прапорця. При цьому доведеться модифікувати процедуру пошуку існуючого елемента так, щоб вона вважала видалені комірки зайнятими, а процедуру додавання — щоб вона їх вважала вільними і скидала прапорець при доданні елемента.

Нижче наведені деякі розповсюджені варіанти переборів. Одразу зауважимо, що нумерація елементів послідовності спроб і комірок геш-таблиці при переборі ведеться від нуля, а N — розмір геш-таблиці.

  • Лінійне зондування: комірки геш-таблиці послідовно переглядаються з деяким фіксованим інтервалом k між комірками (зазвичай, ), тобто i-й елемент послідовності — це комірка з номером (hash(x) + ik) mod N. Для того, щоб всі комірки виявились перебраними по одному разу, необхідно, щоб k було взаємно-простим з розміром геш-таблиці.
  • Квадратичне зондування: інтервал між комірками з кожним кроком збільшується на константу, що задається в загальному вигляді з допомогою деякого квадратичного поліному k1i+k2i2. У найпростішому випадку k1 = 0, k2 = 1 для і = 0,1,2,3,… отримаємо:
    h0 = hash(x) mod N, h1 = (hash(x) + 12) mod N, h2 = (hash(x) + 22) mod N, h3 = (hash(x) + 32) mod N, …
  • Подвійне гешування: інтервал між комірками фіксований, як при лінійному переборі, але, на відміну від нього, розмір інтервалу обчислюється другою, допоміжною геш-функцією, тобто може бути різним для різним ключів. Значення цієї геш-функції мають бути ненульовими і взаємно простими з розміром геш-таблиці, що найпростіше всього зробити, якщо взяти просте число як розмір, і вимагати, щоб допоміжна геш-функція приймала значення від 1 до N − 1.

Недоліком усіх схем відкритої адресації є те, що кількість елементів, які можуть зберігатися в таблиці може досягти кількість комірок в масиві. Дійсно, навіть з хорошими геш-функціями, продуктивність серйозно падає при коефіцієнті завантаження більшому ніж 0,7 або біля того. Для багатьох застосувань, це обмеження викликає необхідність використання динамічної зміну розміру з відповідними затратами.

Схеми відкритої адресації також накладають суворіші вимоги до геш-функції: окрім рівномірного розподілу значень по всьому масиву, функція має також мінімізувати скупчення геш-значень, що слідують одна за одною в послідовності спроб.

Відкрита адресація зберігає пам'ять тільки у випадку якщо елементи малого розміру і коефіцієнт завантаження не дуже малий. Якщо коефіцієнт завантаження близький до нуля, відкрита адресація марнотратна навіть якщо кожен елемент займає лише два машинних слова.

Графік порівнює пересічну кількість втрат потрібних для пошуку елемента в таблиці методом ланцюжків і лінійним перебором. Коли таблиця завантажена більше ніж на 80 %, ефективність лінійного перебору значно падає.

Відкрита адресація уникає витрат на розміщення кожного нового елемента, і може бути реалізована навіть у відсутності розподільника пам'яті. Вона також уникає додаткових посилань для доступу до набору елементів з певним однаковим значенням геш-функції. З малими розмірами елементів, цей фактор може додати продуктивності порівняно з таблицею організованою методом ланцюжків особливо при пошуку.

Геш-таблиця з лінійною адресацією також легше серіалізується, через відсутність вказівників.

З іншого боку, зазвичай відкрита адресація — поганий вибір для великих елементів, через те, що такі елементи заповнюють весь кеш процесора (нівелюючи переваги кешу), також значна кількість місця втрачається через велику кількість порожніх комірок. Якщо відкрита адресація зберігає тільки вказівники на елементи, вона використовує кількість пам'яті, яку можна порівняти з використанням пам'яті методом ланцюжків, але втрачає перевагу в швидкості.

Узагальнюючи, відкриту адресацію краще використовувати для геш-таблиць з малими елементами, які зберігаються в таблиці. Вони особливо підходять для елементів в одне слово або менших. У випадку коли очікується високий коефіцієнт завантаження, елементи великі за розміром, або можуть мати різні розміри, метод ланцюжків показує таку ж або кращу продуктивність.

Зрештою, при розумному використанні, будь-який алгоритм зазвичай достатньо швидкий; і відсоток обчислень в геш-таблицях малий. Використання пам'яті рідко вважається надмірним. Отже, в більшості випадків різниця між цими двома алгоритмами мінімальні, і, як правило, інші міркування виходять на арену.

Гібрид методу ланцюжків та відкритої адресації (англ. Coalesced hashing), що розв'язує колізії з допомогою додаткових ланок між вузлами зв'язаних списків всередині таблиці[2]. Як і метод ланцюжків, не має кластерних ефектів і геш-таблиця може бути ефективно заповнена.

Ще одна альтернатива відкритої адресації — англ. Cuckoo hashing,— забезпечує постійний час пошуку і сталий амортизований час для вставок і вилучень. Цей метод використовує дві чи більше геш-функції, а це означає, що будь-яка пара ключ/значення може знаходитись в двох або більше місцях. Для пошуку використовується перша геш-функція; якщо ключ/значення не знайдено, то використовується друга геш-функція, і так далі. Якщо колізія відбувається під час вставки, то ключ повторно гешується другою геш-функцією, щоб відобразити його в інший бакет. Якщо всі функції гешування використані, а колізія не розв'язана, то старий ключ на місці колізії видаляється, щоб звільнити місце для нового ключа, і цей попередній старий ключ повторно гешується однією з наступних геш-функцій, які відображають його в інший бакет. Якщо це також призводить до колізії, то процес повторюється, поки колізія не зникне або процес пройде через всі бакети в таблиці. Таким шляхом оптимізується використання пам'яті.

Інший альтернативний метод, поєднує в собі зозулине гешування та лінійне зондування але таким чином, щоб обійти обмеження цих методів[3]. Зокрема, він добре працює навіть тоді, коли коефіцієнт завантаження таблиці зростає до 0,9.

Варіант гешування з відкритою адресацією, де в таблиці зберігається, крім ключа, кількість колізій при пошуку (PSL - probe sequence length, довжина послідовності перевірок).[4] Якщо пошук місця для нового елемента має більший PSL, ніж в елемента таблиці, з яким виникла колізія, то новий елемент вставляється на це місце, і підшукується нове місце вже для цього елемента. Таким чином, алгоритм місця забирає у «багатих» (елементів з невеликим PSL) і віддає «бідним» (яких складно знайти), як, за легендою, чинив Робін Гуд. Це дозволяє навіть у гіршому разі робити пошук за O(log(n)) кроків, бо при заповненій таблиці статистично ймовірніше при колізії знайти елемент у середині ланцюжка, пошук елемента також можна оптимізувати, застосувавши так званий розумний пошук, що починається з середини ланцюжка і рухається по одному кроку до початку і до кінця ланцюжка (тобто в послідовності середній, середній-1, середній+1, середній-2, середній+2 і т.д.).

Див. також

Примітки

  1. геш-таблиця // Англійсько-український словник з математики та інформатики / уклад. Є. Мейнарович, М. Кратко. — 2010.
  2. а б Tenenbaum, Aaron M.; Langsam, Yedidyah; Augenstein, Moshe J. (1990). Data Structures Using C. Prentice Hall. с. 456–461, pp. 472. ISBN 0-13-199746-7.
  3. Herlihy, Maurice; Shavit, Nir; Tzafrir, Moran (2008). Hopscotch Hashing. DISC '08: Proceedings of the 22nd international symposium on Distributed Computing. Berlin, Heidelberg: Springer-Verlag. с. 350—364.
  4. Celis, Pedro, Robin Hood Hashing (PDF), Univercity of Waterloo

Джерела

Read other articles:

Chronologies Données clés 1729 1730 1731  1732  1733 1734 1735Décennies :1700 1710 1720  1730  1740 1750 1760Siècles :XVIe XVIIe  XVIIIe  XIXe XXeMillénaires :-Ier Ier  IIe  IIIe Chronologies thématiques Art Architecture, Arts plastiques (Dessin, Gravure, Peinture et Sculpture), Littérature, Musique classique et Théâtre   Ingénierie (), Architecture et ()   Politique Droit   Religion (,)   Science Santé et ...

 

وادي الريان  - منطقة سكنية -  تقسيم إداري البلد الأردن  المحافظة محافظة إربد لواء لواء الأغوار الشمالية قضاء قضاء الأغوار الشمالية السكان التعداد السكاني 7144 نسمة (إحصاء 2015)   • الذكور 3941   • الإناث 3203   • عدد الأسر 1485 معلومات أخرى التوقيت ت ع م+02:00  تعدي...

 

Protein-coding gene in the species Homo sapiens AGAAvailable structuresPDBOrtholog search: PDBe RCSB List of PDB id codes1APY, 1APZIdentifiersAliasesAGA, Aga, AW060726, AGU, ASRG, GA, aspartylglucosaminidaseExternal IDsOMIM: 613228 MGI: 104873 HomoloGene: 13 GeneCards: AGA Gene location (Human)Chr.Chromosome 4 (human)[1]Band4q34.3Start177,430,774 bp[1]End177,442,437 bp[1]Gene location (Mouse)Chr.Chromosome 8 (mouse)[2]Band8|8 B1.3Start53,964,762 bp[2&#...

Football clubSporting Clube da PraiaFull nameSporting Clube da PraiaNickname(s)Leões (Lions)Verde-e-Amarelos (Green'n'Yellow)Lion di Kapital(Lion of the Capital,Portuguese: Leão de Capital)Founded2 December 1923GroundEstádio da Várzea,Praia, Cape VerdeCapacity8,000ChairmanCarlos Daniel CaetanoManagerLitoLeagueSantiago Island League (South)Cape Verdean Football Championships2017–1820181st, Champions2nd and eliminatedWebsiteClub website Home colours Away colours Current season Sporting C...

 

2012 American filmPuss in Boots: The Three DiablosDVD coverDirected byRaman HuiScreenplay byTom WheelerProduced byGina ShayStarringAntonio BanderasGilles MariniCharlotte NewhouseChris MillerWalt DohrnBret MarnellMiles Christopher BaksiNina Zoe BaksiGuillaume AretosEdited byBret MarnellMusic byMatthew MargesonHenry JackmanProductioncompanyDreamWorks AnimationDistributed byParamount Home Media DistributionRelease date February 24, 2012 (2012-02-24) Running time13 minutesCountryUn...

 

Vaulnaveys-le-Haut Photographie aérienne. Administration Pays France Région Auvergne-Rhône-Alpes Département Isère Arrondissement Grenoble Intercommunalité Grenoble-Alpes Métropole Maire Mandat Jean-Yves Porta 2020-2026 Code postal 38410 Code commune 38529 Démographie Populationmunicipale 4 000 hab. (2021 ) Densité 201 hab./km2 Géographie Coordonnées 45° 07′ 10″ nord, 5° 48′ 40″ est Altitude 365 mMin. 338 mMax. 1...

1831 mass killing of Charrúa Native Americans by the Uruguayan Army You can help expand this article with text translated from the corresponding article in Spanish. (March 2024) Click [show] for important translation instructions. Machine translation, like DeepL or Google Translate, is a useful starting point for translations, but translators must revise errors as necessary and confirm that the translation is accurate, rather than simply copy-pasting machine-translated text into the Eng...

 

Indian film music director and playback singer For other uses, see Anil Biswas (disambiguation). This article includes historical images which have been upscaled by an AI process. This will have introduced speculative and possibly inaccurate details not present in the source material. Such images should be replaced with their original versions. (March 2024) Anil BiswasAI-enhanced photograph of Anil Biswas, November 1945BornAnil Krishna Biswas(1914-07-07)7 July 1914Barisal, Bengal Presidency, ...

 

Languages of TaiwanThe most commonly used home language in Taiwan, Penghu, Kinmen and Matsu, 2010.('cmn' = Mandarin'nan' = Hokkien/Min Nan'hak' = Hakka'map' = Austronesian languages)Officialde jure: N/A de facto: MandarinNationalFormosan languages[1]Mandarin[a]Hokkien[a]Hakka[3]MainMandarinIndigenousFormosan languages (Amis, Atayal, Bunun, Kanakanavu, Kavalan, Paiwan, Puyuma, Rukai, Saaroa, Saisiyat, Sakizaya, Seediq, Thao, Truku, Tsou), TaoImmigrantIndonesian...

TLE4 المعرفات الأسماء المستعارة TLE4, BCE-1, BCE1, E(spI), ESG, ESG4, GRG4, Grg-4, transducin like enhancer of split 4, TLE family member 4, transcriptional corepressor, E(spl) معرفات خارجية الوراثة المندلية البشرية عبر الإنترنت 605132 MGI: MGI:104633 HomoloGene: 38259 GeneCards: 7091 علم الوجود الجيني الوظيفة الجزيئية • transcription factor activity, RNA polymerase II distal enhancer sequenc...

 

Cet article est une ébauche concernant Trinité-et-Tobago. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Subdivisions administratives de Trinité-et-Tobago. ISO 3166-2:TT est l'entrée pour Trinité-et-Tobago dans l'ISO 3166-2, qui fait partie du standard ISO 3166, publié par l'Organisation internationale de normalisation (ISO), et qui définit des codes pour les noms des principales administration territori...

 

Martin Tauber Nazionalità  Austria Altezza 175 cm Peso 65 kg Sci di fondo Squadra SC Seefeld Termine carriera 2007   Modifica dati su Wikidata · Manuale Martin Tauber (Innsbruck, 4 novembre 1976) è un ex fondista austriaco. Indice 1 Biografia 2 Palmarès 2.1 Coppa del Mondo 2.2 Campionati austriaci 3 Note 4 Collegamenti esterni Biografia In Coppa del Mondo esordì il 22 novembre 1997 a Beitostølen (105°) e ottenne l'unico podio il 5 febbraio 2006 a Davos (2°). In carrier...

この項目には、一部のコンピュータや閲覧ソフトで表示できない文字が含まれています(詳細)。 数字の大字(だいじ)は、漢数字の一種。通常用いる単純な字形の漢数字(小字)の代わりに同じ音の別の漢字を用いるものである。 概要 壱万円日本銀行券(「壱」が大字) 弐千円日本銀行券(「弐」が大字) 漢数字には「一」「二」「三」と続く小字と、「壱」「�...

 

U.S. zoologist and botanist (1869–1956) This section needs additional citations for verification. Please help improve this article by adding citations to reliable sources in this section. Unsourced material may be challenged and removed.Find sources: Gerrit Smith Miller Jr. – news · newspapers · books · scholar · JSTOR (November 2022) (Learn how and when to remove this message) Gerrit Smith Miller Jr.Gerrit Smith Miller, Jr., about 1897Born(1869-...

 

Економічна і соціальна комісія ООН для Азії та Тихого океану Абревіатура ESCAPТип Первинний орган – регіональне відділенняЗасновано 28 березня, 1947; 77 років тому (1947-03-28)Правовий статус АктивнаГалузь міжнародні державні або недержавні організаціїd[1]Штаб-�...

River in New Hampshire, United StatesChocorua RiverA small dam on the Chocorua River in the village of ChocoruaShow map of New HampshireShow map of the United StatesLocationCountryUnited StatesStateNew HampshireCountyCarrollTownsAlbany, Tamworth, OssipeePhysical characteristicsSourceMount Chocorua • locationAlbany • coordinates43°57′42″N 71°16′1″W / 43.96167°N 71.26694°W / 43.96167; -71.26694 • elevation2...

 

Type of traditional garden The moss garden at the Saihō-ji temple in Kyoto, started in 1339 Japanese gardens (日本庭園, nihon teien) are traditional gardens whose designs are accompanied by Japanese aesthetics and philosophical ideas, avoid artificial ornamentation, and highlight the natural landscape. Plants and worn, aged materials are generally used by Japanese garden designers to suggest a natural landscape, and to express the fragility of existence as well as time's unstoppable adva...

 

Department of the US federal government Department of Health and Human Services redirects here. For government departments by that name in other jurisdictions, see Department of Health and Human Services (disambiguation). United States Department of Health and Human ServicesSeal of the U.S. Department of Health & Human ServicesFlag of the U.S. Department of Health & Human ServicesHubert H. Humphrey Building, Department headquartersDepartment overviewFormedApril 11, 1953; ...

SaawariyaPoster film untuk SaawariyaSutradaraSanjay Leela BhansaliProduserSanjay Leela BhansaliDitulis olehPrakash KapadiaVibhu PuriBerdasarkanMalam-Malam Putiholeh Fyodor DostoyevskiPemeranRanbir KapoorSonam KapoorSalman KhanRani MukerjiZohra SehgalNaratorRani MukerjiPenata musikMonty SharmaSinematograferRavi K. ChandranPenyuntingSanjay Leela BhansaliPerusahaanproduksiSLB FilmsDistributorSony PicturesMeteor PicturesTanggal rilis 9 November 2007 (2007-11-09) Durasi140 menitNegaraIn...

 

United States historic placeFarnam BuildingU.S. National Register of Historic Places Farnam Building, view from 17th and FarnamShow map of NebraskaShow map of the United StatesLocation1613 Farnam Street,Omaha, NebraskaCoordinates41°15′27″N 95°56′16″W / 41.25750°N 95.93778°W / 41.25750; -95.93778Built1929ArchitectGeorge B. PrinzArchitectural styleGothic RevivalNRHP reference No.00000171[1]Added to NRHPMarch 9, 2000 The Farnam Building...