डायनामिक परफेक्ट हैशिंग: Difference between revisions
No edit summary |
No edit summary |
||
Line 42: | Line 42: | ||
=== पता लगाएँ === | === पता लगाएँ === | ||
'''function''' Locate(''x'') '''is''' | |||
'' | ''j'' := h('''x''') | ||
'''if''' (position h<sub>j</sub>(''x'') of subtable ''T<sub>j</sub>'' contains ''x'' (not deleted)) | |||
' | '''return''' (''x'' is in ''S'') | ||
'''end if''' | |||
'''else''' | |||
' | '''return''' (''x'' is not in ''S'') | ||
'''end else''' | |||
' | '''end''' | ||
=== सम्मिलित करें === | === सम्मिलित करें === | ||
Line 60: | Line 60: | ||
यदि x, j या उपसारणी T पर मौजूद है<sub>j</sub>, और हटाए गए के रूप में चिह्नित नहीं किया गया है, तो कहा जाता है कि टकराव होता है और जे<sup>वें</sup>बकेट की दूसरी-स्तरीय तालिका टी<sub>j</sub> अलग यादृच्छिक रूप से चयनित हैश फ़ंक्शन एच के साथ फिर से बनाया गया है<sub>j</sub>. | यदि x, j या उपसारणी T पर मौजूद है<sub>j</sub>, और हटाए गए के रूप में चिह्नित नहीं किया गया है, तो कहा जाता है कि टकराव होता है और जे<sup>वें</sup>बकेट की दूसरी-स्तरीय तालिका टी<sub>j</sub> अलग यादृच्छिक रूप से चयनित हैश फ़ंक्शन एच के साथ फिर से बनाया गया है<sub>j</sub>. | ||
' | '''function''' Insert(''x'') '''is''' | ||
''count'' = ''count'' + 1; | |||
'''if''' (''count'' > ''M'') | |||
FullRehash(''x''); | |||
'''end if''' | |||
' | '''else''' | ||
''j'' = h(''x''); | |||
' | '''if''' (Position h<sub>''j''</sub>(x) of subtable ''T<sub>j</sub>'' contains ''x'') | ||
' | '''if''' (''x'' is marked deleted) | ||
remove the delete marker; | |||
' | '''end if''' | ||
' | '''end if''' | ||
'''else''' | |||
''b<sub>j</sub>'' = ''b<sub>j</sub>'' + 1; | |||
' | '''if''' (''b<sub>j</sub>'' <= ''m<sub>j</sub>'') | ||
' | '''if''' position h<sub>''j''</sub>(''x'') of ''T<sub>j</sub>'' is empty | ||
x | store ''x'' in position h<sub>''j''</sub>(''x'') of ''T<sub>j</sub>''; | ||
' | '''end if''' | ||
' | '''else''' | ||
Put all unmarked elements of ''T<sub>j</sub>'' in list ''L<sub>j</sub>''; | |||
Append ''x'' to list ''L<sub>j</sub>''; | |||
''b<sub>j</sub>'' = length of ''L<sub>j</sub>''; | |||
' | '''repeat''' | ||
''h<sub>j</sub>'' = randomly chosen function in ''H<sub>sj</sub>''; | |||
' | '''until''' ''h<sub>j</sub>'' is injective on the elements of ''L<sub>j</sub>''; | ||
'''for''' all ''y'' on list ''L<sub>j</sub>'' | |||
store ''y'' in position h<sub>''j''</sub>(''y'') of ''T<sub>j</sub>''; | |||
'''end for''' | |||
' | '''end else''' | ||
'''end if else''' | |||
''m<sub>j</sub>'' = 2 * max{1, ''m<sub>j</sub>''}; | |||
''s<sub>j</sub>'' = 2 * ''m<sub>j</sub>'' * (''m<sub>j</sub>'' - 1); | |||
' | '''if''' the sum total of all s<sub>j</sub> ≤ 32 * ''M''<sup>2</sup> / ''s''(''M'') + 4 * ''M'' | ||
Allocate ''s<sub>j</sub>'' cells for ''T<sub>j</sub>''; | |||
Put all unmarked elements of ''T<sub>j</sub>'' in list ''L<sub>j</sub>''; | |||
Append ''x'' to list ''L<sub>j</sub>''; | |||
''b<sub>j</sub>'' = length of ''L<sub>j</sub>''; | |||
' | '''repeat''' | ||
''h<sub>j</sub>'' = randomly chosen function in ''H<sub>sj</sub>''; | |||
' | '''until''' ''h<sub>j</sub>'' is injective on the elements of ''L<sub>j</sub>''; | ||
'''for''' all ''y'' on list ''L<sub>j</sub>'' | |||
store ''y'' in position h<sub>''j''</sub>(''y'') of ''T<sub>j</sub>''; | |||
' | '''end for''' | ||
'''end if''' | |||
'''else''' | |||
FullRehash(x); | FullRehash(x); | ||
' | '''end else''' | ||
'''end else''' | |||
' | '''end else''' | ||
'''end else''' | |||
' | '''end''' | ||
=== हटाएं === | === हटाएं === | ||
Line 115: | Line 117: | ||
x का विलोपन केवल x को हटाए बिना और वेतन वृद्धि की गिनती के रूप में चिह्नित करता है। सम्मिलन और विलोपन दोनों के मामले में, यदि गिनती सीमा एम तक पहुंचती है तो पूरी तालिका फिर से बनाई जाती है, जहां एम नए चरण की शुरुआत में एस के आकार का कुछ स्थिर गुणक है। यहां चरण का तात्पर्य पूर्ण पुनर्निर्माण के बीच के समय से है। ध्यान दें कि यहां Delete(x) में -1 ऐसे तत्व का प्रतिनिधित्व है जो सभी संभावित तत्वों U के सेट में नहीं है। | x का विलोपन केवल x को हटाए बिना और वेतन वृद्धि की गिनती के रूप में चिह्नित करता है। सम्मिलन और विलोपन दोनों के मामले में, यदि गिनती सीमा एम तक पहुंचती है तो पूरी तालिका फिर से बनाई जाती है, जहां एम नए चरण की शुरुआत में एस के आकार का कुछ स्थिर गुणक है। यहां चरण का तात्पर्य पूर्ण पुनर्निर्माण के बीच के समय से है। ध्यान दें कि यहां Delete(x) में -1 ऐसे तत्व का प्रतिनिधित्व है जो सभी संभावित तत्वों U के सेट में नहीं है। | ||
' | '''function''' Delete(''x'') '''is''' | ||
''count'' = ''count'' + 1; | |||
' | |||
x | ''j'' = h(''x''); | ||
' | '''if''' position h<sub>j</sub>(''x'') of subtable ''Tj'' contains ''x'' | ||
' | mark ''x'' as deleted; | ||
' | '''end if''' | ||
' | '''else''' | ||
' | '''return''' (x is not a member of S); | ||
'''end else''' | |||
'''if''' (''count'' >= ''M'') | |||
' | FullRehash(-1); | ||
'''end if''' | |||
'''end''' | |||
=== पूर्ण पुनर्निर्माण === | === पूर्ण पुनर्निर्माण === | ||
Line 137: | Line 141: | ||
फ़ंक्शन FullRehash(''x'') है | फ़ंक्शन FullRehash(''x'') है | ||
''T'' | '''function''' FullRehash(''x'') '''is''' | ||
Put all unmarked elements of ''T'' in list ''L''; | |||
'''if''' (''x'' is in ''U'') | |||
append ''x'' to ''L''; | |||
'''end if''' | |||
'' | ''count'' = length of list ''L''; | ||
''M'' = (1 + ''c'') * max{''count'', 4}; | |||
h = ''H | '''repeat''' | ||
h = randomly chosen function in ''H<sub>s(M)</sub>''; | |||
'''for''' all ''j'' < ''s''(''M'') | |||
form a list ''L<sub>j</sub>'' for h(''x'') = ''j''; | |||
''b<sub>j</sub>'' = length of ''L<sub>j</sub>''; | |||
''m<sub>j</sub>'' = 2 * ''b<sub>j</sub>''; | |||
''s<sub>j</sub>'' = 2 * ''m<sub>j</sub>'' * (''m<sub>j</sub>'' - 1); | |||
' | '''end for''' | ||
'''until''' the sum total of all s<sub>j</sub> ≤ 32 * ''M''<sup>2</sup> / ''s''(''M'') + 4 * ''M'' | |||
'''for''' all ''j'' < ''s''(''M'') | |||
Allocate space ''s<sub>j</sub>'' for subtable ''T<sub>j</sub>''; | |||
'''repeat''' | |||
''h<sub>j</sub>'' = randomly chosen function in ''H<sub>sj</sub>''; | |||
' | '''until''' ''h<sub>j</sub>'' is injective on the elements of list ''L<sub>j</sub>''; | ||
'''end for''' | |||
'''for''' all ''x'' on list ''L<sub>j</sub>'' | |||
' | store ''x'' in position h<sub>''j''</sub>(''x'') of ''T<sub>j</sub>''; | ||
'''end for''' | |||
'''end''' | |||
==यह भी देखें== | ==यह भी देखें== |
Revision as of 16:55, 18 July 2023
कंप्यूटर विज्ञान में, डायनेमिक परफेक्ट हैशिंग हैश तालिका डेटा संरचना में हैश टकराव को हल करने के लिए प्रोग्रामिंग तकनीक है।[1][2][3]जबकि इसके हैश टेबल समकक्षों की तुलना में अधिक मेमोरी-सघन है, यह तकनीक उन स्थितियों के लिए उपयोगी है जहां तत्वों के बड़े समूह पर तेज़ क्वेरी, सम्मिलन और विलोपन किया जाना चाहिए।
विवरण
स्थैतिक मामला
एफकेएस योजना
इष्टतम स्थैतिक हैशिंग की समस्या को सबसे पहले सामान्यतः फ्रेडमैन, कोमलोस और ज़ेमेरेडी द्वारा हल किया गया था।[4] उनके 1984 के पेपर में,[1]वे दो-स्तरीय हैश तालिका योजना का विवरण देते हैं जिसमें (प्रथम-स्तर) हैश तालिका की प्रत्येक बाल्टी अलग दूसरे-स्तरीय हैश तालिका से मेल खाती है। कुंजियाँ दो बार हैश की जाती हैं—पहला हैश मान प्रथम-स्तरीय हैश तालिका में निश्चित बकेट में मैप होता है; दूसरा हैश मान उस बकेट की दूसरी-स्तरीय हैश तालिका में उस प्रविष्टि की स्थिति बताता है। दूसरे स्तर की तालिका के निर्माण पर टकराव-मुक्त (यानी सही हैशिंग) होने की गारंटी है। नतीजतन, लुक-अप लागत बड़ा ओ अंकन|ओ(1) सबसे खराब स्थिति में जटिलता|सबसे खराब स्थिति में होने की गारंटी है।[2]
स्थैतिक मामले में, हमें कुल के साथ सेट दिया जाता है x प्रविष्टियाँ, प्रत्येक अद्वितीय कुंजी के साथ, समय से पहले। फ़्रेडमैन, कोमलोस और ज़ेमेरेडी आकार के साथ प्रथम-स्तरीय हैश तालिका चुनते हैं बाल्टियाँ।[2]
निर्मित करना, x प्रविष्टियों को अलग किया गया है s शीर्ष-स्तरीय हैशिंग फ़ंक्शन द्वारा बकेट, जहां . फिर प्रत्येक बाल्टी के लिए k प्रविष्टियों के साथ, दूसरे स्तर की तालिका आवंटित की जाती है स्लॉट्स, और इसके हैश फंकशन को सार्वभौमिक हैश फ़ंक्शन सेट से यादृच्छिक रूप से चुना जाता है ताकि यह टकराव-मुक्त हो (यानी उत्तम हैश फ़ंक्शन) और हैश तालिका के साथ संग्रहीत हो। यदि यादृच्छिक रूप से यूनिवर्सल हैश फ़ंक्शन टकराव के साथ तालिका बनाता है, तो टकराव-मुक्त तालिका की गारंटी होने तक नया हैश फ़ंक्शन यादृच्छिक रूप से चुना जाता है। अंत में, टकराव-मुक्त हैश के साथ, k प्रविष्टियाँ दूसरे स्तर की तालिका में हैश की गई हैं।
का द्विघात आकार स्पेस यह सुनिश्चित करता है कि टकराव के साथ बेतरतीब ढंग से तालिका बनाना दुर्लभ और आकार से स्वतंत्र है k, रैखिक परिशोधन निर्माण समय प्रदान करना। हालाँकि प्रत्येक दूसरे स्तर की तालिका में द्विघात स्थान की आवश्यकता होती है, यदि प्रथम स्तर की हैश तालिका में डाली गई कुंजियाँ समान वितरण (अलग) हैं, तो समग्र रूप से संरचना अपेक्षित स्थान लेती है स्थान, चूंकि बाल्टी का आकार छोटा है और इसकी संभावना अधिक है।[1]
प्रथम-स्तरीय हैश फ़ंक्शन को विशेष रूप से चुना जाता है, ताकि विशिष्ट सेट के लिए x अद्वितीय कुंजी मान, कुल स्थान T सभी द्वितीय-स्तरीय हैश तालिकाओं द्वारा उपयोग अपेक्षित है स्थान, और अधिक विशेष रूप से .फ्रेडमैन, कोमलोस और ज़ेमेरेडी ने दिखाया कि हैश फ़ंक्शंस के सार्वभौमिक हैशिंग परिवार को देखते हुए, उनमें से कम से कम आधे फ़ंक्शंस में वह संपत्ति होती है।[2]
गतिशील मामला
डिट्ज़फेलबिंगर एट अल। गतिशील शब्दकोश एल्गोरिथ्म प्रस्तुत करें, जब n आइटमों का सेट शब्दकोष में क्रमिक रूप से जोड़ा जाता है, तो सदस्यता क्वेरी हमेशा निरंतर समय में चलती हैं और इसलिए सबसे खराब स्थिति में, आवश्यक कुल भंडारण है (रैखिक), और अपेक्षित परिशोधन सम्मिलन और विलोपन समय (परिशोधन स्थिर समय)।
गतिशील मामले में, जब कुंजी को हैश तालिका में डाला जाता है, यदि उसके संबंधित उप-तालिका में उसकी प्रविष्टि पर कब्जा कर लिया जाता है, तो टकराव होता है और उप-तालिका को उसकी नई कुल प्रविष्टि गणना और यादृच्छिक रूप से चयनित हैश फ़ंक्शन के आधार पर फिर से बनाया जाता है। क्योंकि द्वितीय स्तर की तालिका का लोड फैक्टर (हैश तालिका) कम रखा जाता है , पुनर्निर्माण दुर्लभ है, और परिशोधन विश्लेषण सम्मिलन की अपेक्षित लागत है .[2]इसी प्रकार, विलोपन की परिशोधित अपेक्षित लागत है .[2]
इसके अतिरिक्त, गतिशील मामले में शीर्ष-स्तरीय तालिका या किसी उप-सारणी का अंतिम आकार अज्ञात है। उम्मीद बनाए रखने का तरीका पर्याप्त संख्या में सम्मिलन और विलोपन होने पर तालिका का स्थान पूर्ण पुनर्निर्माण का संकेत देता है। डाइट्ज़फेलबिंगर एट अल के परिणामों के आधार पर,[2]जब तक सम्मिलन या विलोपन की कुल संख्या पिछले निर्माण के समय तत्वों की संख्या से अधिक हो जाती है, तब तक सम्मिलन और विलोपन की परिशोधित अपेक्षित लागत बनी रहती है पूरी पुनर्रचना को ध्यान में रखते हुए।
डाइट्ज़फेलबिंगर एट अल द्वारा डायनामिक परफेक्ट हैशिंग का कार्यान्वयन। इन अवधारणाओं का उपयोग करता है, साथ ही आलसी विलोपन भी करता है, और नीचे छद्म कोड में दिखाया गया है।
स्यूडोकोड कार्यान्वयन
पता लगाएँ
function Locate(x) is j := h(x) if (position hj(x) of subtable Tj contains x (not deleted)) return (x is in S) end if else return (x is not in S) end else end
सम्मिलित करें
j पर नई प्रविष्टि x को सम्मिलित करने के दौरान, वैश्विक संचालन काउंटर, गिनती, बढ़ जाती है।
यदि x, j पर मौजूद है, लेकिन हटाए गए के रूप में चिह्नित है, तो निशान हटा दिया जाता है।
यदि x, j या उपसारणी T पर मौजूद हैj, और हटाए गए के रूप में चिह्नित नहीं किया गया है, तो कहा जाता है कि टकराव होता है और जेवेंबकेट की दूसरी-स्तरीय तालिका टीj अलग यादृच्छिक रूप से चयनित हैश फ़ंक्शन एच के साथ फिर से बनाया गया हैj.
function Insert(x) is count = count + 1; if (count > M) FullRehash(x); end if else j = h(x); if (Position hj(x) of subtable Tj contains x) if (x is marked deleted) remove the delete marker; end if end if else bj = bj + 1; if (bj <= mj) if position hj(x) of Tj is empty store x in position hj(x) of Tj; end if else Put all unmarked elements of Tj in list Lj; Append x to list Lj; bj = length of Lj; repeat hj = randomly chosen function in Hsj; until hj is injective on the elements of Lj; for all y on list Lj store y in position hj(y) of Tj; end for end else end if else mj = 2 * max{1, mj}; sj = 2 * mj * (mj - 1); if the sum total of all sj ≤ 32 * M2 / s(M) + 4 * M Allocate sj cells for Tj; Put all unmarked elements of Tj in list Lj; Append x to list Lj; bj = length of Lj; repeat hj = randomly chosen function in Hsj; until hj is injective on the elements of Lj; for all y on list Lj store y in position hj(y) of Tj; end for end if
else FullRehash(x); end else end else end else end else end
हटाएं
x का विलोपन केवल x को हटाए बिना और वेतन वृद्धि की गिनती के रूप में चिह्नित करता है। सम्मिलन और विलोपन दोनों के मामले में, यदि गिनती सीमा एम तक पहुंचती है तो पूरी तालिका फिर से बनाई जाती है, जहां एम नए चरण की शुरुआत में एस के आकार का कुछ स्थिर गुणक है। यहां चरण का तात्पर्य पूर्ण पुनर्निर्माण के बीच के समय से है। ध्यान दें कि यहां Delete(x) में -1 ऐसे तत्व का प्रतिनिधित्व है जो सभी संभावित तत्वों U के सेट में नहीं है।
function Delete(x) is count = count + 1;
j = h(x); if position hj(x) of subtable Tj contains x mark x as deleted; end if else return (x is not a member of S); end else if (count >= M) FullRehash(-1); end if end
पूर्ण पुनर्निर्माण
S की तालिका का पूर्ण पुनर्निर्माण सबसे पहले हटाए गए के रूप में चिह्नित सभी तत्वों को हटाकर शुरू होता है और फिर अगले थ्रेशोल्ड मान M को S के आकार के कुछ स्थिर गुणक पर सेट करता है। हैश फ़ंक्शन, जो S को s(M) उपसमुच्चय में विभाजित करता है, जहां उपसमुच्चय j का आकार s हैj, बार-बार यादृच्छिक रूप से तब तक चुना जाता है जब तक:
अंत में, प्रत्येक उपसारणी टी के लिएj हैश फ़ंक्शन एचjH से बार-बार यादृच्छिक रूप से चुना जाता हैsjजब तक एचjटी के तत्वों पर विशेषण हैj. आकार n के साथ S की तालिका के पूर्ण पुनर्निर्माण के लिए अपेक्षित समय O(n) है।[2]
फ़ंक्शन FullRehash(x) है
function FullRehash(x) is Put all unmarked elements of T in list L; if (x is in U) append x to L; end if count = length of list L; M = (1 + c) * max{count, 4}; repeat h = randomly chosen function in Hs(M); for all j < s(M) form a list Lj for h(x) = j; bj = length of Lj; mj = 2 * bj; sj = 2 * mj * (mj - 1); end for until the sum total of all sj ≤ 32 * M2 / s(M) + 4 * M for all j < s(M) Allocate space sj for subtable Tj; repeat hj = randomly chosen function in Hsj; until hj is injective on the elements of list Lj; end for for all x on list Lj store x in position hj(x) of Tj;
end for
end
यह भी देखें
- उत्तम हैशिंग
संदर्भ
- ↑ 1.0 1.1 1.2 Fredman, M. L., Komlós, J., and Szemerédi, E. 1984. Storing a Sparse Table with 0(1) Worst Case Access Time. J. ACM 31, 3 (Jun. 1984), 538-544 http://portal.acm.org/citation.cfm?id=1884#
- ↑ 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Dietzfelbinger, M., Karlin, A., Mehlhorn, K., Meyer auf der Heide, F., Rohnert, H., and Tarjan, R. E. 1994. "Dynamic Perfect Hashing: Upper and Lower Bounds" Archived 2016-03-04 at the Wayback Machine. SIAM J. Comput. 23, 4 (Aug. 1994), 738-761. http://portal.acm.org/citation.cfm?id=182370 doi:10.1137/S0097539791194094
- ↑ Erik Demaine, Jeff Lind. 6.897: Advanced Data Structures. MIT Computer Science and Artificial Intelligence Laboratory. Spring 2003.
- ↑ Yap, Chee. "एफकेएस योजना के लिए सार्वभौमिक निर्माण". New York University. New York University. Retrieved 15 February 2015.[permanent dead link]