सी

2010-04-28 10 views
5

में एक सरणी (बनाम लिंक्ड सूची) हैशटेबल कार्यान्वयन की तलाश में है, मैं सी में हैशटेबल कार्यान्वयन की तलाश में हूं जो लिंक की सूचियों के बजाय अपनी वस्तुओं को (twodimensional) arrays में संग्रहीत करता है। यानी अगर टकराव होता है, तो टक्कर पैदा करने वाली वस्तु को सिर पर धक्का देने और लिंक की गई सूची के पहले तत्व की बजाय अगली मुक्त पंक्ति अनुक्रमणिका में संग्रहीत किया जाएगा।सी

प्लस, ऑब्जेक्ट्स को पॉइंटर्स द्वारा संदर्भित करने के बजाय, हैशटेबल में कॉपी किया जाना चाहिए। (वस्तुएं कार्यक्रम के पूरे जीवनकाल के लिए नहीं रहती हैं लेकिन तालिका करता है)।

मुझे पता है कि इस तरह के कार्यान्वयन में गंभीर दक्षता की कमी हो सकती है और यह "हैशिंग का मानक तरीका" नहीं है, लेकिन जैसा कि मैं एक बहुत ही विशेष प्रणाली-वास्तुकला पर काम करता हूं, मुझे उन विशेषताओं की आवश्यकता होती है।

धन्यवाद

+5

चूंकि आपके पास इसके कार्यान्वयन के लिए ऐसी असामान्य और विशिष्ट आवश्यकताएं हैं, इसलिए मैं आपका सर्वश्रेष्ठ शॉट इस तरह के कार्यान्वयन को लिखना चाहता हूं। –

+0

+1, फिर भी एक दिलचस्प सवाल है। –

उत्तर

6

एक सुपर सरल कार्यान्वयन:

char hashtable[MAX_KEY][MAX_MEMORY]; 
int counts[MAX_KEY] = {0}; 

/* Inserting something into the table */ 
SomeStruct* some_struct; 
int hashcode = compute_code(some_struct); 
int size = sizeof(SomeStruct); 
memcpy(hashtable[hashcode] + counts[hashcode] * size, some_struct, size); 
++counts[hashcode]; 

MAX_MEMORY के खिलाफ जांच करने के लिए मत भूलना।

+0

वाह, कभी भी एक दृष्टिकोण के बारे में सोचा नहीं था (और सुंदर :)), अगर मैं इसमें कुछ कार्यक्षमता जोड़ता हूं, तो यह वास्तव में काम कर सकता है। आपका बहुत बहुत धन्यवाद! – kingusiu

1

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

+0

डायनामिक मेमोरी आवंटन की अनुमति है, लेकिन सिस्टम एक मल्टीकोर-आर्किटेक्चर है जो साझा डेटा को * संगत * मेमोरी में संग्रहीत किया जाता है, इसलिए सबसे अच्छा काम करता है, इसलिए मैं सरणी का उपयोग करना चाहता हूं। अधिकतम अपेक्षित टकराव की गणना करने के लिए एक अच्छा संकेत है, धन्यवाद! – kingusiu

+0

@kingusiu: एक सामान्य लिंक्ड सूची हैश चेन आपके लिए काम कर सकती है यदि आप इसे पूल आवंटक के साथ एक साथ रखते हैं, ताकि सभी वस्तुओं को एक संयुक्त पूल से आवंटित किया जा सके। आगे और पीछे के लिंक को पॉइंटर्स भी नहीं होना चाहिए - वे सिर्फ पूल इंडेक्स हो सकते हैं। – caf

0

यह सी में नहीं है लेकिन सी ++ में है, लेकिन Google Sparse Hash पर एक नज़र डालें - आपको कुछ विचार दे सकते हैं। मुख्य आवश्यकता यह है कि संग्रहीत वस्तु null होने का एक तरीका है।