Download presentation
Presentation is loading. Please wait.
Published byHadi Sumadi Modified over 6 years ago
1
لغت نامه و جدول درهم سازي Dictionaries and Hash Tables
ساختمان داده ها و الگوريتم
3
لغت نامه - Dictionary مجموعه اي از زوج هاي مرتب به صورت:
(key, element) کليد زوج هاي مرتب متفاوت است عمليات روي لغت نامه: get(theKey) put(theKey, theElement) remove(theKey) A linear list is an ordered sequence of elements. A dictionary is just a collection of pairs. Interface Dictionary has these 3 methods. Note that Java has an abstract class Dictionary that has these three methods plus isEmpty and some others.
4
کاربرد 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)
5
کليدهاي تکراري در لغت نامه
لغت نامه ممکن است کليد تکراري داشته باشد همانند کلمات تکراري يک لغت نامه روان : روح، جان روان: رونده ، جاري روان: اسم خاص (اسم شهر) روان: اسم خاص (اسم شخص) مي توان ركوردهاي هم كليد را با يك ليست نشان داد
6
نمايش لغت نامه با يک ليست خطي
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. مي توان از آرايه يا ليست پيوندي استفاده کرد Even though a dictionary is not an ordered sequence, it may be represented as a linear list.
7
put(theKey, theElement)
نمايش با آرايه a b c d e get(theKey) O(size) time put(theKey, theElement) O(size) براي تشخيص دادن کليد تکراري و , O(1) براي افزودن کليد به سمت راست آرايه. remove(theKey) O(size) time.
8
آرايه مرتب اعضا بر اساس کليد به صورت صعودي مرتب شده اند get(theKey)
A B C D E اعضا بر اساس کليد به صورت صعودي مرتب شده اند get(theKey) O(log size) time put(theKey, theElement) O(log size) براي يافتن کليد تکراري, O(size) براي افزودن کليد در محل مناسب remove(theKey) O(size) time. O(log (size)) for get() results from the use of a binary search.
9
put(theKey, theElement)
زنجيره نامرتب a b c d e null firstNode get(theKey) O(size) time put(theKey, theElement) O(size) براي تشخيص دادن کليد تکراري و , O(1) براي افزودن کليد به سمت راست آرايه. remove(theKey) O(size) time.
10
اعضا بر اساس کليد به صورت صعودي مرتب شده اند.
زنجيره مرتب A B C D E null firstNode اعضا بر اساس کليد به صورت صعودي مرتب شده اند. get(theKey) O(size) time put(theKey, theElement) O(size) براي تشخيص دادن کليد تکراري و , O(1) براي افزودن کليد به سمت راست آرايه. Binary search cannot be done in O(log size) time on a chain, because it takes O(size) time to locate the middle node. Worst-case performance of a sorted chain is no better than that of an unsorted chain.
11
اعضا بر اساس کليد به صورت صعودي مرتب شده اند
زنجيره مرتب A B C D E null firstNode اعضا بر اساس کليد به صورت صعودي مرتب شده اند remove(theKey) O(size) time. چگونه مي توان در ليست هاي پيوندي هم جستجوي لگاريتمي انجام داد ؟
12
لغت نامه ساختاري براي نگهداري رکوردهاي اطلاعاتي است
بحث و بررسي لغت نامه ساختاري براي نگهداري رکوردهاي اطلاعاتي است در اغلب برنامه ها مانند كامپايلرها و پردازش متن كاربرد زيادي دارد بنابراين هزينه عمليات اين ساختار داده بايد تا حد ممكن كم شود زمان اجراي عمليات حذف ، اضافه كردن و جستجوي لغت نامه از خطي يا لگاريتمي است پياده سازي هاي مختلف برخي عمليات را با هزينه كمتري نسبت به ديگر پياده سازي ها انجام مي دهند هزينه افزودن به آرايه نامرتب O(1) است اما همين هزينه براي ليست مرتب O(Size) است ؟ ايده ال ما اين است كه هزينه عمليات مختلف حذف روي لغت نامه ها را به O(1) كاهش دهيم .
13
Symbol Table برنامه نويسان مي توانند طبق قواعد زبان، متغيرها را به دلخواه نامگذاري کنند کامپايلر براي اختصاص حافظه و مديريت متغيرها، آنها را در جدولي به نام Symbol Table نگهداري مي کند اين جدول نمونه اي از ساختار داده Dictionary است. دسترسي به اين جدول از مرتبه Θ(N) است. براي دسترسي Θ(1) لازم است آرايه هاي خيلي بزرگ تعريف کنيم اعداد صحيح: 65536 رشته ها: بيشتر از اين مقدار
14
كامپايلر از اين جدول براي نگهداري و مديريت
Symbol Table كامپايلر از اين جدول براي نگهداري و مديريت متغيرها و علايم تعريف شده در برنامه ها استفاده مي كند هر Symbol Table شامل مجموعه اي از ركوردها مثل x است Symbol Table ADT Class SymbolTable{ Records[1..N] //Operations: Insert(X:Record) Delete(X:Record) Search(K:key) } Key[X] Record X data fields
15
Hashing Hashing روشي براي دسترسي به اعضاي آرايه هايي مثل Symbol Table است که از مرتبه Θ(1) است Variable Name (String) Index Generator (Hash Function) K (Integer) 6 200 5 500 4 54 3 130 2 85 1 250 100 Offset Index تابع Hashing تابعي معين (Deterministic) است!
16
فرض كنيد كليد ركوردها اعدادي در بازه 0..m-1 باشند
دسترسي مستقيم فرض كنيد كليد ركوردها اعدادي در بازه 0..m-1 باشند آرايه اي m عضويT[0..m-1] را مي توان ساخت: T[k] = x if key(x)=k T[k] = nil otherwise Complexity: Θ(1) مساله: اگر دامنه كليدها بزرگ باشد ...؟ مثلا اعداد صحيح !
17
راه حل تعريف تابع Hash كه مجموعه كليدها را به مجموعه انديسها ترجمه مي كند: مساله جديد: اگر دو كليد به يك مكان ترجمه شوند؛ برخورد اتفاق مي افتدCollision
18
حل برخورد با ليست پيوندي
بدترين حالت همه كليدها به يك محل نگاشت شوند: دسترسي: Θ(n)
19
اگر n كليد داشته باشيم و آرايه m عضوي باشد و تابع نگاشت يكنواخت باشد:
جستجوي يك ركورد اگر n كليد داشته باشيم و آرايه m عضوي باشد و تابع نگاشت يكنواخت باشد: a = n /m = load factor كليد به ازاي هر خانه آرايه Θ(1 + a ) : هزينه جستجوي ناموفق! Θ(1) : يافتن محل كليد Θ(a) : يافتن ركورد در ليست if a = O(1) Θ(1) = هزينه جستجوي ناموفق هزينه جستجوي موفق هم در نهايت، همين اندازه است: Θ(1+a)
20
انتخاب تابع Hash نگاشت يكنواخت كليدها به خانه هاي آرايه عدم حساسيت به تركيب خاص ركوردهاي ورودي quicksort را به خاطر بياوريد! روش تقسيم:h(k) = k mod m نگاشت كليدهاي k به 0..m-1 نگاشت يكنواخت 1..k اگر m=2r باشد، تابع Hash ، به r بيت كم ارزش بستگي دارد!
21
m را طوري انتخاب كنيد كه عددي اول باشد
انتخاب تابع Hash m را طوري انتخاب كنيد كه عددي اول باشد m را عددي نزديك تواني از 2 يا 10 انتخاب نكنيد! گرچه الگوريتمهاي تقسيم و حل با آرايه هايي كه طول آنها عدد اول باشد خوب كار نمي كنند؛ در اينجا چنين انتخابي لازم است روش ضرب h(k) = ⌊ m (kA - ⌊kA⌋) ⌋ . , 0 < A < 1 پياده سازي سريع روش ضرب با استفاده از عملگرهاي شيفت، اين تابع پياده سازي سريعي دارد
22
پياده سازي روش ضرب عملگرهاي شيفت بيت
>> 1 = shr(x,n) == x /2n << 1 = shl(x,n) == x * 2n
23
پياده سازي روش ضرب اگر اعداد صحيح مورد استفاده در کامپيوتر 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 f * m = f * 2p = f << p select p bits
24
حل برخورد با آدرس دهي باز
آدرس دهي باز: به جاي استفاده از ليست پيوندي، از خود آرايه براي نگهداري رکوردهاي برخوردي استفاده مي شود براي افزودن رکوردي جديد؛ ابتدا محلي خالي در آرايه پيدا مي شود و رکورد جديد در اين محل جاي مي گيرد تابع افزودن رکورد جديد ، علاوه بر کليد يک پارامتر ديگر به نام 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} بسته باشد
25
مثال Open Addressing
26
مثال Open Addressing
27
مثال Open Addressing
28
جستجو با Open Addressing
عمل جستجو از همين روش تابع افزودن، براي پيدا کردن رکورد مورد نظر استفاده مي کند
29
Linear : h(k ,i ) = (h’(k) + i ) mod m
روشهاي 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 Double Hashing:h(k, i) = (h1(k) + ih2(k)) mod m Semi-Random Behavior m2 distinct probe seq.
30
آناليز 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
31
Perfect Hashing همانند Randomized Quick sortتابع hashرا ازبين مجموعه اي از توابع معين به صورت تصادفي انتخاب کنيد افزايش کارايي متوسط الگوريتم ورودي خاصي از رکوردها در اغلب موارد منجر به بدترين حالت نمي شود
32
درهم سازي مجدد Re-Hashing
Records Hash Double Sized New Hash Function اگر جدول درهم سازي ، پر شود؛ جدول بزرگتري ساخته مي شود. سپس با استفاده از تابع جديد درهم سازي ركوردهاي موجود در حافظه قبلي و همچنين ركوردهاي جديد به اين جدول منتقل مي شوند درهم سازي مجدد عمل هزينه بري است؛ ازهمان ابتدا حافظه بزرگتري استفاده كنيد سعي كنيد هميشه load factor كمتر از 20 درصد باشد
33
توليد تابع Hashing با روشهاي تكاملي
شبكه هاي عصبي تخمين توابع نگاشت فضاهاي برداري توليد تابع Hashing با روشهاي تكاملي Genetic Programming
34
class StringHashTable{
تمرين يک ADT براي نگهداري رکوردهايي تعريف کنيد که کليد رکوردها، رشته حرفي باشد؛ چه تابع Hashing پيشنهاد مي کنيد ؟ با استفاده از روش Open addressing ؛ الگوريتمهاي حذف، اضافه و جستجو کردن در جدول رکوردها را بنويسيد. class StringHashTable{ Record T[0..m-1] ; void insertRecord(Record r) ; void deleteRecord(Record r) ; }
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.