আমার সংখ্যার সংমিশ্রনের একটি তালিকা তৈরি করা দরকার। সংখ্যার বেশ ছোট, তাই আমি ব্যবহার করতে পারেন 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
কথা ভাবছিলাম তবে আমি কীভাবে এটি যুক্ত করতে পারি তা নিশ্চিত নই।
যে কোনও সুপারিশ প্রশংসিত হবে। বিকল্পভাবে, সম্ভবত এটি আমি যা চাই তা করার দ্রুততম উপায়?
দ্রুত পয়েন্টগুলির যুগল সম্পাদনা করুন (এবং ক্ষমাপ্রার্থী আমি এগুলি মূল পোস্টে রাখি না):
- তাদের সংখ্যা এবং ক্রম (2, 3, 4, 3, 4, 3, 3 ইত্যাদি) খুব গুরুত্বপূর্ণ, সুতরাং লিনকিউ ব্যবহার করে পারমুটেশন জেনারেট করার মতো সমাধান ব্যবহার করা উপকারে আসবে না কারণ প্রতিটি 'কলামে' সর্বাধিক হয় বিভিন্ন
- আমি গণিতবিদ নই, তাই আমি যদি 'ক্রমীকরণ' এবং 'সংমিশ্রণের' মতো প্রযুক্তিগত পদটি সঠিকভাবে ব্যবহার না করি তবে আমি ক্ষমা চাইছি :)
- আমি না আমি শুধু একটা দখল করতে পারবে না বা অন্য একটি সূচক উপর ভিত্তি করে - একবারে এই সমাহারের সব পূরণ করতে প্রয়োজন
- ব্যবহার
byte
করা ব্যবহারের চেয়ে দ্রুততরint
, আমি এটির গ্যারান্টি দিচ্ছি । ইনটগুলির চেয়ে 67 মিটার + অ্যারে বাইট থাকা মেমরির ব্যবহারে এটি আরও অনেক ভাল - আমার চূড়ান্ত লক্ষ্য এখানে নেস্টেড লুপগুলির জন্য একটি দ্রুত বিকল্পের সন্ধান করা।
- আমি সমান্তরাল প্রোগ্রামিং ব্যবহার করে বিবেচনা করেছি, তবে আমি যা অর্জন করতে চাইছি তার পুনরাবৃত্ত প্রকৃতির কারণে, আমি এটি সফলভাবে করার জন্য কোনও উপায় খুঁজে পাইনি (এমনকি
ConcurrentBag
) - তবে আমি ভুল প্রমাণিত হতে পেরে আনন্দিত :)
উপসংহার
ক্যারামিরিল একটি ভাল মাইক্রো-অপ্টিমাইজেশন সরবরাহ করেছে যা লুপগুলি থেকে কিছুটা সময় শেভ করে, তাই আমি সেই উত্তরটিকে সঠিক হিসাবে চিহ্নিত করেছি। এরিক আরও উল্লেখ করেছেন যে তালিকাটি প্রাক-বরাদ্দ করা আরও দ্রুত। তবে, এই পর্যায়ে দেখে মনে হচ্ছে নেস্টেড লুপগুলি আসলে এটি করার দ্রুততম উপায় (হতাশাজনক, আমি জানি!)।
আমি ঠিক কী দিয়ে আমি বেঞ্চমার্ক করার চেষ্টা করছিলাম তা চেষ্টা করতে StopWatch
চাইলে প্রতিটি লুপের 4 টি পর্যন্ত 13 টি লুপ গণনা করুন - যা তালিকায় প্রায় 67 মিটার + লাইন তৈরি করে। আমার মেশিনে (i5-3320M 2.6GHz) অপটিমাইজড সংস্করণটি করতে প্রায় 2.2 সেকেন্ড লাগে।