using System;
using System.Diagnostics;
using System.Net;
class SSearchTest
{
public int SSearch(int[] x, int t)
{
for (int i = 0; i < x.Length; i++)
{
if (x[i] == t)
{
return i;
}
}
return -1;
}
public int SSearch2(int[] x, int t)
{
int size = x.Length;
// Временно сохраняем последний
int hold = x[size-1];
/* Если последний элемент искомый
* то это нужно проверять сразу
*/
if (hold == t) return size - 1;
x[size - 1] = t;
int i = 0;
while (true)
{
if (x[i] == t) break;
i++;
}
// Восстанавливаем значение последнего
x[size - 1] = hold;
if (i == size-1)
{
return -1;
}
return i;
}
public int SSearch3(int[] x, int t)
{
int size = x.Length;
// Временно сохраняем последний
int hold = x[size - 1];
/* Если последний элемент искомый
* то это нужно проверять сразу
*/
if (hold == t) return size - 1;
x[size - 1] = t;
int i = 0;
while (true)
{
if (x[i] == t) break;
if (x[i + 1] == t) { i += 1; break; }
if (x[i + 2] == t) { i += 2; break; }
if (x[i + 3] == t) { i += 3; break; }
if (x[i + 4] == t) { i += 4; break; }
if (x[i + 5] == t) { i += 5; break; }
if (x[i + 6] == t) { i += 6; break; }
if (x[i + 7] == t) { i += 7; break; }
i += 8;
}
// Восстанавливаем значение последнего
x[size - 1] = hold;
if (i == size-1)
{
return -1;
}
return i;
}
static void Main(string[] args)
{
// Генератор случайных чисел
RandomGenerator gen = new RandomGenerator(2000000);
// Счетчик времени с точностью до наносекунд
Timer timerObj = new Timer(1);
SSearchTest ssearch = new SSearchTest();
// Генерим случайные числа указанного диапазона
int[] numberList = gen.Get(0, 1000000);
int needle = 2; // Число, которое будем искать
// Результат поисков и затраченное время
int res;
double sec;
// Результаты неоптимизированной версии
timerObj.Start(0);
res = ssearch.SSearch(numberList, needle);
sec = timerObj.Get(0);
Console.WriteLine("Res index: {0}, time: {1} seconds", res, sec);
// Результаты оптимизации #1
timerObj.Start(0);
res = ssearch.SSearch2(numberList, needle);
sec = timerObj.Get(0);
Console.WriteLine("Res index: {0}, time: {1} seconds", res, sec);
// Результаты оптимизации #2
timerObj.Start(0);
res = ssearch.SSearch3(numberList, needle);
sec = timerObj.Get(0);
Console.WriteLine("Res index: {0}, time: {1} seconds", res, sec);
}
}