А Python дээр Өнгөрсөн эсвэл JavaScript дээр. PHP дээр Associative Array, C++-д. Хашигны газрын зураг практик бүх өндөр түвшний програмчлалын хэл дээр гүйцэтгэсэн байна. Тэгээд тэд гайхалтай байдаг! Хэрэв та тогтмол цаг хугацаанд өгөгдлийг хадгалах, дараа нь өгөгдлийг хандахыг хүсэхгүй байна уу? Хэрэв та том өгөгдлийг цуглуулах эсвэл Leetcode-ийн асуудалтай ажилладаг уу, энэ өгөгдлийн бүтэц нь ихэвчлэн тусламжтай байдаг. Гэхдээ тэд зөв юу вэ, тэд хавтгай дэх хэрхэн ажилладаг вэ? Энэ нийтлэлд бид энэ асуултанд хариулахыг хүсч байна. dict map Object Map Dictionary<TKey, TValue> Хаш газрын зураг юу вэ? Өндөр түвшинд, хашигны зураг, эсвэл хашигны ширхэг нь asociative array abstract data type-ийг гүйцэтгэхийн тулд өгөгдлийн бүтэц юм. Хашиг нь газрын зураг дахь үнэ цэнэнийг нэгтгэхийн тулд ашиглаж байна, үнэ цэнэ нь хадгалан байгаа өгөгдлийг юм. Хашигны ширхэг нь хашигтай үнэ цэнэтэй хооронд хурдан суулгах, илрүүлэх, хайж авах боломжтой. Үнэндээ, Эдгээр үйл ажиллагаа нь дундаж хугацааны хязгаарлалт O(1) юм, энэ нь тэдгээр нь тогтмол цаг хугацаанд хийх боломжтой гэсэн үг юм! Энэ онцлог нь хашиг газрын зураг нь програмчланд хамгийн их хэрэглэгдсэн өгөгдлийн бүтэц болгодог. Гэсэн хэдий ч, бид дараах гэж үзнэ үү. Эдгээр үйл явдлын хамгийн алдартай хугацааны хязгаарлалт нь O(n) юм. Эдгээр үйл явдлууд нь зарим тохиолдолд байж болох бөгөөд бид интернелийн талаар илүү их мэдэж байгаа бол бид Эдгээр үйл явдлыг явах боломжийг олгодог. Дараа нь : Википедиа бичлэг хаш тавиур нь ассоциатив матриц, хэлбэрээр хэлбэрээр, эсвэл зүгээр л газрын зураг гэж нэрлэдэг өгөгдлийн бүтэц юм; ассоциатив матриц нь хавтгай өгөгдлийн төрөл юм. Хаш тавиур нь индекс, хаш код гэж нэрлэдэг индекс нь харах функцийг ашигладаг. хаш тавиур нь ассоциатив матриц, хэлбэрээр хэлбэрээр, эсвэл зүгээр л газрын зураг гэж нэрлэдэг өгөгдлийн бүтэц юм; ассоциатив матриц нь хавтгай өгөгдлийн төрөл юм. Хаш тавиур нь индекс, хаш код гэж нэрлэдэг индекс нь харах функцийг ашигладаг. Тэгэхээр бид тавтай морилно уу, хашигны газрын зурагны бүрэлдэхүүн хэсгүүдийг үзнэ үү. Хаш функц нь юу вэ? Хашигтай функц нь өгөгдөл хашааны газрын зураг дахь өгөгдлийн индекс хийхэд ашиглаж буй цайрдлыг returns.The key is transformed into an integer, which is then used to determine the index in the underlying array where the value is stored. Хаш функц нь дараах шинж чанартай байдаг: Детерминист: Эдгээр нэг эх сурвалж нь үргэлж Эдгээр нэг эх сурвалж болно. Хаш функц нь хаш тавтай морилноор хавтгай тавтай морилноор хуваалцахын тулд хаш тавтай морилно уу. Өргөтгөлт: Хашиг функцийг хурдан тооцоолж байх ёстой, тэр ч байтугай том хэрэглээнд. Хязгаарлалт минимизирууд: Хязгаарлалттай ширээний газар нь ихэвчлэн хязгаарлалттай ширээний ширээний хязгаарлалттай байдаг. Энэ нь янз бүрийн ширээний нэг хязгаарлалттай ширээний ширээг үүсгэдэг. Эдгээр хязгаарлалтгүй байдаг ч, сайн хязгаарлалттай функц хоёр өөр ширээний нэг хязгаарлалттай ширээний ширээг үүсгүүлдэг. Хаш функцины хялбар жишээ нь модуль үйл ажиллагаа юм. Энэ нь хаш ширээний хэмжээтэй хуваалцах үед хаш ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээний ширээтэй байдаг. , энэ нь тавтай морилно уу, 23-ийг холбогдсон үнэ цэнэ нь үндсэн матриц дахь индекс 3 дээр хадгалагдаж болно. Тэгээд тавтай морилно уу 33, хашигны код нь түүнчлэн, энэ нь бидний босоо байна гэж нэрлэдэг. Энэ тохиолдолд, хооронд хооронд нэг индекс нь хоёр ширхэг хуваалцах болно. 23 % 10 = 3 33 % 10 = 3 Bucket нь юу вэ? Букет хашааны хашааны хашаа юм. Хашааны хашааны хашааны хашааны хашаа нь хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашааны хашаатай хашаатай хашаатай хашаатай хашаатай хашаа Эдгээр диаграм нь энэ бүх зүйлийг хэрхэн ажилладаг: Өнгөрсөн Энд бид хаш функцийг хашааны хавтгай дээр индексыг харьцуулахын тулд хэрхэн үзнэ үү. 23 болон 33 хавтгай нь 3 нь хашааны кодыг нэгтгэдэг. Энэ нь тэдгээр нь нэг хавтгай дээр хадгаладаг гэж хэлдэг. Хавтгай дараа нь хоёр хавтгай үнэ цэнэтэй хавтгай хадгаладаг, Гэхдээ бид үнэ цэнэтэй олж авах үед бид зөв хавтгай дээр хавтгай хайж байх хэрэгтэй. Энэ бол цаг хугацааны ихэнх нь O(n) хүртэл нэмэгдэж болно найдвартай тохиолдолд, хэд хэдэн (асаар бүх) хавтгай хавтгай нь нэг хавтгай дээр хадгаладаг. Ажлын Faktor Ачааллын коефициент нь хашигны ширээний бүрэн чанарын хэмжээ юм. Энэ нь хашигны ширээний элементүүд нь хашигны ширээний буцаан (бооцоо) тоотай хуваалцсан. Хашигны ширээний ширээний элементүүд нь хашигны тоотай харьцуулахад илүү их байдаг гэж нэрлэдэг. Энэ нь хашигны тоотай харьцуулахад хашигны ширээний элементүүдтэй байдаг. Коллежийн шийдэл Хоёр ключ нэг хашиг код үүсгэдэг үед бид хашигны газрын зурагд хашигны хянахын тулд хэд хэдэн стратеги байдаг: : 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) Pro: Хэвлэх нь хялбар, ойролцоогоор хандахын тулд сайн кеш гүйцэтгэл Хязгаарлалт: Эхний Clustering (хамгийн сүүлийн үеийн байрладаг Slots), Clustering нь гүйцэтгэлийн бууруулах : Дараагийн слот шалгахын тулд энэ нь эхний индексээс нэмэгдэж буй хязгаар (1, 4, 9, гэх мэт) шалгах болно. Quadratic Probing Хязгаарлалт: Хязгаарлалт O(1), хязгаарлалт багасгах нь линеар sondering илүү сайн Pro: Linear probing-тай харьцуулахад анхны clustering-ийг багасгах, хэзээ ч тавтай морилно уу Хязгаарлалт: Хоёрдугатай цуглуулах (ямар ч хашигтай ключ нь нэг зонд цуглуулалтай), бүх Slots-ийг зочилж чадахгүй : Хаш функцийг ашигладаг. Хамгийн сүүлийн үеийн хувилбар руу үргэлж дамжуулан линейны хувилбар, хавтгай дөрвөлжин хувилбар, хоёр хавтгай дөрвөлжин хувилбар тус бүрийн хавтгай нь тусгай түвшин хэмжээтэй тооцох болно. Формула нь ихэвчлэн: Үнэндээ Энэ нь сондын туршилтын тоо юм. Хоёр дахь хаш функц нь бүх тоноглогдсон боломжийг хангахын тулд тавтай морилно уу. Жишээ нь, Нөхцөл , дараа нь бид индекс 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 ямар ч үндсэн Clustering Өнгөрсөн Clustering Минимал Load Factor Tolerance Өндөр (>1.0) Өнгөрсөн (<0.7) Нийт дунд (<0.7) Өнгөрсөн (<0.8) Deletion Complexity Өнгөрсөн Комплекс (хөвлөмж) Комплекс (хөвлөмж) Комплекс (хөвлөмж) Space Efficiency Өнгөрсөн Өндөр Өндөр Өндөр Performance Degradation Өнгөрсөн Өндөр ачааны хурдан Өндөр ачаалалтай moderate Өндөр ачаалалтай Hash Function Requirements нэг нэг нэг хоёр Best Use Cases Зөвлөмжгүй ачаалал Faktor, Frequent Deletions Cache-friendly програмууд, бага ачаалал Linear, moderate ачаалалтай илүү сайн Өндөр гүйцэтгэл, урьдчилан сэргийлэх ачаалал Жишээ нь Real-World Програм хангамжийн програм хангамж Бүх програм хангамжүүд нь хашигны газрын зурагтай байдаг. Эдгээр хэрэглээн нь ихэвчлэн өндөр үр ашигтай гүйцэтгэлийг хангах, бохирдлыг үр дүнтэй хянахын тулд дээрх тодорхойлолттай техникийг багтааж ашигладаг. Python-ийн dict нь хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал хязгаарлагдмал. Java-ийн HashMap нь холбогдсон жагсаалттай цуглуулах ашигладаг (Java 8+-д том баглаа боодол нь балансирован арлууд руу конвертирууд), 0.75 ачаалалтай. C++-ийн unordered_map нь ихэвчлэн Chaining ашигладаг боловч имплементацүүд өөр өөр байж болно. Компьютерийн систем Хашиг карт нь базар индексийг өргөн хэрэглэдэг. Олон базар систем нь хашиг индекс хэрэглэдэг. Эдгээр индексүүд нь индексийн ширхэг хашааж, хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хашааг хаша Хашиг индексийг ашигладаг зарим алдартай мэдээллийн системүүд нь: PostgreSQL: Хашиг индекс дэмждэг, харин B-tree индекс гэх мэт ихэвчлэн хэрэглэдэг биш юм. MongoDB: Хашигны индекс ашигладаг sharding болон хашигтай газар дээр эвдэх асуултуудыг дэмждэг. Redis: Хашигны газрын зураг нь үндсэн өгөгдлийн бүтэц болгон гүйцэтгэдэг, ключ-төрөгдөл бүтэц нь үр ашигтай хадгалах, олж авах боломжийг олгодог. Эдгээр имплементациуд нь харьцуулагдсан хэшинг, хакердах шийдэл нь хатуу үндсэн принципейг ашиглан ашигладаг боловч ихэвчлэн өгөгдлийн контекстд тусгай нэмэлт оптимизацийг агуулдаг. Версия хяналтын Git гэх мэт хувилбар хяналтын систем файлын өөрчлөлтийг үр ашигтай удирдах хашаар ашигладаг. Git-ийн бүх хувилбар нь SHA-1 хашаар өөрийн агуулгыг харуулдаг. Энэ нь Git-ийн хувилбар дахь хувилбар, хувилбар, бусад орнуудад хурдан хайж чадна. Git-ийн хашаар хашаар хашаар хашаар хашаар хашаар ашигладаггүй, энэ нь шифрлэдэг хашаар хашаар хашаар хашаар хашаар хашаар хашаар хашаар хашаар хашаар хашаар хашаар ашигладаг. Бүгдийг нэгтгэх: Тавтай морилно уу Энэ нь зөвхөн теорийн тухай биш юм! Хашиг газрын зураг таны сонгосон програм хангамжийн хэл дээр хэрхэн имплементийн нь таны кодд үр дүнтэй гүйцэтгэл сайжруулах болно. Жишээ нь, Python optimized string handling нь open addressing ашигладаг, энэ нь илүү сайн гүйцэтгэлийг сайжруулдаг. Энд нь үр дүнтэй vs хязгаарлагдмал код бичнэ үү: 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 Бүх дэлгэц mode Exit full screen mode Problems: Олон хашиг үзүүлэлтүүд нь хэлбэрийн хувьд (до 3!) Open addressing нь ключгүй шалгах үнэтэй болгодог Python-ийн dict optimizations ашиглан ашигладаггүй Good Implementation (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 Бүх дэлгэц mode Exit full screen mode Why These Are Better: Нэг хашиг үйл явцыг хэлбэрийн өөр өөрт Python-ийн string optimization ашиглан - string keys нь маш үр дүнтэй боловсруулсан Open addressing-тай ажилладаг - хязгааргүй probing үйл ажиллагаа шаардлагатай Counter гэх мэт суурилсан оптимизацийг ашигладаг бөгөөд Python-ийн имплементацид тохируулсан Бүтээгдэхүүний өөр сайн имплементац нь ихэвчлэн 2-3x хурдан байдаг, зүгээр л Python-ийн dict имплементацийг мэдэхийг, ажиллуулахын тулд! Typical Results: Баримтлал Хашиг карт нь компьютерийн шинжлэх ухааны хамгийн чухал, хүчтэй өгөгдлийн бүтэцүүдийн нэг юм. Энэ нь орчин үеийн програмчлалын хувьд чухал болгон өгөгдлийн хамгийн тохиромжтой цаг хугацааны хангамжийг олгодог. Эдгээр уян хатан, бид хэш функцийг ухаалаг хэрэглэх, стратегийн босоо шийдэл, амархан ачаалал факторын менежментийг ашиглан тэдний гайхамшигтай O(1) хоорондын гүйцэтгэлийг хангахын тулд хэрхэн олж авсан. Хаш газрын зурагны "маги" нь үнэхээр Magic биш юм - энэ нь сайн боловсруулсан алгоритм, өгөгдлийн бүтэцтэй хамтран ажилладаг үр дүн юм. Эдгээр интерналы мэдэгдэх нь бидний O(n) найдвартай сценарийг бууруулах, илүү үр ашигтай код бичлэхийн тулд тусалдаг. Key Takeaways: Хаш функц нь үндсэн юм - тэд өгөгдлийн харьцуулахад харьцуулахад, шууд босоо хурдыг нөлөө үзүүлдэг Ажлын шийдэл стратегүүд нь тусгай компромистай байдаг: хялбар байдал, хүчтэй байдал, хэв маяг үр ашигтай, кеш хүчин чадал нь нээлттэй шийдэл Ачаалал фактор менежментийг rehashing ашиглан хашаа газрын зураг нэмэгдэж байгаа тул гүйцэтгэлийн хязгаарлалыг хангах Идэвхжүүлэх мэдлэг үнэхээр гүйцэтгэлийн сайжруулдаг - таны хэл дээр цуглуулах эсвэл нээлттэй хаяг ашиглахыг мэдэх нь таны код 2-3x хурдан болгодог Хэрэв та Python скрипт optimize, Java-д гүйцэтгэлийн асуудал debugging, эсвэл мэдээллийн сан системийн архитектур шийдлийг хийх, HashMap-ийн интернал нь танд арга хэрэгсэл олгодог. Нөхцөл эсвэл Та хавтгай дөрвөн долоо хоногт тавтай морилно уу, энэ гайхамшигтай өгөгдлийн бүтэцээс хамгийн ихээхэн ашиглах вэ? dict HashMap unordered_map Хаш газрын зураг үнэхээр гайхамшигтай байдаг - одоо та юу гэж мэдэж байна!