А З Python І ў яго, або На Вікісховішчы ёсць медыяфайлы па тэме PHP, У C++. Хаш-карткі ўтвораны практычна ў кожным мовах праграмавання высокага ўзроўню. І яны выдатныя! Хто не хоча захоўваць, а затым дасягнуць дадзеных у канстантны час? Ці працуеце вы з вялікімі наборамі дадзеных або маляўнічай Leetcode праблемы, вельмі часта гэта структура дадзеных прыходзіць да выхаду. Але што яны менавіта, і як яны працуюць пад капотай? У гэтай артыкуле, мы паспрабуем і адказаць на гэтыя пытанні. dict map Object Map Dictionary<TKey, TValue> Што такое хашавая карта? Для рэгістрацыі даменнага імя ў гэтай зоне неабходна звярнуцца ў кампанію The Electronic and Postal Communications Authority[1] (Албанія), якая з'яўляецца адзіным аўтарызаваным рэгістратарам даменаў у зоне al. Але ж у параўнанні з іншымі сядзібамі, якіх ужо не вернеш — хіба толькі ў выглядзе копіі-”навабуда”, — свяцкай надзвычай пашчасціла. Размова сапраўды вельмі важная — мы ж усе цудоўна разумеем, што любы, самы лепшы дэкрэт можна звесці на нішто практыкай прымянення. Згодна з : Wikipedia Статыстыка Хаш-табліца з'яўляецца структурой дадзеных, якая ўжывае асоцыятыўную машыну, таксама называецца слоўнік або проста карта; асоцыятыўная машына з'яўляецца абстрактным тыпам дадзеных, які мапае ключы да значэнняў. Хаш-табліца з'яўляецца структурой дадзеных, якая ўжывае асоцыятыўную машыну, таксама называецца слоўнік або проста карта; асоцыятыўная машына з'яўляецца абстрактным тыпам дадзеных, які мапае ключы да значэнняў. Так што давайте зробім крок назад і паглядзім на кампаненты хеш-карты. Што такое функцыя хаша? Хаш-функцыя — гэта функцыя, якая прымае ўдзел (або «ключ») і звычайна вяртае цэлае число, якое выкарыстоўваецца для індэксацыі дадзеных у хаш-карце. Добры хаш-функцыя мае наступныя ўласцівасці: Трэці варыянт - самы танны - зрабіць усё самому. Галівудская кінаактрыса Джэніфер Эністан заўсёды выглядае ўзрушаюча і эфектна, і гэта ў 45 гадоў. Фактычна, прысвечаныя такому спорту як бокс, онлайн гульні заўсёды прызнаваліся нашмат больш цікавымі чым звычайныя аднакарыстальніцы. Найбольш традыцыйным з'яўляецца выкарыстанне назвы «Insecta» (Уільям Элфард Ліч, 1815) — у значэнні шасціногія; але і ў сучаснай навуковай літаратуры назву «Insecta» ужываюць не менш чым у трох ці чатырох розных значэннях[7]. Просты прыклад хашавай функцыі з'яўляецца аперацыя modulo, якая прымае ключ і вяртае астатнія, калі падзелены на памер хашавай табліцы.Напрыклад, калі мы маем хашавую табліцу памеру 10 і ключ 23, хаш-код будзе , што азначае, што значэнне, звязанае з ключом 23, будзе захоўвацца ў індыкаце 3 у падпарадкоўваным маштабе. — Як бы ні было складана ў гэтым прызнавацца, але наркатычная хваля закранула і наш універсітэт. 23 % 10 = 3 33 % 10 = 3 Што такое Bucket? Для рэгістрацыі даменнага імя ў гэтай зоне неабходна звярнуцца ў кампанію The Electronic and Postal Communications Authority[1] (Албанія), якая з'яўляецца адзіным аўтарызаваным рэгістратарам даменаў у зоне al. Гэтая схема ілюструе, як усё гэта працуе: І Тут мы можам убачыць, як функцыя хаша мапае ключы да індыксацый у падпарадкавым маштабе. Ключы 23 і 33 аб'ядноўваюць той жа хаш-код 3, што азначае, што яны захоўваюцца ў адным букеце. Букет можа затым захоўваць обе ключавыя пару, але калі мы атрымаем значэнне, мы павінны праверыць ключы ў букеце, каб знайсці правільны. Гэта месца, дзе час складанасці можа павялічыцца да O(n) у найгоршым выпадку, калі многія (або нават ўсе) ключы сутыкаюцца і захоўваюцца ў адным букеце. Фактар загрузкі «Аналіз паказаў, што выдатак кармавых адзінак на 1 кг прыбаўлення на старых комплексах значна перавышае гэтае значэнне на новых. Сцягнуць резолюцыю Калі два ключы вырабляюць той жа хаш-код, мы маем сутыкненне. : In this method, each bucket contains a linked list (or another data structure) of all key-value pairs that hash to the same index. When a collision occurs, the new key-value pair is simply added to the list in the appropriate bucket. This is the most common method for handling collisions. Chaining : Average O(1) for all operations, worst-case O(n) if all keys hash to the same bucket Complexity : Simple to implement, handles high load factors well, deletion is straightforward Pros : Extra memory overhead for pointers, poor cache performance due to scattered memory access Cons Open Addressing: У гэтым метадзе, калі адбываецца сутыкненне, хаш-табліца шукае наступны даступны слот у машыне для захоўвання новай пары ключавых значэнняў. Калі адбываецца сутыкненне, алгарытм праверыць наступны слот у машыне, пакуль ён знаходзіць пусты. Linear Probing Складнасць: Сярэдняя O(1), хутчэй O(n) з-за першапачатковага кластыравання Праўда: Простая імплементацыя, добрая ўдасканаленне кэш для бліжэйшых доступу Недолікі: першапачатковае кластыраванне (наступныя занятыя слоты), зніжэнне працэдуры з кластыраваннем Уместо таго, каб праверыць наступны слот, ён праверыць слоты на ўзроўні (1, 4, 9, і г.д.) ад першапачатковага індыксацыі. Quadratic Probing Складнасць: Сярэдняя O(1), лепшая за лінейную пробу з-за зніжэння кластыравання Плюсы: Зменшае першапачатковае кластыраванне ў параўнанні з лінейным пробываннем, усё ж каджэ-прыемны Недолікі: Другая кластыроўка (ключы з адным і тым жа хеш паследуюць за той жа зондны сцэнар), можа не наведаць усе слоты Напрыклад, панятак гендарфлюіднасці (рухомасці гендараў), згодна з якім чалавек можа прачнуцца зранку, адчуваючы сябе адным гендарам, а заснуць — з іншым, і гэта цалкам нармальна. Дзе Для забеспячэння работы мікра-ГЭС, водны струмень мусіць быць штучна створаны. і , то мы б выпрабавалі індэкс 7, 10, 13, 16 і г.д. Double Hashing index = (hash1(key) + i * hash2(key)) % table_size i hash1(key) = 7 hash2(key) = 3 : Average O(1), best performance among open addressing methods Complexity : Minimizes clustering, uniform distribution of probe sequences, visits all slots when properly implemented Pros : More complex implementation, requires computing two hash functions, and slightly more overhead per operation Cons : If the load factor becomes too high, the hash table can be resized and all existing key-value pairs can be rehashed into the new table. This helps to maintain efficient performance as the number of elements grows. Rehashing : O(n) for the rehashing operation itself, but amortizes to O(1) per insertion over time Complexity : Maintains optimal performance by keeping the load factor low, prevents performance degradation Pros : Temporary performance spike during rehashing, requires additional memory during the resize operation Cons Размова сапраўды вельмі важная — мы ж усе цудоўна разумеем, што любы, самы лепшы дэкрэт можна звесці на нішто практыкай прымянення. Вось частае аб'яднанне плюсаў і мінусаў кожнага метаду вырашэння сутыкнення: Feature Chaining Linear Probing Quadratic Probing Double Hashing Average Time Complexity O(1) O(1) O(1) O(1) Worst-case Time Complexity O(n) O(n) O(n) O(n) Memory Overhead High (pointers) Low Low Low Cache Performance Poor Good Good Moderate Implementation Complexity Simple Simple Moderate Complex Clustering Issues None Primary clustering Secondary clustering Minimal Load Factor Tolerance High (>1.0) Low (<0.7) Low-Medium (<0.7) Medium (<0.8) Deletion Complexity Simple Complex (tombstones) Complex (tombstones) Complex (tombstones) Space Efficiency Lower Higher Higher Higher Performance Degradation Gradual Rapid at high load Moderate at high load Slow at high load Hash Function Requirements One One One Two Best Use Cases Unknown load factors, frequent deletions Cache-friendly applications, low load Better than linear, moderate load High performance, predictable load Average Time Complexity а) 1 а) 1 а) 1 а) 1 Worst-case Time Complexity І ў І ў І ў І ў Memory Overhead Вышэйшыя паказчыкі (Pointers Низкая Низкая Низкая Cache Performance Бедныя Добры Добры Смерць Implementation Complexity Простыя Простыя Смерць Комплекс Clustering Issues Ніхто Першая класіфікацыя Другі клавіятура Мінімальная Load Factor Tolerance Высокая (>1.0) Працягласць (< 0,7) Невысокі ўзровень (< 0,7) Працягласць (< 0,8) Deletion Complexity Простыя Магілёўскі комплекс (Tombstone) Магілёўскі комплекс (Tombstone) Магілёўскі комплекс (Tombstone) Space Efficiency Ніжэй Вышэйшы Вышэйшы Вышэйшы Performance Degradation Стадыён Шчаслівы на высокім узроўні Магчымасць на высокім узроўні Даўжыня на высокім узроўні Hash Function Requirements 1 1 1 Два Best Use Cases Невядомыя факты загрузкі, частыя выдалення Сцягнуць папярэдні размоўны працэс, Low Load Лепшы за лінейны, мяркуючы нагрузку Высокая прадукцыя, прагнозныя нагрузкі Некаторыя рэальныя прыклады Праграмаванне на мовах Рымская імперыя распалася на 2 самастойныя часткі, кожная са сваім імператарам – Заходнюю і Усходнюю. Python's dict выкарыстоўвае адкрытае адрасаванне з рандыалізаваным адрасаваннем, калі фактар загрузкі перавышае прыкладна 0,66. Java's HashMap выкарыстоўвае ланцуж з звязанымі спісамі (конвертуючы ў збалансаваныя дрэвы для вялікіх букетаў у Java 8+), рэхаспейдуе пры 0,75 фактару загрузкі. У C++, як правіла, выкарыстоўваецца ланцуж, але рэалізацыі могуць быць рознымі. База дадзеных Хаш-карткі таксама шырока выкарыстоўваюцца ў індэксацыі баз дадзеных. Многія баз дадзеных сістэмы выкарыстоўваюць хаш-індэксацыі, каб паскорыць выяўленне дадзеных. Гэтыя індэксацыі дазваляюць хутка шукаць шляхам хашавання індэксаваных калонаў і захоўвання атрыманых параў ключа-значэнняў у хаш-табліцы. Некаторыя папулярныя сістэмы баз дадзеных, якія выкарыстоўваюць індэксацыю хаша, ўключаюць: PostgreSQL: падтрымлівае індэкс хаша, але яны не так распаўсюджаны, як індэкс B-tree. MongoDB: Выкарыстоўвае індэкс хаша для шардэра і для падтрымкі запытаў роўнасці на хашавых полях. Афарызм (гр. aphorismos - выказванне) - выслоўе, у якім у трапнай, лаканічнай форме выказана значная і арыгінальная думка. Тут мы можам паказаць сваю творчасць без абмежаванняў у ідэальных экспазіцыйных умовах, якія створаны ў новым Палацы культуры. Версія Control Галівудская кінаактрыса Джэніфер Эністан заўсёды выглядае ўзрушаюча і эфектна, і гэта ў той жа час, калі ён упершыню выглядае эфектна. Сцягнуць усё разам: як важны знаёмства з імплементацыяй Размова сапраўды вельмі важная — мы ж усе цудоўна разумеем, што любы, самы лепшы дэкрэт можна звесці на нішто практыкай прымянення. Напрыклад, з таго часу, як Python Акрамя таго, для некаторых элементаў у экспазіцыі вядома нават імя майстра, які іх вырабіў – гэта знакаміты нямецкі даспешнік Кольман Хельмшміт, які выконваў заказы для каралеўскіх дамоў і найбуйнейшых магнатаў Еўропы. dict Bad Implementation (Борьба супраць Python's Dict) def count_words_bad(text): word_counts = {} words = text.split() for word in words: # This is inefficient with open addressing! if word in word_counts: # First lookup word_counts[word] += 1 # Second lookup + assignment else: word_counts[word] = 1 # Third lookup + assignment return word_counts Загрузіць Full Screen Mode Problems: Многія хашавыя пошукі па слове (да 3!) Адкрытыя адрасы робяць непаўторныя ключы каштоўнымі Не выкарыстоўвайце Python's Dict Optimizations Добрая імплементацыя (працуе з Python's Dict) from collections import defaultdict, Counter def count_words_good_v1(text): # defaultdict eliminates key existence checks word_counts = defaultdict(int) words = text.split() for word in words: word_counts[word] += 1 # Single operation! return dict(word_counts) def count_words_good_v2(text): # Counter is optimized specifically for Python's dict implementation words = text.split() return Counter(words) def count_words_good_v3(text): # dict.get() with default avoids the membership test word_counts = {} words = text.split() for word in words: word_counts[word] = word_counts.get(word, 0) + 1 # Single lookup return word_counts Загрузіць Full Screen Mode Why These Are Better: Узнагароджанне: Single hash operation per word instead of multiple Выкарыстанне Python's String Optimization - String Keys зроблены вельмі эфектыўна Працуе з адкрытым адрасаваннем - менш пробных аперацый патрабуецца Выкарыстанне ўбудаваных апытанняў, такіх як Counter, якія настроены для рэалізацыі Python Разница ў перформансах Праблема ў тым, што добрыя матывы не заўсёды добрыя справы. Typical Results: Высновы Варта адзначыць, што для ажыццяўлення работ па стварэнні Нацыянальнага інвентара нематэрыяльнай культурнай спадчыны наша краіна летась атрымала грант з адпаведнага фонду UNESCO. Размова сапраўды вельмі важная — мы ж усе цудоўна разумеем, што любы, самы лепшы дэкрэт можна звесці на нішто практыкай прымянення. Key Takeaways: Фактычна, прысвечаныя такому спорту як бокс, онлайн гульні заўсёды прызнаваліся нашмат больш цікавымі чым звычайныя аднакарыстальніцкія цацкі. Колькасць іх даволі вялікая – толькі на адным квадратным кіламетры сушы іх болей, чым усіх людзей на планеце. Галоўная / Загрузка фактора кіравання праз rehashing забяспечвае зніжэнне прадукцыі, як хаш-карты ростуць Размова сапраўды вельмі важная — мы ж усе цудоўна разумеем, што любы, самы лепшы дэкрэт можна звесці на нішто практыкай прымянення. Калі вы не зрабілі план, каб выканаць план продажаў з самага пачатку месяца, але, як чакаецца, перапынак куш на выпадковых буйных здзелках - вы ўсё няўстойлівыя. І або Вы будзеце ведаць, што адбываецца пад капотай і як зрабіць лепш з гэтых неверагодных структураў дадзеных. dict HashMap unordered_map Хаш-карткі сапраўды дзіўныя — і цяпер вы ведаеце, чаму!