1 / 34

لغت نامه و جدول درهم سازي Dictionaries and Hash Tables

لغت نامه و جدول درهم سازي Dictionaries and Hash Tables . ساختمان داده ها و الگوريتم. لغت نامه - Dictionary. مجموعه اي از زوج هاي مرتب به صورت: (key, element) کليد زوج هاي مرتب متفاوت است عمليات روي لغت نامه: get(theKey) put(theKey, theElement) remove(theKey). کاربرد Application.

bruno
Download Presentation

لغت نامه و جدول درهم سازي Dictionaries and Hash Tables

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. لغت نامه و جدول درهم سازيDictionaries and Hash Tables ساختمان داده ها و الگوريتم

  2. لغت نامه - Dictionary • مجموعه اي از زوج هاي مرتب به صورت: • (key, element) • کليد زوج هاي مرتب متفاوت است • عمليات روي لغت نامه: • get(theKey) • put(theKey, theElement) • remove(theKey)

  3. کاربرد Application • مجموعه دانشجويان اين کلاس • (key, element) = (student name, linear list of assignment and exam scores) • همه کليدها منحصر بفرد هستند • مثال: • پيدا کردن زوج مرتبي که کليد آن ”علي تقي زاده“ باشد • بروز رساني رکوردي که کليد آن ”ايمان معتمدي“ است • بروز رساني معادل حذف رکورد فعلي و سپس اضافه کردن رکورد با تغييرات جديد است • Update(x) • R = get(x) ; // get the record with key X • remove(x) ; • Modify R • Put(x , R)

  4. کليدهاي تکراري در لغت نامه • لغت نامه ممکن است کليد تکراري داشته باشد • همانند کلمات تکراري يک لغت نامه • روان : روح، جان • روان: رونده ، جاري • روان: اسم خاص (اسم شهر) • روان: اسم خاص (اسم شخص) • مي توان ركوردهاي هم كليد را با يك ليست نشان داد

  5. نمايش لغت نامه با يک ليست خطي L = (e0, e1, e2, e3, …, en-1) Each ei is a pair (key, element). 5-pair dictionary D = (a, b, c, d, e). a = (aKey, aElement), b = (bKey, bElement), etc. مي توان از آرايه يا ليست پيوندي استفاده کرد

  6. نمايش با آرايه a b c d e • get(theKey) • O(size) time • put(theKey, theElement) • O(size)براي تشخيص دادن کليد تکراري و , O(1)براي افزودن کليد به سمت راست آرايه. • remove(theKey) • O(size) time.

  7. آرايه مرتب A B C D E • اعضا بر اساس کليد به صورت صعودي مرتب شده اند • get(theKey) • O(log size) time • put(theKey, theElement) • O(log size)براي يافتن کليد تکراري, O(size)براي افزودن کليد در محل مناسب • remove(theKey) • O(size) time.

  8. زنجيره نامرتب firstNode null a b c d e • get(theKey) • O(size) time • put(theKey, theElement) • O(size)براي تشخيص دادن کليد تکراري و , O(1)براي افزودن کليد به سمت راست آرايه. • remove(theKey) • O(size) time.

  9. زنجيره مرتب firstNode null A B C D E • اعضا بر اساس کليد به صورت صعودي مرتب شده اند. • get(theKey) • O(size) time • put(theKey, theElement) • O(size)براي تشخيص دادن کليد تکراري و , O(1)براي افزودن کليد به سمت راست آرايه.

  10. زنجيره مرتب firstNode null A B C D E • اعضا بر اساس کليد به صورت صعودي مرتب شده اند • remove(theKey) • O(size) time. • چگونه مي توان در ليست هاي پيوندي هم جستجوي لگاريتمي انجام داد ؟

  11. بحث و بررسي • لغت نامه ساختاري براي نگهداري رکوردهاي اطلاعاتي است • در اغلب برنامه ها مانند كامپايلرها و پردازش متن كاربرد زيادي دارد • بنابراين هزينه عمليات اين ساختار داده بايد تا حد ممكن كم شود • زمان اجراي عمليات حذف ، اضافه كردن و جستجوي لغت نامه از خطي يا لگاريتمي است • پياده سازي هاي مختلف برخي عمليات را با هزينه كمتري نسبت به ديگر پياده سازي ها انجام مي دهند • هزينه افزودن به آرايه نامرتب O(1)‌ است اما همين هزينه براي ليست مرتب O(Size) است ؟ • ايده ال ما اين است كه هزينه عمليات مختلف حذف روي لغت نامه ها را به O(1) ‌ كاهش دهيم .

  12. Symbol Table • برنامه نويسان مي توانند طبق قواعد زبان، متغيرها را به دلخواه نامگذاري کنند • کامپايلر براي اختصاص حافظه و مديريت متغيرها، آنها را در جدولي به نام Symbol Table نگهداري مي کند • اين جدول نمونه اي از ساختار داده Dictionary است. • دسترسي به اين جدول از مرتبه Θ(N) است. براي دسترسي Θ(1) لازم است آرايه هاي خيلي بزرگ تعريف کنيم • اعداد صحيح: 65536 • رشته ها: بيشتر از اين مقدار

  13. Symbol Table Record X Key[X] data fields كامپايلر از اين جدول براي نگهداري و مديريت متغيرها و علايم تعريف شده در برنامه ها استفاده مي كند هر Symbol Table شامل مجموعه اي از ركوردها مثل x است Symbol Table ADT Class SymbolTable{ Records[1..N] //Operations: Insert(X:Record) Delete(X:Record) Search(K:key) }

  14. Hashing Offset Index 100 0 250 1 85 2 130 3 Index Generator (Hash Function) K (Integer) Variable Name (String) 54 4 500 5 200 6 • Hashing روشي براي دسترسي به اعضاي آرايه هايي مثل Symbol Table است که از مرتبه Θ(1) است • تابع Hashing تابعي معين (Deterministic) است!

  15. دسترسي مستقيم • فرض كنيد كليد ركوردها اعدادي در بازه 0..m-1 باشند • آرايه اي m عضويT[0..m-1] را مي توان ساخت: • T[k] = x if key(x)=k • T[k] = nil otherwise • Complexity: Θ(1) • مساله: اگر دامنه كليدها بزرگ باشد ...؟ • مثلا اعداد صحيح !

  16. راه حل • تعريف تابع Hash كه مجموعه كليدها را به مجموعه انديسها ترجمه مي كند: • مساله جديد: اگر دو كليد به يك مكان ترجمه شوند؛ برخورد اتفاق مي افتدCollision

  17. حل برخورد با ليست پيوندي بدترين حالت همه كليدها به يك محل نگاشت شوند: دسترسي: Θ(n)

  18. جستجوي يك ركورد • اگر n كليد داشته باشيم و آرايه m عضوي باشد و تابع نگاشت يكنواخت باشد: • a = n /m = load factor  كليد به ازاي هر خانه آرايه • Θ(1 + a ) : هزينه جستجوي ناموفق! • Θ(1) : يافتن محل كليد • Θ(a) : يافتن ركورد در ليست • if a = O(1)  Θ(1) = هزينه جستجوي ناموفق • هزينه جستجوي موفق هم در نهايت، همين اندازه است: Θ(1+a)

  19. انتخاب تابع Hash • نگاشت يكنواخت كليدها به خانه هاي آرايه • عدم حساسيت به تركيب خاص ركوردهاي ورودي • quicksort را به خاطر بياوريد! • روش تقسيم:h(k) = k mod m • نگاشت كليدهاي k به 0..m-1 • نگاشت يكنواخت 1..k • اگر m=2r باشد، تابع Hash ، به r بيت كم ارزش بستگي دارد!

  20. انتخاب تابع Hash • m را طوري انتخاب كنيد كه عددي اول باشد • m را عددي نزديك تواني از 2 يا 10 انتخاب نكنيد! • گرچه الگوريتمهاي تقسيم و حل با آرايه هايي كه طول آنها عدد اول باشد خوب كار نمي كنند؛ در اينجا چنين انتخابي لازم است • روش ضرب • h(k) = ⌊ m (kA - ⌊kA⌋) ⌋ . , 0 < A < 1 • پياده سازي سريع روش ضرب • با استفاده از عملگرهاي شيفت، اين تابع پياده سازي سريعي دارد

  21. پياده سازي روش ضرب • عملگرهاي شيفت بيت • 11101101 >> 1 = 01110110  shr(x,n) == x /2n • 11101101 << 1 = 11011010 shl(x,n) == x * 2n

  22. پياده سازي روش ضرب • اگر اعداد صحيح مورد استفاده در کامپيوتر w‌ بيتي و m =2p باشد. • و k يك عدد W بيتي و عدد اعشاري A به شكل A =S/2W باشد كه در آن S‌ يك عدد W‌بيتي است • به زبان ساده ، A‌عددي به فرم 1/2, 3/4, 1/8, 7/16,… باشد • [KA] =[KS/2W] = [KS >> W ] • f= KA – [KA] = (KS >> w) – [KS >> w] = fractional wbits • e.g. 0.1110101 • f * m = f * 2p = f << p  select p bits

  23. حل برخورد با آدرس دهي باز • آدرس دهي باز: به جاي استفاده از ليست پيوندي، از خود آرايه براي نگهداري رکوردهاي برخوردي استفاده مي شود • براي افزودن رکوردي جديد؛ ابتدا محلي خالي در آرايه پيدا مي شود و رکورد جديد در اين محل جاي مي گيرد • تابع افزودن رکورد جديد ، علاوه بر کليد يک پارامتر ديگر به نام Probe Number هم دارد • h: U * { 0 , 1 , …, m -1}  {0, 1, … , m-1} • مجموعه {h(k,0), h(k,1) , …, h(k,m-1)} بايد ترکيبي از مجموعه {0..m-1} ‌باشد • به زبان رياضي: تابع Hash روي مجموعه {0..M-1} بسته باشد

  24. مثال Open Addressing

  25. مثال Open Addressing

  26. مثال Open Addressing

  27. جستجو با Open Addressing عمل جستجو از همين روش تابع افزودن، براي پيدا کردن رکورد مورد نظر استفاده مي کند

  28. روشهاي Probing • Linear : h(k ,i ) = (h’(k) + i ) mod m • Primary Clustering Problem • افزايش زمان متوسط جستجوي رکوردها • m distinct probe seq. • Quadratic:h(k,i)= (hi(k) + c1 i + c2 i2) mod m • Secondary Clustering • m distinct probe seq. • Double Hashing:h(k, i) = (h1(k) + ih2(k)) mod m • Semi-Random Behavior • m2 distinct probe seq.

  29. آناليز Open Addressing • n = Number of records to be stored • m = size of hash table (hash array) • a = n/m = load factor • Expected number of probes = 1 / (1- a) • if a = 0.5  E(probes) = 2 • if a = 0.9  E(probes) = 10

  30. Perfect Hashing • همانند Randomized Quick sort‌تابع hash‌را ازبين مجموعه اي از توابع معين به صورت تصادفي انتخاب کنيد • افزايش کارايي متوسط الگوريتم • ورودي خاصي از رکوردها در اغلب موارد منجر به بدترين حالت نمي شود

  31. درهم سازي مجدد Re-Hashing Records Hash Double Sized New Hash Function اگر جدول درهم سازي ، پر شود؛ جدول بزرگتري ساخته مي شود. سپس با استفاده از تابع جديد درهم سازي ركوردهاي موجود در حافظه قبلي و همچنين ركوردهاي جديد به اين جدول منتقل مي شوند درهم سازي مجدد عمل هزينه بري است؛ ازهمان ابتدا حافظه بزرگتري استفاده كنيد سعي كنيد هميشه load factor ‌كمتر از 20 درصد باشد

  32. توابع Hash پيشرفته • شبكه هاي عصبي • تخمين توابع • نگاشت فضاهاي برداري • توليد تابع Hashing با روشهاي تكاملي • Genetic Programming

  33. تمرين • يک ADT ‌ براي نگهداري رکوردهايي تعريف کنيد که کليد رکوردها، رشته حرفي باشد؛ چه تابع Hashing ‌پيشنهاد مي کنيد ؟ • با استفاده از روش Open addressing ؛ الگوريتمهاي حذف، اضافه و جستجو کردن در جدول رکوردها را بنويسيد. • class StringHashTable{ • Record T[0..m-1] ; • void insertRecord(Record r) ; • void deleteRecord(Record r) ; • }

More Related