আমি ও (এন) এ এটি করতে পারি। আপনি উত্তর চান যখন আমাকে জানতে দিন। নোট করুন এটিতে কেবল বিনা বাছাই ইত্যাদির সাহায্যে একবারে অ্যারে ট্র্যাভার করা জড়িত ... আমার আরও উল্লেখ করা উচিত যে এটি সংযোজনীয় পরিবহণকে কাজে লাগায় এবং হ্যাশগুলি ব্যবহার করে না কিন্তু স্মৃতিকে অপচয় করে।
সিস্টেম ব্যবহার করে; সিস্টেম.কলেশন.জেনারিক ব্যবহার করে;
/ * একটি ও (এন) পদ্ধতির উপস্থিতি একটি সারণী ব্যবহার করে exists পদ্ধতির মান হ'ল একটি "বিন" -এ সংরক্ষণ করা যা সহজেই দেখা যায় (যেমন, ও (1)) যদি এটি কোনও উপযুক্ত অঙ্কের প্রার্থী হয়।
যেমন,
অ্যারেতে প্রতিটি [কে] এর জন্য আমরা এটিকে সহজভাবে এক্স - এ [কে] অবস্থানে অন্য অ্যারেতে রেখেছি।
ধরুন আমাদের কাছে [0, 1, 5, 3, 6, 9, 8, 7] এবং x = 9 রয়েছে
আমরা একটি নতুন অ্যারে তৈরি করি,
সূচকের মান
9 - 0 = 9 0
9 - 1 = 8 1
9 - 5 = 4 5
9 - 3 = 6 3
9 - 6 = 3 6
9 - 9 = 0 9
9 - 8 = 1 8
9 - 7 = 2 7
তারপরে কেবলমাত্র সেই মানগুলিই নতুন টেবিলে একটি সূচক রয়েছে।
সুতরাং, বলুন যখন আমরা 9 বা সমানতে পৌঁছান তখন আমরা দেখতে পাই যে আমাদের নতুন অ্যারেতে 9 - 9 = 0. সূচক রয়েছে কিনা তা যেহেতু আমরা জানি যে এটিতে থাকা সমস্ত মান 9 যোগ করে দেবে (এই কারণে এটি উল্লেখ করুন যে এটি কেবল সেখানে স্পষ্টই আছে 1 সম্ভাব্য একটি তবে এটিতে আমাদের একাধিক সূচক মান থাকতে পারে যা আমাদের সংরক্ষণ করতে হবে)।
সুতরাং কার্যকরভাবে আমরা শেষ পর্যন্ত কেবল একবার অ্যারের মধ্য দিয়ে যেতে পারি। সংযোজনটি পরিবর্তনমূলক কারণ আমরা সম্ভাব্য সকল ফলাফল দিয়ে শেষ করব।
উদাহরণস্বরূপ, যখন আমরা 6 এ পৌঁছে যাই তখন আমরা আমাদের নতুন টেবিলটিতে সূচিটি 9 - 6 = 3 হিসাবে পাই the যেহেতু সারণীতে সেই সূচকের মান রয়েছে যা আমরা মানগুলি জানি।
এটি মূলত মেমরির জন্য গতি বন্ধ করে দিচ্ছে। * /
namespace sum
{
class Program
{
static void Main(string[] args)
{
int num = 25;
int X = 10;
var arr = new List<int>();
for(int i = 0; i <= num; i++) arr.Add((new Random((int)(DateTime.Now.Ticks + i*num))).Next(0, num*2));
Console.Write("["); for (int i = 0; i < num - 1; i++) Console.Write(arr[i] + ", "); Console.WriteLine(arr[arr.Count-1] + "] - " + X);
var arrbrute = new List<Tuple<int,int>>();
var arrfast = new List<Tuple<int,int>>();
for(int i = 0; i < num; i++)
for(int j = i+1; j < num; j++)
if (arr[i] + arr[j] == X)
arrbrute.Add(new Tuple<int, int>(arr[i], arr[j]));
int M = 500;
var lookup = new List<List<int>>();
for(int i = 0; i < 1000; i++) lookup.Add(new List<int>());
for(int i = 0; i < num; i++)
{
// Check and see if we have any "matches"
if (lookup[M + X - arr[i]].Count != 0)
{
foreach(var j in lookup[M + X - arr[i]])
arrfast.Add(new Tuple<int, int>(arr[i], arr[j]));
}
lookup[M + arr[i]].Add(i);
}
for(int i = 0; i < arrbrute.Count; i++)
Console.WriteLine(arrbrute[i].Item1 + " + " + arrbrute[i].Item2 + " = " + X);
Console.WriteLine("---------");
for(int i = 0; i < arrfast.Count; i++)
Console.WriteLine(arrfast[i].Item1 + " + " + arrfast[i].Item2 + " = " + X);
Console.ReadKey();
}
}
}