2010-10-28 9 views
5

क्या मैं सी (++) में जांच सकता हूं यदि कोई सरणी प्रत्येक 0 मान या फिर एक ही आकार की एक नई सरणी आवंटित किए बिना memcmp का उपयोग करने के बिना सभी 0 (या झूठी) है।यदि कोई सरणी 0 (या झूठी) है तो क्या मैं सी (++) में जांच सकता हूं?

(myvector.end() == std::find(myvector.begin(), myvector.end(), true)) 

जाहिर है, आंतरिक रूप से, इस पर लूप:

मैं रनटाइम पर मनमाने ढंग से बड़े bitsets है और उस पर कुछ bitflipping करने के लिए

+2

यदि आप 'std :: bitset' का उपयोग कर रहे हैं, तो आप 'none()' विधि का उपयोग कर सकते हैं। http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00263.html#ac224d7f896a9922057d9e14f307b30fd – Arun

+2

क्या कोई कारण है कि यह एक समस्या है क्योंकि मशीन कोड को वैसे भी कम करना होगा – doron

+0

@ अरुणहाहा: मुझे संकलन समय पर एक बिटसेट के लिए आकार निर्धारित करना है, लेकिन मुझे रनटाइम – knittl

उत्तर

4

आप निम्नलिखित शर्त का उपयोग कर सकते bools की एक सरणी कोस रहा हूँ सभी मूल्य

वैकल्पिक (जो वास्तव में लूपिंग से बचना चाहिए) सभी लेखन-पहुंच कार्यों को ओवरराइड करना है, और true को कभी भी अपने वेक्टर में लिखा गया है या नहीं, इसका ट्रैक रखें।

अद्यतन

झूठ नीचे रयान की टिप्पणी ऐसा करने का एक और अधिक मजबूत विधि, एक ही सिद्धांत पर आधारित का वर्णन।

+0

ध्यान रखें कि, ध्वज विश्वसनीय रूप से बता सकता है कि ध्वज झूठी है अगर सरणी में सभी झूठे हैं; अगर ध्वज सत्य है, तो यह विश्वसनीय रूप से बता नहीं सकता है कि सरणी में एक सत्य है या नहीं। यदि ध्वज सत्य है, तो आपको अभी भी यह जांचना होगा कि कोई सत्य है या नहीं। –

+3

एक और परिष्कृत तरीका यह है कि सरणी में कितने 'सत्य' है इसका ट्रैक रखें। यदि आप किसी मान को गलत से गलत में बदल रहे हैं, तो आप इस काउंटर को कम करते हैं, और यदि आप गलत से सत्य को बदल रहे हैं, तो आप काउंटर को बढ़ाते हैं। अन्यथा, यदि आप सच से सच में या गलत से झूठ बोल रहे हैं, तो आप कुछ भी नहीं करते हैं। यदि काउंटर शून्य है तो आप बता सकते हैं कि सरणी सभी झूठी है या नहीं। –

+4

ध्यान में रखना एक बात यह है कि, यदि आप सरणी को बहुत अधिक संशोधित करते हैं और शायद ही कभी "सभी 0" चेक करते हैं और यदि सरणी बहुत बड़ी नहीं है, तो आप काउंटर को संशोधित करने में अधिक समय बर्बाद कर रहे हैं अगर आप सरणी की जांच कर रहे थे। – EboMike

2

यदि यह सॉर्ट नहीं किया गया है, नहीं। आप इसे पूरा करने की योजना कैसे बनायेंगे? आपको यह देखने के लिए हर तत्व का निरीक्षण करना होगा कि यह 0 है या नहीं! memcmp, ज़ाहिर है, हर तत्व की जांच भी करेगा। यह बहुत महंगा होगा क्योंकि यह एक और सरणी भी पढ़ता है।

बेशक, जैसे ही आप एक गैर-0 तत्व हिट करते हैं, आप जल्दी ही बाहर निकल सकते हैं।

आपका एकमात्र विकल्प सिमड का उपयोग करना होगा (जो तकनीकी रूप से अभी भी हर तत्व की जांच करता है, लेकिन कम निर्देशों का उपयोग करके), लेकिन आप आमतौर पर इसे सामान्य सरणी में नहीं करते हैं।

(Btw, मेरा उत्तर मान लिया गया है आप एक सरल स्थिर C/C++ सरणी है। आप सरणी आप किस तरह का है, हम और अधिक विशिष्ट हो सकता है निर्दिष्ट कर सकते हैं।)

+1

+1। मुझे लगता है कि आपके एकमात्र विकल्प के मुताबिक आपके पास अभिन्न प्रकारों की एक संगत सरणी होगी, सिम निर्देशों का उपयोग करना होगा जैसा कि कई तत्वों को एक बार में जांचने के लिए किया गया है। –

0

नहीं, आप के साथ सरणियों तुलना कर सकते हैं memcmp, लेकिन आप स्मृति के ब्लॉक के विरुद्ध एक मान की तुलना नहीं कर सकते।

आप क्या कर सकते हैं सी ++ में एल्गोरिदम का उपयोग करना है, लेकिन इसमें अभी भी एक लूप आंतरिक रूप से शामिल है।

0

आपको पूरी चीज़ पर फिर से शुरू करने की ज़रूरत नहीं है, बस पहले गैर-शून्य मान पर लूपिंग रोकें।

मैं किसी भी तरह की सोच भी नहीं सकते उन्हें एक बारी में निरीक्षण के अलावा अन्य मानों का एक सेट की जांच करने के लिए - आप bool से बड़ा कुछ (__int64 कहते हैं) लेकिन संरेखण के रूप में अंतर्निहित स्मृति जाँच के साथ खेल खेलने सकता है तो एक मुद्दा है ।

संपादित करें: आप सेट बिट्स की एक अलग गिनती रख सकते हैं, और यह जांच सकते हैं कि यह शून्य है। आपको इसके रखरखाव के बारे में सावधान रहना होगा, ताकि एक सेट बिट सेट करने से ++ ऐसा न हो।

1

यदि आप जानते हैं कि यह एक आवश्यकता होगी, तो आप एक डेटा संरचना बना सकते हैं जिसमें एक सरणी (संभवतः गतिशील) और एक गिनती या वर्तमान में गैर-शून्य कोशिकाएं शामिल हैं। स्पष्ट रूप से कोशिकाओं की सेटिंग को सारणीबद्ध किया जाना चाहिए, लेकिन यह ओवरलोडिंग के साथ सी ++ में प्राकृतिक है, और आप सी में एक अपारदर्शी प्रकार का उपयोग कर सकते हैं।

1

इसके बजाय boost::dynamic_bitset का उपयोग करने पर विचार करें। इसमें none सदस्य और कई अन्य std::bitset-जैसे ऑपरेशंस हैं, लेकिन इसकी लंबाई रनटाइम पर सेट की जा सकती है।

+0

मैं बाहरी पुस्तकालयों का उपयोग नहीं कर सकता (और या तो नहीं चाहता) – knittl

+1

@knittl: तो आप कोड को 'boost :: dynamic_bitset' से कॉपी और पेस्ट कर सकते हैं। –

+0

यह एक हेडर-केवल लाइब्रेरी है। आप अपनी प्रोजेक्ट में 'dynamic_bitset' निर्देशिका की प्रतिलिपि बना सकते हैं और अपनी स्रोत फ़ाइल में मुख्य शीर्षलेख शामिल कर सकते हैं। –

1

मान लें कि आपके पास एन तत्व की एक सरणी है, आप आधार वैक्टर के सेट के खिलाफ थोड़ा सा जांच कर सकते हैं।

उदाहरण के लिए, आपके पास 15-तत्व सरणी है जिसे आप परीक्षण करना चाहते हैं।

आप इसे 8-तत्व शून्य सरणी, एक 4-तत्व शून्य सरणी, 2-तत्व शून्य सरणी और 1-तत्व शून्य सरणी के विरुद्ध परीक्षण कर सकते हैं।

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

स्मृति आवंटन की अवधि में और सुधार केवल 8-तत्व सरणी का उपयोग करने के साथ किया जा सकता है क्योंकि 4-तत्व शून्य सरणी केवल 8-शून्य शून्य सरणी का पहला आधा है।

0

Knittl,

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

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

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