मैं इसे O (n) में कर सकता हूं। मुझे पता है जब आप जवाब चाहते हैं। ध्यान दें कि इसमें किसी भी प्रकार की छँटाई के साथ एक बार सरणी का पता लगाना शामिल है, आदि ... मुझे यह भी उल्लेख करना चाहिए कि यह इसके अतिरिक्त की कमनीयता का शोषण करता है और हैश का उपयोग नहीं करता है लेकिन स्मृति को बर्बाद करता है।
सिस्टम का उपयोग; System.Collections.Generic का उपयोग कर;
/ * एक O (n) दृष्टिकोण लुकअप तालिका का उपयोग करके मौजूद है। दृष्टिकोण एक "बिन" में मूल्य को संग्रहीत करना है जिसे आसानी से देखा जा सकता है (जैसे, ओ (1)) यदि यह एक उपयुक्त राशि का उम्मीदवार है।
जैसे,
सरणी में प्रत्येक [k] के लिए हम इसे स्थान x - [a] पर दूसरे सरणी में रखते हैं।
मान लीजिए हमारे पास [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. के रूप में सूचकांक प्राप्त करते हैं, क्योंकि तालिका में उस सूचकांक मान होता है जिसे हम मूल्यों को जानते हैं।
यह अनिवार्य रूप से मेमोरी के लिए गति को बंद कर रहा है। * /
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();
}
}
}