Proqramlaşdırma zamanı bir hash masası ilə lüğət arasındakı fərq nədir?


cavab 1:

Texniki baxımdan, əsasən eyni ola bilər. Hər ikisi də hər bir qeydin bənzərsiz müəyyənləşdirilməsi üçün müəyyən bir indeks ilə məlumatların saxlanması üçün istifadə olunur. Ümumiyyətlə açar dəyər cütü şəklində, burada həm açar, həm də hər hansı bir məlumat növü, o cümlədən struktur / siniflər ola bilər.

Bu tip məlumat toplama istifadəsi əsas bir dəyəri istifadə edərək müəyyən bir yazını çox tez tapmaqdır. Bu indeks / açar artan və ya enən qaydada sıralandıqda yaxşı işləyir. Bu, ikili axtarış imkanı verir ki, minimal sayda müqayisə ilə bir qeyd tapa bilərsiniz. Bununla birlikdə, yeni bir qeyd daxil etməyiniz lazım olduqda yerüstü xərcləri artırır, çünki sıralama qaydasını saxlamaq üçün onu indeksin ortasına yerləşdirməlisiniz. Bu o deməkdir ki, indeksdəki hər açar da indeksdə yuxarıya köçürülməlidir. Axtarış sürətli olsa da, yeni qeydlər əlavə etmək mümkün deyil. (Axtarış ağacı vəziyyətində, qeydləri əlavə etmək kifayət qədər tez edilə bilər, baxmayaraq ki, ağacı balansdan çıxarta bilərsiniz ...)

Hash masaları, açarın üstündəki bir hash dəyəri hesablayaraq bu problemi həll edir. Bu dəyər sonra yaddaşdakı bir çömçə yerini göstərir. Beləliklə, hash 0 ilə 100 arasındakı bir nəticə ilə nəticələnə bilər və bir sıra 100 çömçə olacaqdır. Müəyyən bir qeyd tapmaq yalnız düzgün çömçə almaq üçün hashı hesablamaqdır.

Kovanın özü tercihen yalnız bir qeydə sahib olacaq, ancaq hash toqquşma ilə nəticələnə bilər və buna görə də bir kovada çox sayda qeyd ola bilər. 1000 qeydiniz varsa, 100 kova varsa orta hesabla 10 ədəd qeyd olacaqdır. Bununla birlikdə, 10 qeyddə axtarış 1000 qeyddə axtarışdan daha sürətli olur. Kovaların daha böyük bir siyahısını istifadə etsəniz, ümumiyyətlə bir çömçə üçün daha az qeyd var.

Buna görə bir hash masası daha sürətli axtarış üçün yaddaşını qurban verir. Ümumiyyətlə, bir kova bir sıra (açar) qeydlər üçün bir göstəricidir, buna görə çömçə üçün 4 və ya 8 bayt tələb olunur. Bir milyon çömçə istifadə etsəniz, bu, indeks üçün 4 və ya 8 meqabaytdan azdır, ancaq milyonlarla qeydləri saxlamaq və hər açarı (demək olar ki) dərhal tapmaq üçün istifadə edə bilərsiniz! Onları verilənlər bazası üçün bu qədər güclü edən budur.

Bir lüğət assosiativ bir sıra hesab olunur, hash masası isə tənzimlənməmiş assosiativ massivdir. Lüğətlər ilə bir çeşidlənmiş və ya çeşidlənməmiş ola bilərsiniz. Əksər inkişaf etdiricilər, ümumiyyətlə sadəcə hash masası olan çeşidlənməmiş birini istifadə edir! Bunun bir çox cəhətdən sürətli olmasıdır.

Bununla birlikdə məlumatları saxlamaq üçün bir axtarış ağacından istifadə edən bir sıralanmış bir lüğət də mümkündür. Bu axtarış ağacları da kovalardakı hash cədvəllərində istifadə olunur, çünki doğru kovanı tapdıqdan sonra hələ də bir kovada axtarmalı ola bilərsiniz. Ancaq sıralanmış bir lüğət üçün yeganə istifadə, bütün qeydləri açar sıralamasında sadalamaqdır. Və ya iki əsas dəyər arasında uyğun olan qeydləri tapmaq.

Bu, məni hash ağaclarının çatışmazlığı vəziyyətinə salır, çünki müəyyən bir naxışa uyğun bir açara uyğun qeydləri tapmaq istəyə bilərsiniz. Məsələn, adı 'W' hərfi ilə başlayan hər kəs. Və ya 45 ilə 60 arasındakı hər hansı bir nömrə. Bir axtarış ağacında, bu sorğuya uyğun gələn ilk yazını axtararaq asanlıqla axtardığınızı tapa bilərsiniz və sonra daha çox qeyd tapmaq üçün yuxarı və aşağı gedin Artıq mövcud olmayan qeydləri tapmaq. Bir hash masası ilə əvəzinə bütün qeydləri yoxlamalı olursunuz.

Beləliklə, bir milyon qeydli ikili ağacınız varsa, axtarış düyməsinə uyğun gələn ilk qeydin tapılması üçün 20-dək müqayisə tələb oluna bilər və sonra axtarışa uyğun açarların olduğu qədər müqayisə aparılır. . İlk və son uyğunsuz açarları müqayisə etmək üçün üstəgəl iki. Beləliklə, 50 qeyd uyğun gəlirsə, hamısını tapmaq üçün 70 müqayisə edə bilərsiniz.

Bir hash cədvəlində bir milyon müqayisə ehtiyacınız olacaq ...

Dəqiq bir açar tapmaq üçün, hash masasına yalnız bir müqayisə və 20-yə qədər ikili ağac lazımdır ...

Bir lüğətə gəlincə. Bunlar ya hash masaları və ya axtarış ağaclarıdır. Bunun arxasındakı kodla müəyyən edilir. Sözlüklərin bəzi tətbiqləri, ikisini də istifadə edə bilər, çünki onlar çömçələr üçün ayrıca bir sıra istifadə edərlər, sonrakı və əvvəlki qeydlər üçün axtarış ağacı yaratmaq üçün istifadə olunur. Bu strukturlardakı sorğuları yerinə yetirmək əvvəlcə hansı axtarış metodunun ən effektiv olacağına qərar verəcəkdir. Müəyyən bir açar tapmaq istəyirsinizsə, hash masası istifadə olunur. Müəyyən bir ərazini axtarmaq lazımdırsa, bunun yerinə axtarış ağacı istifadə olunur.

Yəni fərq? Bir hash masası, əsas dəyər cütlərini saxlamaq üçün yalnız bir texnikadır. Bir lüğət əsas məlumat cütlərini saxlayır, lakin saxlama metodunu göstərmir. Lüğətin arxasında bir hash masası ola bilər!


cavab 2:

Bir hash masası məlumatları bir sıra formatında saxlayır, hər bir məlumat dəyəri öz unikal indeks dəyərinə malikdir. İstədiyiniz məlumatların indeksini bilsək, məlumatlara giriş çox sürətli olur. Beləliklə məlumatların ölçüsündən asılı olmayaraq daxiletmə və axtarış proseslərinin çox sürətli olduğu bir məlumat quruluşuna çevrilir.

Bir lüğət bir qrup obyektin saxlanması üçün universal bir məlumat quruluşudur. Bir lüğətdə bir sıra düymələr var və hər bir düymənin vahid təyin edilmiş dəyəri var. Bir düymə görünsə, lüğət öz dəyərini qaytarır.

Bir lüğət birbaşa assosiativ bir sıra dəyərinə istinad etmək üçün bir düymədən istifadə edir.

yəni (KEY => VALUE)

Bir hash daha çox dəyərin yerləşdiyi yaddaşdakı mövqeyi (və ya daha çox sadəcə bir sıra) hesablamaq üçün bir hash funksiyasından istifadə edən bir hash masası kimi təsvir olunur. Hash KEY-i giriş kimi götürür və çıxış olaraq bir dəyəri göstərir. Sonra bu dəyəri yaddaşa və ya serial indeksinə qoyun.

yəni KEY => HASH FUNCTION => Dəyər

Hash məlumatların quruluşu


cavab 3:

Lüğət daha ümumi bir növüdür, HashTable isə ümumi deyil. Lüğət ümumi olduğundan HashTable-dan daha sürətli (əlavə et, silmək, axtarış kimi əməliyyatlar) daha sürətli olur. Boks / unboksinq səbəbindən məlumat alınması Lüğətə nisbətən daha yavaşdır.Təqdim edilmiş hash cədvəlində olmayan bir açara daxil olmağa çalışırsınızsa, boş dəyərlər verilir. Göstərilən lüğətdə olmayan bir lüğətdə bir düyməyə girməyə çalışarsanız, bir səhv çıxır.

HashTable mövzusu təhlükəsizdir. Lüğət də iplik üçün təhlükəsizdir, ancaq yalnız ictimai statik üzvlər üçün.