मैं एक हैश टेबल और एक ट्राय (उपसर्ग ट्री) के बीच कैसे चुन सकता हूं?


134

इसलिए अगर मुझे हैश टेबल या एक उपसर्ग के पेड़ के बीच चयन करना है तो भेदभावपूर्ण कारक क्या हैं जो मुझे दूसरे को चुनने के लिए प्रेरित करेंगे। मेरे स्वयं के अनुभवहीन दृष्टिकोण से ऐसा लगता है कि जैसे किसी ट्राइ का उपयोग कुछ अतिरिक्त ओवरहेड है क्योंकि यह एक सरणी के रूप में संग्रहीत नहीं है, लेकिन यह कि रन टाइम के संदर्भ में (सबसे लंबी कुंजी सबसे लंबे अंग्रेजी शब्द है) यह अनिवार्य रूप से ओ हो सकता है (१) (ऊपरी सीमा के संबंध में)। शायद सबसे लंबा अंग्रेजी शब्द 50 अक्षरों का है?

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

क्या कोई मुझे इस पर अधिक अनुभवी परिप्रेक्ष्य प्रदान कर सकता है? धन्यवाद!


1
यह ध्यान देने योग्य है कि एक रेडिक्स का पेड़ एक सादे तिकड़ी की तुलना में अधिक कुशल है क्योंकि आपको हर स्ट्रिंग बाइट के लिए एक नई शाखा की आवश्यकता नहीं है। इसके अलावा, रेडिक्स के पेड़ हैश टेबल की तुलना में "फजी" खोजों के लिए समर्थन प्रदान करते हैं क्योंकि आप पथ को काम करते समय व्यक्तिगत बिट्स पर देख रहे हैं। उदाहरण के लिए 00110010इनपुट बाइट हो सकता है, लेकिन आप उस मैच को शामिल करना चाहते हैं 00111010जो केवल एक बिट हटा दिया गया है।
21:39 पर Xeoncross

जवाबों:


116

कोशिशों के लाभ:

मूल बातें:

  • प्रीडिक्टेबल ओ (के) लुकअप टाइम जहां के की का आकार होता है
  • यदि यह नहीं है, तो लुकअप कश्मीर समय से कम समय ले सकता है
  • समर्थन करता है ट्रैवर्सल का आदेश दिया
  • हैश फ़ंक्शन के लिए कोई ज़रूरत नहीं है
  • विलोपन सीधा है

नए ऑपरेशन:

  • आप जल्दी से कुंजियों के उपसर्गों को देख सकते हैं, किसी दिए गए उपसर्ग आदि के साथ सभी प्रविष्टियों की गणना कर सकते हैं।

लिंक संरचना के लाभ:

  • यदि कई सामान्य उपसर्ग हैं, तो उनके लिए आवश्यक स्थान साझा किया जाता है।
  • अपरिहार्य प्रयास संरचना साझा कर सकते हैं। जगह में एक ट्राई को अपडेट करने के बजाय, आप एक नई शाखा का निर्माण कर सकते हैं जो केवल एक शाखा के साथ अलग है, कहीं और पुराने ट्राइ में इंगित करता है। यह समसामयिकता, तालिका के एक साथ कई संस्करणों आदि के लिए उपयोगी हो सकता है।
  • एक अपरिवर्तनीय तिकड़ी संकुचित होती है। यही है, यह हैश-कंसिंग द्वारा प्रत्ययों के साथ- साथ संरचना को भी साझा कर सकता है ।

हैशटैब के लाभ:

  • सभी को हैशटेबल्स पता है, है ना? आपके सिस्टम में पहले से ही एक अच्छी तरह से अनुकूलित कार्यान्वयन होगा, जो अधिकांश उद्देश्यों के लिए कोशिश करता है।
  • आपकी चाबियों की कोई विशेष संरचना नहीं है।
  • स्पष्ट लिंक्ड ट्राई संरचना की तुलना में अधिक स्थान-कुशल ( नीचे टिप्पणियां देखें )

26
सामान्य स्पष्ट हैश तालिका कार्यान्वयन में "स्पष्ट लिंक्ड ट्राई संरचना की तुलना में अधिक स्थान-कुशल" के साथ काफी सहमत नहीं हो सकते हैं, यह कुंजी रखने के लिए बहुत बड़े स्थान पर कब्जा कर लेता है, जबकि कोशिशों में, प्रत्येक नोड एक शब्द का प्रतिनिधित्व करता है। इस अर्थ में, प्रयास अधिक स्थान-कुशल हैं।
गैलेक्टिका

1
कैसे एक संरचना से दूसरे डेटा बनाम accesing के बारे में? मैं कैश और स्थान सोच रहा हूँ
होरी तोमा

8
@galactica, जो मेरे अनुभव से टकराती है: उदाहरण के लिए, अंतरिक्ष के लिए मापी गई सभी संरचनाओं के इस उत्तर में, एक तिकड़ी ने सबसे खराब प्रदर्शन किया। इसका मतलब यह है कि एक सूचक एक बाइट की तुलना में बहुत बड़ा है। हां, उपसर्गों के बंटवारे में मदद मिलती है, लेकिन इसे समता तक पहुंचने के लिए बहुत सारे उपरि को पार करना होगा। एक अधिक स्थान-कुशल प्रतिनिधित्व बहुत मदद कर सकता है, लेकिन फिर हम स्पष्ट रूप से जुड़े ढांचे के बारे में बात नहीं कर रहे हैं।
डेरियस बेकन

1
@ डैसरबाकन टेलीफोन नंबरिंग योजनाओं को संभालने के लिए उचित परिदृश्य की तरह लगता है। नमूना परिदृश्य: झुकाव मेल वाहक के लिए टेलीफोन नंबर। एक वाहक से दूसरे में पोर्ट किए गए नंबर। सामान्य शब्दकोशों के लिए यह भाषा पर निर्भर हो सकता है (मंदारिन बनाम अंग्रेजी), आपको एन-ग्राम और / या अन्य सांख्यिकीय डेटा की आवश्यकता होगी। एक तुकबंदी पुस्तक के लिए, एक प्रत्यय वृक्ष भी एक अच्छा विकल्प लगता है।
एमबीएक्स

देखने के लिए डेटा की विविधता बहुत मायने रखती है। यदि आपके डेटा मानों का एक बड़ा प्रतिशत अद्वितीय है, तो अतिरिक्त रिक्त बिंदुओं के उपयोग के कारण हैश पर आपकी अंतरिक्ष जटिलता बढ़ जाएगी।
उदाहरण

45

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


8
अगर हैश टेबल और ट्राई की लंबाई के लिए क्वेरी, O (k) पर समान जटिलता है, तो हमें हैश के लिए क्यों जाना चाहिए? क्या आप समझा सकते हैं?
सज्जाद हिसैन खान

29

सभी को हैश टेबल और इसके उपयोगों का पता है, लेकिन यह समय की निरंतर निरंतरता नहीं है, यह इस बात पर निर्भर करता है कि हैश फ़ंक्शन की कम्प्यूटेशनल जटिलता कितनी बड़ी है।

कुशल देखने के लिए विशाल हैश टेबल बनाना अधिकांश औद्योगिक परिदृश्यों में एक छोटा सा समाधान नहीं है जहां छोटे विलंबता / मापनीयता के मामले (जैसे: उच्च आवृत्ति व्यापार)। आपको कैश के मिस को कम करने के लिए डेटा संरचनाओं को अंतरिक्ष में अनुकूलित करने के बारे में ध्यान रखना होगा।

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


10

एक पेड़ का उपयोग करें:

  1. अगर आपको ऑटो पूरा फीचर चाहिए
  2. सभी शब्दों को 'a' या 'ax' से शुरू करें।
  3. एक प्रत्यय वृक्ष एक वृक्ष का एक विशेष रूप है। प्रत्यय के वृक्षों के फायदों की एक पूरी सूची है जो हैश कवर नहीं कर सकते हैं।

4

ऐसा कुछ है जो मैंने किसी को स्पष्ट रूप से उल्लेख नहीं किया है कि मुझे लगता है कि ध्यान में रखना महत्वपूर्ण है। दोनों प्रकार के हैश टेबल और विभिन्न प्रकार के प्रयासों में आम तौर पर O(k)ऑपरेशन होंगे, जहां kबिट्स में स्ट्रिंग की लंबाई होती है (या वर्णों में समतुल्य)।

यह आप एक अच्छा हैश समारोह है मान रहा है। यदि आप "खेत" और "खेत जानवरों" को हैश के समान मूल्य पर नहीं चाहते हैं, तो हैश फ़ंक्शन को कुंजी के सभी बिट्स का उपयोग करना होगा, और इसलिए हैशिंग "खेत जानवरों" को लगभग दो बार लेना चाहिए "खेत" (जब तक आप किसी प्रकार के रोलिंग हैश परिदृश्य में नहीं होते हैं, लेकिन कुछ इसी तरह के संचालन-बचत परिदृश्य भी कोशिशों के साथ होते हैं)। और एक वेनिला तिकड़ी के साथ, यह स्पष्ट है कि "खेत जानवरों" को डालने से लगभग "खेत" के रूप में दो बार लगेंगे। लंबे समय में यह संपीड़ित कोशिशों के साथ ही सच है।


3

एक त्रि पर सम्मिलन और लुकअप इनपुट स्ट्रिंग O (s) के लेन के साथ रैखिक है।

एक हैश आपको ans सम्मिलन देखने के लिए O (1) देगा, लेकिन पहले आपको इनपुट स्ट्रिंग के आधार पर हैश की गणना करनी होगी जो फिर से O (s) है।

निष्कर्ष, दोनों मामलों में असममित समय की जटिलता रैखिक है।

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

टाई को तोड़ने के लिए अपने आप से यह सवाल पूछें: क्या मुझे केवल पूर्ण शब्दों के लिए देखने की आवश्यकता है? या क्या मुझे उपसर्ग से मेल खाते सभी शब्दों को वापस करने की आवश्यकता है? (जैसा कि एक पूर्वानुमान पाठ इनपुट प्रणाली में है)। पहली बार, हैश के लिए जाएं। यह सरल और क्लीनर कोड है। परीक्षण करने और बनाए रखने में आसान। अधिक विस्तृत उपयोग के मामले के लिए जहां उपसर्ग या उपसर्ग मायने रखते हैं, एक ट्राइ के लिए जाते हैं।

और अगर आप इसे सिर्फ मज़े के लिए करते हैं, तो एक तिकड़ी को लागू करने से रविवार की दोपहर एक अच्छा उपयोग होगा।


"एक हैश आपको ans सम्मिलन देखने के लिए O (1) देगा, लेकिन पहले आपको इनपुट स्ट्रिंग के आधार पर हैश की गणना करनी होगी जो फिर से O (s) है।" यह समझाने के लिए धन्यवाद!
अबादावी

2

हैशटेबल कार्यान्वयन बुनियादी ट्राई कार्यान्वयन की तुलना में अंतरिक्ष कुशल है । लेकिन स्ट्रिंग्स के साथ, अधिकांश व्यावहारिक अनुप्रयोगों में ऑर्डर करना आवश्यक है। लेकिन हैशटेबल लेक्सोग्राफिक ऑर्डर को पूरी तरह से विचलित कर देता है। अब, यदि आपका एप्लिकेशन लेक्सोग्राफ़िक ऑर्डर (जैसे आंशिक खोज, दिए गए उपसर्ग के साथ सभी तार, सॉर्ट किए गए क्रम में सभी शब्द) के आधार पर ऑपरेशन कर रहा है, तो आपको Tries का उपयोग करना चाहिए। केवल लुकअप के लिए, हैशटेबल का उपयोग किया जाना चाहिए (यकीनन, यह न्यूनतम लुकअप समय देता है)।

पुनश्च: इनके अलावा, टेरनेरी सर्च ट्रीज़ (TSTs) एक उत्कृष्ट विकल्प होगा। इसका लुकअप समय हैशटेबल से अधिक है, लेकिन अन्य सभी कार्यों में समय-कुशल है। इसके अलावा, इसके अधिक स्थान कुशल की तुलना में कुशल है।


-2

कुछ (आमतौर पर एम्बेडेड, वास्तविक समय) अनुप्रयोगों के लिए आवश्यक है कि प्रसंस्करण समय डेटा से स्वतंत्र हो। उस स्थिति में, एक हैश तालिका एक ज्ञात निष्पादन समय की गारंटी दे सकती है, जबकि एक त्रिकोणीय डेटा के आधार पर भिन्न होता है।


6
अधिकांश हैश टेबल किसी ज्ञात निष्पादन समय की गारंटी नहीं देते हैं - सबसे खराब स्थिति हे (n), यदि हर तत्व टकरा जाता है और जंजीर हो जाता है
एडम रोसेनफील्ड

2
किसी भी डेटा सेट के लिए, आप एक सही हैश फ़ंक्शन की गणना कर सकते हैं जो उस डेटा के लिए O (1) लुकअप की गारंटी देगा। बेशक, सही हैश की गणना मुफ्त नहीं है।
जॉर्ज वी। रेली

5
इसके अलावा, टकराव टकराव को संभालने का एकमात्र तरीका नहीं है; इसको संभालने के लिए हर तरह के दिलचस्प, चतुर तरीके हैं- एक के लिए कोयल हैशिंग ( en.wikipedia.org/wiki/Cuckoo_hashing ) और सबसे अच्छा विकल्प क्लाइंट कोड की जरूरतों पर निर्भर करता है।
हांक गे

कोयल हैशिंग के बारे में नहीं पता था और खिल फ़िल्टर के साथ इसके संबंध, एक दिलचस्प पढ़ने के लिए करेंगे, धन्यवाद!
होरिया तोमा

रॉबिन हुड हैशिंग के बारे में मत भूलना, जो कैश और विचरण के लिए बेहतर है। sebastiansylvan.com/2013/05/08/… codecapusel.com/2013/11/11/robin-hood-hashing
Jarred Nicholls
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.