С# Попытка использовать BinarySearch для поиска в упорядоченном массиве, чтобы найти все числа в заданном интервалеC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 С# Попытка использовать BinarySearch для поиска в упорядоченном массиве, чтобы найти все числа в заданном интервале

Сообщение Anonymous »

У меня есть задание от профессора: мне нужно выполнить поиск в упорядоченном массиве с помощью BinarySearch и найти индексы всех значений в заданном интервале. Мой текущий подход к проблеме состоит в том, чтобы найти наименьшее значение, соответствующее требованиям, взять его индекс, затем то же самое для самых высоких значений, а после этого просто взять все индексы между этими двумя. Этот подход должен работать, поскольку массив упорядочен по возрастанию. Моя проблема в том, что я не могу заставить работать функцию, которая находит нижнюю границу.
!Редактировать - для решения проблемы. Вместо получения нижней границы я получаю -1, поэтому алгоритм получает все индексы от -1 до верхней границы. Нашего профессора не волнует, реализуем ли мы алгоритм сами, пока мы можем защитить его и понять перед ним. Программа работает нормально, но выдает неверный результат. Вместо того, чтобы предоставлять мне фактические индексы, содержащие все значения, попадающие в этот интервал, он дает мне все индексы от -1 до верхней границы.
!Редактировать -- Моя задача: У меня есть массив температур, и мне нужно написать алгоритм, который при заданном интервале будет возвращать все индексы, содержащие значения, находящиеся внутри этого интервала. Допуск на ошибку составляет 0,9, что означает, что если мой интервал равен [20...25], 19,1 — это нормально, но 19 — нет, по той же логике 25,9 — это нормально, а 21 — нет.
Вот мой код:

Код: Выделить всё

static void Main(string[] args)
{
Random rnd = new Random();
double[] arrNumber = new double[90000000];
for (int i = 0; i < arrNumber.Length; i++)
arrNumber[i] = rnd.NextDouble() * 1000;
Array.Sort(arrNumber);
double[] interval = { 200, 250 };
var time = Stopwatch.StartNew();
int[] index = ExtractInterval(arrNumber, interval);
time.Stop();
TimeSpan timeTaken = time.Elapsed;

Console.WriteLine(timeTaken);
Console.WriteLine(index.Length);

Console.WriteLine(arrNumber[index[0] - 1]);
Console.WriteLine(arrNumber[index.Length]);
Console.ReadLine();
}

static int[] ExtractInterval(double[] arrNumber, double[] interval)
{
double start = interval[0];
double end = interval[1];
List result = new List();
int lowerBound = findLowerBound(arrNumber, start);
int upperBound = findUpperBound(arrNumber, end);

for (int i = lowerBound; i < upperBound; i++)
{
result.Add(i);
}

return result.ToArray();
}

static int findLowerBound(double[] arr, double lowerBound)
{
int low = 0;
int high = arr.Length - 1;

while(low  0.9)
{
high = middle - 1;
continue;
}
if (Math.Abs(arr[middle] - lowerBound) < 0.9)
{
if (Math.Abs(arr[middle - 1] - lowerBound) < 0.9)
{
low = middle - 1;
continue;
}
return middle;
}

}
return -1;
}

static int findUpperBound(double[] arr, double upperBound)
{
int low = 0;
int high = arr.Length - 1;

while (low  0.9)
{
high = middle - 1;
continue;
}
else if (Math.Abs(arr[middle] - upperBound) < 0.9)
{
if (Math.Abs(arr[middle + 1] - upperBound) < 0.9)
{
low = middle + 1;
continue;
}
else
{
return middle;
}
}

}
return -1;
}
Может ли кто-нибудь мне помочь?

Подробнее здесь: https://stackoverflow.com/questions/790 ... to-find-al
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»