2011-09-07 12 views
6

में मेरे पास एक सी-भाषा ऐप है जहां मुझे टेबल लुकअप करने की आवश्यकता है।हैश टेबल लुकअप - सही हैश के साथ, सी

प्रविष्टियां तार हैं, सभी रनटाइम की शुरुआत में ज्ञात हैं। तालिका एक बार शुरू की जाती है, और फिर कई बार देखा जाता है। तालिका बदल सकती है, लेकिन यह मूल रूप से है जैसे ऐप शुरू होता है। मुझे लगता है कि इसका मतलब है कि मैं एक परिपूर्ण हैश का उपयोग कर सकता हूं? हैशटेबल प्रारंभिकरण के लिए कुछ समय का उपभोग करना ठीक है, क्योंकि यह केवल एक बार होता है।

3 और 100,000 प्रविष्टियों के बीच होगा, प्रत्येक एक अद्वितीय होगा, और मुझे लगता है कि 80% मामलों में 100 से कम प्रविष्टियां होंगी। उन मामलों में एक सरल बेवकूफ लुकअप "पर्याप्त तेज़" है। (== कोई भी शिकायत नहीं कर रहा है)

हालांकि ऐसे मामलों में जहां 10k + प्रविष्टियां हैं, एक बेवकूफ दृष्टिकोण की लुकअप गति अस्वीकार्य है। सी में तारों के लिए अच्छा हैशटेबल आधारित लुकअप प्रदर्शन देने के लिए एक अच्छा तरीका क्या है? मान लें कि मेरे पास बूस्ट/आदि जैसी तृतीय-पक्ष वाणिज्यिक लाइब्रेरी नहीं है। मुझे क्या हैश एल्गोरिदम का उपयोग करना चाहिए? मैं कैसे तय करूं?

+2

http://www.gnu.org/s/gperf/? –

+2

भी http://cmph.sourceforge.net/ – Nemo

उत्तर

4

एक परिपूर्ण हैश उत्पन्न करना एक साधारण समस्या नहीं है। कार्य को समर्पित पुस्तकालय हैं। इस मामले में सबसे लोकप्रिय एक शायद CMPH है। मैंने इसका इस्तेमाल नहीं किया है, हालांकि इससे परे मदद नहीं कर सकती है। gperf एक और उपकरण है, लेकिन इसके लिए तारों को संकलित समय पर जाना आवश्यक है (आप एक एसएसओ और लोडिंग संकलित करके इसके आसपास काम कर सकते हैं, लेकिन ओवरकिल की तरह)।

लेकिन स्पष्ट रूप से, मैं कम से कम एक बाइनरी खोज के साथ जाने की कोशिश करता हूं। बस qsort का उपयोग करके सरणी को सॉर्ट करें, फिर bsearch (या अपना स्वयं का रोल करें) के साथ खोजें। सी 8 9 के बाद से वे दोनों stdlib.h का हिस्सा हैं।

+1

वे एएनएसआई सी (सी 8 9) में भी उपलब्ध हैं। –

+0

दाएं। निश्चित नहीं है कि मैंने लिनक्स मैन पेज पर क्यों देखा जब मेरे पास बीएसडी उपलब्ध है। :) –

+0

अच्छा कॉल, धन्यवाद प्रति। मैं समस्या को जितना आवश्यक था उससे ज्यादा जटिल बना रहा था। – Cheeso

4

यदि एक बेवकूफ (मुझे लगता है कि आप रैखिक हैं) दृष्टिकोण 100 प्रविष्टियों के लिए ठीक है (इसलिए 50 तुलना औसत पर की जाती है) तो एक बाइनरी खोज 100,000 प्रविष्टियों के लिए पर्याप्त से अधिक होगी (इसमें अधिकतम 17 तुलनाएं होती हैं)।

तो मैं हैश के साथ परेशान नहीं होगा लेकिन स्टार्टअप पर अपनी स्ट्रिंग टेबल को सॉर्ट करने का प्रयास करता हूं (उदाहरण के लिए qsort का उपयोग करके) और बाद में प्रविष्टियों को देखने के लिए बाइनरी खोज (उदा। bsearch का उपयोग करके) का उपयोग करना।

0

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

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

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