2015-04-30 4 views
5

पर डेटा संरचना सलाह मैं सी ++ में डेटा संरचना की तलाश में हूं और मुझे सलाह चाहिए।सी ++

1 1.1.1.1 
2 1.1.1.2 
3 1.1.1.3 

4 1.1.2.1 
5 1.1.2.2 
6 1.1.2.3 

7 2.1.1.1 
8 2.1.1.2 

मैं एक डेटा संरचना की जरूरत है उन लोगों के सवालों का जवाब देना:

  1. नोड के group_id क्या है 4
  2. मुझे दे

    मैं नोड्स है, प्रत्येक नोड unique_id और group_id है समूह 1.1.1

  3. से संबंधित अद्वितीय_आईडी की सूची (संभवतः वेक्टर) समूह 1.1
  4. से संबंधित अद्वितीय_आईडी की सूची (शायद वेक्टर) दें
  5. मुझे unique_id की है कि समूह के हैं की सूची (शायद वेक्टर) देना 1

वहाँ एक डेटा संरचना है कि उन सवालों का जवाब कर सकते हैं (डालने और जवाब देने की जटिलता का समय क्या है) है? या मुझे इसे लागू करना चाहिए?

मैं एक उदाहरण की सराहना करता हूं।

संपादित करें:

शुरुआत में

, मैं इस डेटा संरचना का निर्माण करने की जरूरत है। अधिकांश कार्य समूह आईडी द्वारा पढ़ा जा रहा है। सम्मिलन होगा लेकिन पढ़ने के बाद कम होगा।

समय जटिलता स्मृति स्थान

+0

हम यहां कितनी वस्तुएं बात कर रहे हैं, यह किसी भी तरह से टैग किया गया डेटाबेस है जिसका अर्थ है कि संरचना स्मृति में फिट नहीं होगी? – EdChum

+0

हम्म 500 से अधिक नोड्स नहीं। यह स्मृति – user1673206

+0

से संबंधित होना चाहिए: http://stackoverflow.com/questions/13721522/which-stl-container-should-i-use-c वास्तव में आपको पहले वेक्टर का उपयोग करना चाहिए जबतक कि आपको धीमा न हो, जिसका अर्थ प्रोफाइलिंग हो। तो मैं एक नक्शा सुझाता हूं – EdChum

उत्तर

0

मैं इस के लिए एकदम सही डी एस के बारे में सुनिश्चित नहीं कर रहा हूँ से अधिक महत्वपूर्ण है। लेकिन मैं एक मानचित्र का उपयोग करना चाहता हूँ। यह आपको प्रश्न 1 के लिए ओ (1) दक्षता और सम्मिलन ओ (लॉग इन) और हटाने के लिए देगा। यह मुद्दा 2,3,4 प्रश्न के लिए आता है जहां आपकी दक्षता ओ (एन) होगी जहां एन नोड्स की संख्या होगी।

+0

क्षमा करें, आपको मानचित्र के लिए लुकअप, सम्मिलन और हटाने के लिए 'ओ (1) 'कहां मिलता है? – EdChum

+0

कोई भी हैशप आपको लुकअप के लिए ओ (1) देगा क्योंकि आप मूल्य को देखने के लिए कुंजी का उपयोग करेंगे। जब सम्मिलन/हटाने की बात आती है, क्योंकि आप प्रविष्टि के किसी भी क्रम का पालन नहीं कर रहे हैं और हटाने पर तत्वों को स्थानांतरित नहीं कर रहे हैं, तो प्रदर्शन ओ (1) – Pratik

+0

के बहुत करीब होगा क्षमा करें, प्रविष्टि लॉग इन होगी – Pratik

0

लगता है जैसे आपको unique_id और group_id पर दो अलग-अलग इंडेक्स वाले कंटेनर की आवश्यकता है। प्रश्न 1 को पहली इंडेक्स द्वारा संभाला जाएगा, प्रश्न 2-4 दूसरे द्वारा संभाला जाएगा।

हो सकता है, पर सभी की Boost Multi-index Containers Library

3

पहले एक बार देख ले, तो आप तो यह शायद उन्नत डेटा संरचना के साथ नहीं समझ गड़बड़ होगा नोड्स के केवल एक छोटी संख्या है करने के लिए जा रहे हैं। सरल रैखिक खोज पर्याप्त हो सकती है।

अगला, यह SQL के लिए एक अच्छी नौकरी की तरह दिखता है। तो हो सकता है कि यह आपके एप SQLite लाइब्रेरी में शामिल होना एक अच्छा विचार हो। लेकिन अगर आप वास्तव में एसक्यूएल के बिना ऐसा करना चाहते हैं तो यह अभी भी एक अच्छा संकेत है: आपको अपनी सरणी के माध्यम से त्वरित खोज का समर्थन करने के लिए दो इंडेक्स पेड़ की आवश्यकता है। जटिलता (संतुलित पेड़ों का उपयोग करते हुए) सभी परिचालनों के लिए लॉगरिदमिक होगा।

+0

हाय, आपके उत्तर के लिए धन्यवाद । पेड़ 2,3,4 प्रश्न का उत्तर कैसे देंगे? – user1673206

+0

@userd बस SQL ​​'LIKE (' 1% ')' कामों की तरह। यहां सरल संख्याओं की खोज के विपरीत हर दूसरे अंक कम उप-खोज में खोज को कम कर देता है। डेटा सूची खोजने के लिए आपको बाईं ओर के पत्ते से शुरू होने वाले _subtree_ के माध्यम से पार करने की आवश्यकता होती है और दाएं कोने में समाप्त होता है (आमतौर पर गति डीबीएमएस अतिरिक्त लिंक्ड सूची का उपयोग करता है, यह कि प्रत्येक पेड़ नोड में भी अगली/पिछली पॉइंटर्स होती है)। – Matt

+0

@ user4419802 - बस जागरूक रहें कि LIKE (...) बहुत महंगा है और यह आपके सभी इंडेक्स उपयोगों को पेंच कर देगा ... डीबी ठीक है, लेकिन कनेक्ट स्तर स्टेटमेंट पर एक नज़र डालें। –

2

निर्भर करता है ...

आप कितनी बार सम्मिलित करते हैं? या आप ज्यादातर पढ़ते हैं? आईडी या ग्रुपआईडी द्वारा आप कितनी बार एक्सेस करते हैं?

अधिकतम 500 नोड्स के साथ मैं उन्हें एक साधारण Vector में रखूंगा जहां आईडी सरणी में ऑफसेट है (यदि आईडी वास्तव में दिखाए गए हैं)। समूह-खोज को सरणी पर पुन: स्थापित करके और आंशिक gtroup-ids की तुलना करके लागू किया जा सकता है।

यदि यह बहुत महंगा है और आप वास्तव में strcuture एक बहुत पहुँच सकते हैं और बहुत ही उच्च प्रदर्शन की जरूरत है, या आप आवेषण का एक बहुत मैं ईद के लिए एक HashMap के साथ एक tree लागू करेगा है।

यदि डेटा डेटाबेस में संग्रहीत किया जाता है तो आप SELECT/ CONNECT का उपयोग कर सकते हैं यदि आपके सिस्टम इसका समर्थन करते हैं और सीधे डीबी से जानकारी पूछते हैं।

एक स्पष्ट जवाब नहीं दे रहा है, लेकिन समाधान समूह आईडी एक वृक्ष संरचना के लिए कहता है की तरह भी कई कारकों ;-)

+0

हाय, धन्यवाद, मैंने अपने प्रश्न में एक संपादन जोड़ा। – user1673206

+0

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

5

मेरे लिए, श्रेणीबद्ध डेटा पर निर्भर करता है के लिए खेद है। (मुझे लगता है कि 500 ​​तत्वों के लिए यह वास्तव में जरूरी नहीं है, लेकिन यह प्राकृतिक और स्केल अच्छी तरह से लगता है।)

पेड़ के पहले दो स्तरों में प्रत्येक तत्व केवल वैक्टर (यदि वे आदेश आते हैं) या मानचित्र (यदि वे उप-आदेशित होते हैं) उप-आईडी के।

पेड़ पदानुक्रम में तीसरा स्तर पॉइंटर्स को पत्तियों को फिर से एक वेक्टर या मानचित्र में रखेगा, जिसमें चौथा समूह आईडी भाग और अद्वितीय आईडी शामिल है।

प्रश्न 2-4 पेड़ पर नेविगेट करके आसानी से और जल्दी उत्तर दिया जाता है।

प्रश्न के लिए 1 को पेड़ में पत्तियों को छोड़ने के लिए अद्वितीय आईडी से अतिरिक्त मानचित्र की आवश्यकता होती है; पेड़ में डाले गए प्रत्येक तत्व में मानचित्र में डालने के लिए एक सूचक भी होता है।