2012-05-17 14 views
6

सी # जेनेरिक हैशसेट < टी> खोज प्रदर्शन ओ (1) होना चाहिए, और एक ऑब्जर्वेबल कोलेक्शन < टी का खोज प्रदर्शन ओ (एन) होना चाहिए।सी # हैशसेट <T> खोज प्रदर्शन (एक पर्यवेक्षण चयन <T> की तुलना में)?

मेरे पास बड़ी संख्या में अद्वितीय तत्व हैं, प्रत्येक तत्व में डेटटाइम संपत्ति है जो अद्वितीय नहीं है।

प्रत्येक तत्व अपने डेटटाइम को वापस लौटकर अपने हैशकोड की गणना करता है। गेटहाशकोड()।

अब मैं अपने डेटा का सबसेट प्राप्त करना चाहता हूं, उदा। सभी तत्वों को एक तिथि जो मार्च 2012 से जून 2012 के

var result = from p in this.Elements 
       where p.Date >= new DateTime(2012, 03, 01) && 
         p.Date <= new DateTime(2012, 30, 06 
       select p; 

बीच है, तो मैं 300.000 तत्वों का एक संग्रह पर इस LINQ क्वेरी चलाने है, यह ~ लेता है 25 एमएस 80 तत्वों को देखते हुए सीमा के भीतर हैं वापस जाने के लिए - इससे कोई फर्क नहीं पड़ता कि मैं हैशसेट < टी> या एक पर्यवेक्षण चयन < टी> का उपयोग करता हूं।

यदि मैं मैन्युअल रूप से सभी तत्वों के माध्यम से लूप करता हूं और उन्हें जांचता हूं, तो यह एक ही समय लगता है, ~ 25 एमएस।

लेकिन मुझे दी गई सीमा के भीतर सभी तिथियों के हैशकोड पता है। क्या मेरे हैशसेट < टी> से दिए गए हैशकोड के साथ सभी तत्व प्राप्त करना संभव है? मुझे लगता है कि यह बहुत तेज होगा ...

क्या LINQ क्वेरी को तेज़ करना संभव है? मुझे लगता है कि यह मेरे हैशसेट < टी> की विशेष क्षमताओं का उपयोग नहीं करता है?

+0

क्या प्रत्येक तत्व का हैशकोड इसकी तारीख है? – Jodrell

+0

हैशसेट की कोई विशेष क्षमता नहीं है जो उन तत्वों के कुशल पुनर्प्राप्ति की अनुमति देगी जिनकी तिथि किसी सीमा के भीतर होती है। एक हैशसेट सेट में एक विशेष वस्तु या मान (या नहीं है) के त्वरित निर्धारण की अनुमति देता है। – hatchet

+0

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

उत्तर

4

जैसा कि बताया गया है कि एक हैश सेट निर्धारित करने में बहुत ही कुशल है कि निर्धारित हैश सेट में है या नहीं। आपकी क्वेरी सिर्फ इस तथ्य का उपयोग करती है कि हैशसेट पूरे सेट पर पुनरावृत्ति करने के लिए IENumerable लागू करता है और दिनांक तुलना करता है। यह हैश का उपयोग बिल्कुल नहीं करेगा। यही कारण है कि मैन्युअल तरीका क्वेरी के समान समय लेता है।

आप हैशसेट से हैश पर आधारित तत्व नहीं प्राप्त कर सकते हैं, आप केवल सेट में तत्व के अस्तित्व के लिए परीक्षण कर सकते हैं। एक शब्दकोश है जो आपको चाहिए (यदि ऐसा लगता है कि आप इसे नहीं चाहते हैं)

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

दूसरी बात यह है कि आप समय-समय पर अनुकूलित कर रहे हैं या नहीं। यदि 25ms मैन्युअल रूप से खोजना पर्याप्त तेज़ है तो शायद कोई भी संरचना जो IENumerable लागू करती है वह पर्याप्त होगी। इस मामले में आप अन्य मानदंडों के आधार पर एक चुन सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद। मुझे लगता है कि वर्तमान खोज प्रदर्शन पर्याप्त से अधिक है, मैंने सोचा था कि तत्वों को सीधे अपने हैश कोड द्वारा पुनर्प्राप्त करना संभव हो सकता है, जैसा कि आपने संभव नहीं बताया है। 'हैशसेट ' की निकासी विधि किसी भी "सामान्य" संग्रह द्वारा प्रदान की जाने वाली अधिक निष्पादक है, इसलिए मैं निश्चित रूप से हैशसेट का उपयोग करूंगा। – Ehssan

4

आप सही डेटा संरचना का उपयोग नहीं कर रहे हैं। आपको किसी क्रमबद्ध सूची की तरह कुछ उपयोग करना चाहिए (Date प्रॉपर्टी पर सॉर्ट किया गया) जहां आप श्रेणी की शुरुआत और अंत के लिए बाइनरी खोज सकते हैं।

+2

या एक बाइनरी खोज पेड़ :) – undefined

+0

हां, मैं निश्चित रूप से सॉर्टेडलिस्ट या सॉर्टेडडिशनरी का उपयोग करता हूं, लेकिन मैं नहीं कर सकता - तत्व की 'तिथि' एक अद्वितीय कुंजी नहीं है ... – Ehssan

+0

@EhssanDoust यह तथ्य क्यों है कि तिथि एक शब्दकोश का उपयोग करने से आपको अद्वितीय रोकना है? जब तक कि बराबर विधि सही ढंग से निर्धारित करती है कि 2 उदाहरण बराबर होते हैं और गेटैशकोड हमेशा 2 अलग-अलग वस्तुओं के लिए समान मान देता है यदि उन वस्तुओं के बीच बराबर भी सत्य है, तो यह काम करेगा। –

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