2009-12-07 9 views
5

एसओ पर एक और सवाल ने कुछ भाषाओं में सुविधाओं को एक टेबल में तेजी से देखने के लिए हैश तारों में लाया। इसके दो उदाहरण हैं <> .NET में और {} पायथन में स्टोरेज संरचना। अन्य भाषाएं निश्चित रूप से इस तरह के तंत्र का समर्थन करती हैं। सी ++ का नक्शा है, एलआईएसपी के बराबर है, जैसा कि अधिकांश आधुनिक भाषाएं हैं।तारों के लिए लगातार समय हैश?

यह सवाल के जवाब में तर्क दिया गया था कि तारों पर हैश एल्गोरिदम एक एसओ सदस्य के साथ निरंतर समय सारिणी में आयोजित किया जा सकता है, जिसका प्रोग्रामिंग में 25 साल का अनुभव है और दावा किया जाता है कि कुछ भी निरंतर समय में धोया जा सकता है। मेरी व्यक्तिगत विवाद यह है कि यह सत्य नहीं है, जब तक कि आपका विशेष अनुप्रयोग स्ट्रिंग लंबाई पर सीमा न रखता हो। इसका मतलब है कि कुछ स्थिर के एक स्ट्रिंग की अधिकतम लंबाई निर्धारित करेगा।

मैं राबिन-कार्प एल्गोरिदम से परिचित हूं जो अपने ऑपरेशन के लिए हैशिंग फ़ंक्शन का उपयोग करता है, लेकिन यह एल्गोरिदम उपयोग करने के लिए एक विशिष्ट हैश फ़ंक्शन को निर्देशित नहीं करता है, और लेखक द्वारा सुझाए गए लेख ओ (एम) हैं, जहां एम है हैश स्ट्रिंग की लंबाई।

मुझे कुछ अन्य पेज जैसे इस (http://www.cse.yorku.ca/~oz/hash.html) दिखाई देते हैं जो कुछ हैश एल्गोरिदम प्रदर्शित करते हैं, लेकिन ऐसा लगता है कि उनमें से प्रत्येक स्ट्रिंग की पूरी लंबाई पर इसके मूल्य पर पहुंचने के लिए पुनरावृत्त करता है।

विषय पर तुलनात्मक रूप से सीमित पढ़ने से, ऐसा लगता है कि स्ट्रिंग प्रकारों के लिए अधिकांश सहयोगी सरणी वास्तव में एक हैशिंग फ़ंक्शन का उपयोग करके बनाई जाती हैं जो हुड के नीचे किसी प्रकार के पेड़ के साथ संचालित होती है। यह एक एवीएल पेड़ या लाल/काला पेड़ हो सकता है जो कुंजी/मूल्य जोड़ी में मान तत्व के स्थान को इंगित करता है।

यहां तक ​​कि इस पेड़ की संरचना के साथ, अगर हम थेटा (लॉग (एन)) के क्रम में रहना चाहते हैं, तो पेड़ में तत्वों की संख्या होने के साथ, हमें निरंतर समय हैश एल्गोरिदम होना चाहिए। अन्यथा, हमारे पास स्ट्रिंग पर पुनरावृत्ति का additive जुर्माना है। भले ही थेटा (एम) कई तारों वाले इंडेक्स के लिए थेटा (लॉग (एन)) द्वारा ग्रहण किया जाएगा, फिर भी हम इसे अनदेखा नहीं कर सकते हैं अगर हम ऐसे डोमेन में हैं कि जिन ग्रंथों के खिलाफ हम खोज करते हैं वे बहुत बड़े होंगे।

मुझे पता है कि प्रत्यय पेड़/सरणी और अहो-कोरासिक खोज में थैटा (एम) को स्मृति में अधिक खर्च के लिए ला सकता है, लेकिन मैं विशेष रूप से पूछ रहा हूं कि स्थिर समय हैश विधि स्ट्रिंग के लिए मौजूद है अन्य एसओ सदस्य द्वारा दावा किया गया मनमाने ढंग से लंबाई।

धन्यवाद।

उत्तर

4

सामान्यतः, मेरा मानना ​​है कि किसी भी पूर्ण स्ट्रिंग हैश को स्ट्रिंग के प्रत्येक चरित्र का उपयोग करना चाहिए और इसलिए एन अक्षरों के लिए ओ (एन) के रूप में विकसित होने की आवश्यकता होगी। हालांकि मुझे लगता है कि व्यावहारिक स्ट्रिंग हैश के लिए आप अनुमानित हैश का उपयोग कर सकते हैं जो आसानी से ओ (1) हो सकता है।

एक स्ट्रिंग हैश पर विचार करें जो मानक हैश की गणना करने के लिए हमेशा न्यूनतम (एन, 20) वर्णों का उपयोग करता है। जाहिर है यह स्ट्रिंग आकार के साथ ओ (1) के रूप में बढ़ता है। क्या यह भरोसेमंद काम करेगा? यह आपके डोमेन पर निर्भर करता है ...

7

एक हैश फ़ंक्शन को प्रत्येक स्ट्रिंग के लिए एक अद्वितीय मान वापस नहीं करना है (और नहीं कर सकता)।

आप यादृच्छिक संख्या जनरेटर आरंभ करने के लिए पहले 10 वर्णों का उपयोग कर सकते हैं और उसके बाद स्ट्रिंग से 100 यादृच्छिक वर्ण खींचने के लिए इसका उपयोग कर सकते हैं, और हैश। यह निरंतर समय होगा।

आप भी निरंतर मूल्य वापस कर सकते हैं 1. कड़ाई से बोलते हुए, यह अभी भी एक हैश फ़ंक्शन है, हालांकि बहुत उपयोगी नहीं है।

+3

है मुझे http://xkcd.com/221/ उस के साथ समस्या यह है कि –

+1

बहुत समान तार एक होता है की याद दिलाता है समान हैश होने की उच्च संभावना। आम तौर पर, एक बिट परिवर्तन में हैश में सभी बिट्स को बदलना चाहिए, ताकि दो तारों की टकराव की संभावना उनकी समानता से स्वतंत्र हो। - उसने कहा, अगर आपको करीबी तारों को टकराव करने की चिंता करने की आवश्यकता नहीं है तो आपका विचार काम करेगा। –

1

आप कर सकते हैं रैखिक हैशिंग समय की तुलना में asymptotically कम के लिए आशा अगर आप तार के बजाय ropes का उपयोग और साझा है कि आप कुछ संगणना को छोड़ने के लिए अनुमति देता है। लेकिन जाहिर है कि हैश फ़ंक्शन इनपुट को अलग नहीं कर सकता है, जिसे उसने नहीं पढ़ा है, इसलिए मैं "सब कुछ निरंतर समय में धोया जा सकता" बहुत गंभीरता से नहीं लेगा।

हैश फ़ंक्शन की गुणवत्ता और गणना की मात्रा के बीच समझौता में कुछ भी संभव है, और लंबे तारों पर एक हैश फ़ंक्शन को टकराव होना चाहिए।

आप यह निर्धारित करना है कि आपके एल्गोरिदम में होने वाली तारों को अक्सर तभी टक्कर मिल जाएगी यदि हैश फ़ंक्शन केवल उपसर्ग को देखता है।

1

हालांकि मैं असीमित लंबाई तारों के लिए एक निश्चित समय हैश फ़ंक्शन की कल्पना नहीं कर सकता, वास्तव में इसके लिए कोई आवश्यकता नहीं है।

हैश फ़ंक्शन का उपयोग करने का विचार हैश मानों का वितरण उत्पन्न करना है जो बनाता है कि डोमेन के विचाराधीन कई स्ट्रिंग को टक्कर देगी। यह कुंजी डेटा स्टोर में सीधे पहुंच की अनुमति देगी। निरंतर समय लुकअप में इन दो संयुक्त परिणाम - औसत पर।

यदि कभी ऐसी टक्कर होती है, तो लुकअप एल्गोरिदम अधिक लचीली लुकअप उप-रणनीति पर वापस आ जाता है।

+0

मैं सहमत हूं, लेकिन एक सहयोगी सरणी की तरह एक भाषा निर्माण के मामले में, क्या आप संभवतः असीमितता की गारंटी के करीब नहीं रहना चाहेंगे? –

3

हैश टकराव के गंभीर मामलों के जोखिम के बिना आप आसानी से स्ट्रिंग के लिए सामान्य निरंतर समय हैशिंग एल्गोरिदम प्राप्त नहीं कर सकते हैं।

यह स्थिर समय होने के लिए, आप स्ट्रिंग में प्रत्येक वर्ण तक पहुंचने में सक्षम नहीं होंगे। एक साधारण उदाहरण के रूप में, मान लीजिए कि हम पहले 6 अक्षर लेते हैं। फिर किसी को आता है और यूआरएल की एक सरणी हैश करने की कोशिश करता है। फ़ंक्शन में प्रत्येक स्ट्रिंग के लिए "http: /" दिखाई देगा।

अन्य वर्ण चयन योजनाओं के लिए समान परिदृश्य हो सकते हैं। आप पिछले चरित्र के मूल्य के आधार पर वर्णों को छद्म रूप से चुन सकते हैं, लेकिन फिर भी आप शानदार रूप से असफल होने का जोखिम चलाते हैं यदि किसी कारण से तारों में "गलत" पैटर्न होता है और कई एक ही हैश मान के साथ समाप्त होते हैं।

1

निश्चित रूप से यह करने योग्य है, जब तक आप सुनिश्चित करते हैं कि आपके सभी तार 'इंटर्न' हैं, इससे पहले कि आप उन्हें कुछ हैशिंग की आवश्यकता हो। आंतरिक स्ट्रिंग तालिका में स्ट्रिंग डालने की प्रक्रिया है, जैसे कि समान मूल्य वाले सभी आंतरिक तार वास्तव में एक ही वस्तु हैं। फिर, आप केवल स्ट्रिंग को हैश करने की बजाए, आंतरिक स्ट्रिंग में निश्चित (निश्चित लंबाई) पॉइंटर को हश कर सकते हैं।

+0

एक अच्छा विचार है, लेकिन स्ट्रिंग तालिका में डालने की प्रक्रिया को ध्यान में रखना उचित है, तालिका में स्ट्रिंग्स की संख्या के अनुपात में आनुपातिक समय लगेगा, जब तक कि तालिका हैश-आधारित न हो, जिस स्थिति में समस्या वापस मूल हो जाती है राज्य। – Peter

+0

ठीक है, एक त्रिभुज का उपयोग करके, इसमें डालने का समय सबसे लंबा आम उपसर्ग के समान है, जो एक और विकल्प है। :) –

+0

@ निक जॉनसन आप मुझे गलत समझ रहे हैं, मुझे लगता है। मैं तारों की विशिष्ट पहचान करने के लिए निरंतर समय की तलाश में हूं। इसका मतलब यह है कि यदि मैं आपको 2 नए तारों के साथ प्रस्तुत करता हूं, तो आप उन्हें लगातार समय में "हैश" कर सकते हैं ताकि यदि एक स्ट्रिंग 500 वर्ण हो और अगला वाला 5 वर्ण हो, तो वे विशिष्टता निर्धारित करने के लिए समान सैद्धांतिक समय लेते हैं। –

1

आपको पिछले वर्ष के साथ आने वाले गणितीय परिणाम में रुचि हो सकती है।

किसी भी लंबाई के सभी तारों के सेट के रूप में {1,2, ..., बी} में संख्याओं के सेट के लिए असीमित संख्या की चाबियों की समस्या पर विचार करें। पहली बार एच फंक्शंस के परिवार में यादृच्छिक एक हैश फ़ंक्शन एच पर चुनकर यादृच्छिक हैशिंग।

मैं दिखाऊंगा कि हमेशा एक असीमित कुंजी होती है जो सभी एच कार्यों पर टकराव करने के लिए निश्चित होती है, यानी, उनके पास हमेशा हैश कार्यों के लिए एक ही हैश मान होता है।

किसी भी हैश फ़ंक्शन को चुनें एच: कम से कम एक हैश मान वाई है जैसे सेट ए = {एस: एच (एस) = वाई} अनंत है, यानी, आपके पास अनगिनत कई तार टकराव हैं। सेट ए में किसी भी अन्य हैश फ़ंक्शन एच 'और हैश को चुनें। कम से कम एक हैश वैल्यू वाई है जैसे कि सेट ए' = {एस ए में है: एच '(एस) = वाई'} अनंत है, यही है, दो हैश कार्यों पर टकराव असीमित कई तार हैं।आप इस तर्क को कई बार दोहरा सकते हैं। एच बार दोहराएं। फिर आपके पास तारों का एक अनंत सेट होता है जहां सभी तार आपके सभी एच हैश कार्यों पर टकराते हैं। CQFD।

इसके अलावा पढ़ने: चर लंबाई तार के समझदार हैशिंग असंभव http://lemire.me/blog/archives/2009/10/02/sensible-hashing-of-variable-length-strings-is-impossible/

संबंधित मुद्दे