मुझे संख्याओं के संयोजन की एक सूची बनाने की आवश्यकता है। संख्या काफी छोटी है इसलिए मैं इसके byte
बजाय उपयोग कर सकता हूं int
। हालाँकि इसे हर संभव संयोजन प्राप्त करने के लिए कई नेस्टेड छोरों की आवश्यकता होती है। मैं सोच रहा था कि क्या मैं करने के बाद एक और अधिक कुशल तरीका है। अब तक का कोड है:
var data = new List<byte[]>();
for (byte a = 0; a < 2; a++)
for (byte b = 0; b < 3; b++)
for (byte c = 0; c < 4; c++)
for (byte d = 0; d < 3; d++)
for (byte e = 0; e < 4; e++)
for (byte f = 0; f < 3; f++)
for (byte g = 0; g < 3; g++)
for (byte h = 0; h < 4; h++)
for (byte i = 0; i < 2; i++)
for (byte j = 0; j < 4; j++)
for (byte k = 0; k < 4; k++)
for (byte l = 0; l < 3; l++)
for (byte m = 0; m < 4; m++)
{
data.Add(new [] {a, b, c, d, e, f, g, h, i, j, k, l, m});
}
मैं कुछ का उपयोग करने पर विचार कर रहा था, BitArray
लेकिन मुझे यकीन नहीं है कि मैं इसे कैसे शामिल कर सकता हूं।
प्रत्येक अनुशंसा के लिए हम आपके अत्यंत आभारी होंगे। वैकल्पिक रूप से, शायद यह सबसे तेज़ तरीका है जो मुझे चाहिए?
त्वरित बिंदुओं की EDIT जोड़ी (और माफी जो मैंने उन्हें मूल पोस्ट में नहीं डाली थी):
- संख्या और उनके क्रम (2, 3, 4, 3, 4, 3, 3 आदि) बहुत महत्वपूर्ण हैं, इसलिए एक समाधान का उपयोग करना जैसे कि LINQ का उपयोग करके जनरेटिंग क्रमांकन में मदद नहीं मिलेगी क्योंकि प्रत्येक 'कॉलम' में मैक्सिमम हैं विभिन्न
- मैं गणितज्ञ नहीं हूं, इसलिए मैं माफी मांगता हूं अगर मैं 'क्रमपरिवर्तन' और 'संयोजन' जैसे तकनीकी शब्दों का उपयोग नहीं कर रहा हूं
- मैं है मैं सिर्फ एक आकर्षित नहीं कर सकते हैं या किसी अन्य एक सूचकांक के आधार पर - एक बार में इन संयोजनों के सभी से पॉप्युलेट करने
- उपयोग करने
byte
की तुलना में उपयोग करना तेज हैint
, मैं इसकी गारंटी देता हूं । यह भी स्मृति उपयोग पर एक बहुत बेहतर है बट्स के बजाय बाइट्स के 67m + सरणियों है - मेरा अंतिम लक्ष्य नेस्टेड छोरों के लिए एक तेज विकल्प की तलाश करना है।
- मैंने समानांतर प्रोग्रामिंग का उपयोग करने पर विचार किया, लेकिन जो मैं हासिल करने की कोशिश कर रहा हूं, उसके पुनरावृत्ति स्वभाव के कारण, मैं इसे सफलतापूर्वक (यहां तक कि
ConcurrentBag
) करने का एक तरीका नहीं खोज सका - हालांकि मैं गलत साबित होने के लिए खुश हूं :)
निष्कर्ष
Caramiriel ने एक अच्छा माइक्रो-ऑप्टिमाइज़ेशन प्रदान किया है जो लूप्स से कुछ समय दूर होता है, इसलिए मैंने उस उत्तर को सही के रूप में चिह्नित किया है। एरिक ने यह भी उल्लेख किया कि सूची को पूर्व-आवंटित करना तेज है। लेकिन, इस स्तर पर ऐसा लगता है कि नेस्टेड लूप वास्तव में ऐसा करने का सबसे तेज़ संभव तरीका है (निराशाजनक, मुझे पता है!)।
यदि आप वास्तव में कोशिश करना चाहते हैं कि मैं किसके साथ बेंचमार्क करने की कोशिश कर रहा था StopWatch
, तो प्रत्येक लूप में 4 तक गिनती के साथ 13 छोरों पर जाएं - जो सूची में लगभग 67m + लाइनें बनाता है। मेरी मशीन (i5-3320M 2.6GHz) पर अनुकूलित संस्करण को करने में लगभग 2.2s का समय लगता है।