O (n) ile yapabilirim. Cevabı istediğinde bana haber ver. Unutmayın, diziyi sıralama olmadan bir kez taramayı içerir, vb ... Ayrıca eklemenin değişmeliğinden yararlandığını ve hash kullanmadığını, ancak belleği boşa harcadığını belirtmeliyim.
Sistem kullanarak; System.Collections.Generic kullanarak;
/ * Bir arama tablosu kullanarak bir O (n) yaklaşımı vardır. Yaklaşım, değeri, uygun bir meblağ için aday ise, kolayca aranabilen (örneğin, O (1)) bir "bölmede" saklamaktır.
Örneğin,
Dizideki her bir a [k] için, onu basitçe x - a [k] konumundaki başka bir diziye koyarız.
[0, 1, 5, 3, 6, 9, 8, 7] ve x = 9'a sahip olduğumuzu varsayalım
Yeni bir dizi oluşturuyoruz,
indeks değeri
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
SONRA, önemli olan tek değerler, yeni tabloya bir indeksi olanlardır.
Diyelim ki, 9'a veya eşitliğe ulaştığımızda, yeni dizimizin 9 - 9 = 0 indeksine sahip olup olmadığını görürüz. Çünkü içerdiği tüm değerlerin 9'a ekleneceğini biliyoruz (bu nedenle, sadece 1 olasıdır, ancak içinde saklamamız gereken birden çok dizin değeri olabilir).
Yani etkili bir şekilde sonunda yaptığımız şey, dizide yalnızca bir kez hareket etmek zorunda kalmaktır. Ekleme değişmeli olduğundan, tüm olası sonuçları elde edeceğiz.
Örneğin 6'ya geldiğimizde indeksi yeni tablomuza 9 - 6 = 3 olarak alıyoruz. Tablo bu indeks değerini içerdiğinden değerleri biliyoruz.
Bu, esas olarak bellek için hızın değiş tokuşu. * /
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();
}
}
}