Поиск в Array
Код:
int arr=new int[10]
[COLOR="Red"]1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50[/COLOR]
Мне нужно реализовать поиск по значениям, а если такого значения нет в массиве, чтоб возвращал ближайший. Поясняю:
Код:
Ищем значение 5 - находим (у него индекс 1)
Ищем значение 1 - находим (у него индекс 0)
Ищем значение 15 - находим (у него индекс 3)
Ищем значение 25 - находим (у него индекс 5)
Ищем значение 40 - находим (у него индекс 8)
Ищем значение 41 - [COLOR="#ff0000"]не находим[/COLOR], возвращаем идекс 8 (значение 40), так как оно ближе всех по значению.
Ищем значение 19 - [COLOR="#ff0000"]не находим[/COLOR], возвращаем идекс 4 (значение 20), так как оно ближе всех по значению.
Ищем значение 1 - находим (у него индекс 0)
Ищем значение 15 - находим (у него индекс 3)
Ищем значение 25 - находим (у него индекс 5)
Ищем значение 40 - находим (у него индекс 8)
Ищем значение 41 - [COLOR="#ff0000"]не находим[/COLOR], возвращаем идекс 8 (значение 40), так как оно ближе всех по значению.
Ищем значение 19 - [COLOR="#ff0000"]не находим[/COLOR], возвращаем идекс 4 (значение 20), так как оно ближе всех по значению.
for и foreach использовать нельзя, потому что массив огромный.
Массив сортирован? Если да, то можно "вилкой".
Насколько я понял, массив отсортирован. Используйте бинарный поиск.
Массив отсортирован. А можете пример написать?
Цитата: infolex
Массив отсортирован. А можете пример написать?
http://ru.wikipedia.org/wiki/Двоичный_поиск
http://www.languagec.info/bin_poisk.php
http://www.realcoding.net/article/view/1218
В C# уже готовое есть: Array.BinarySearch()
Der Meister, Язык C#.
Цитата: Der Meister
Язык какой?
В C# уже готовое есть: Array.BinarySearch()
В C# уже готовое есть: Array.BinarySearch()
Разобрался. Спасибо:) только не пойму для чего нужен BinarySearch<>
С возвращаемым значением нужно поплясать: если элемент не найден, то index < 0 -> index = ~index и смотрите, какое значение ближе: arr[index] или arr[index - 1] (index <= arr.Length в этом случае).
Для предотвращения боксинга/анбоксинга: BinarySearch<int> обращается к IComparable<int>-составляющей типа, а не к IComparable. Да и вообще, явная типизация всегда лучше, чем приведение объекта к object, ибо может быть верифицирована на этапе компиляции.
Я уже все это сделал. Уже разобрался как он индексы возвращает, и с границами массива тоже разобрался.:)